수요일 오후 2시, 예상 외의 이슈 리포트가 들어왔다

수요일 오후 2시, 예상 외의 이슈 리포트가 들어왔다

수요일 오후 2시

수요일 오후 2시 37분. 슬랙 알림이 울렸다.

“결제 오류 접수 증가 중”

커피를 마시던 손이 멈췄다. 지난주 화요일 배포했던 거다. 5일 전이다.

5일 동안 멀쩡했다. QA 통과했고, 스모크 테스트도 깔끔했다. 모니터링 지표도 정상이었다.

그런데 지금 터졌다.

심장이 쿵 내려앉는 느낌. 이 느낌, 13년 차인데도 익숙해지지 않는다.

개발팀 채널로 들어갔다. 이미 난리였다.

“특정 카드사에서만 발생” “오전부터 접수됐는데 패턴 파악 안 됨” “CS 문의 28건”

28건. 생각보다 많다.

회의실로 갔다. 개발 리드, 기획 리드, 인프라 담당자가 이미 모여 있었다.

“QA에서 이거 케이스 있었나요?”

제일 먼저 날아오는 질문이다. 항상 이 질문이다.

테스트 케이스를 뒤졌다

TestRail 열었다. 결제 관련 케이스 147개.

카드사별 테스트? 있다. 주요 3사는 다 했다.

근데 문제가 생긴 카드사는 점유율 4위다. 우선순위에서 밀렸던 거다.

“시간 부족해서 주요 3사만 했습니다. 리스크 기반으로 우선순위 정했고요.”

내 목소리가 변명처럼 들렸다.

개발 리드가 고개를 끄덕였다. “그럴 수밖에 없죠. 일정이 그랬으니까.”

기획 리드는 아무 말 없이 노트북만 봤다.

이럴 때 제일 답답하다. 욕을 하면 오히려 속이 후련한데, 다들 이해한다는 표정이다.

“원인 파악부터 하겠습니다.”

회의실 나와서 팀원들 불렀다.

“지난주 배포 건, 결제 쪽 다시 체크한다. 4위 카드사 중심으로.”

수진이가 물었다. “전부 다요?”

“응. 전부.”

오후 내내

로그를 뒤졌다. 개발팀이랑 같이.

오후 4시쯤 원인 찾았다. API 타임아웃이었다.

특정 카드사는 응답 시간이 평균 3.2초였다. 다른 카드사는 1.5초.

우리 타임아웃 설정은 3초.

정확히 경계선이었다. 그래서 간헐적으로 터진 거다.

“이거 성능 테스트에서 안 잡혔나요?”

또 이 질문이다.

성능 테스트는 했다. 근데 카드사별로는 안 했다. 외부 API까지 포함한 E2E 성능 테스트는 리소스가 너무 많이 든다.

“타임아웃 3초면 넉넉하다고 판단했습니다. 일반적으로는 맞는 수치고요.”

“근데 이 카드사는 아니었네요.”

”…네.”

개발팀이 핫픽스 준비했다. 타임아웃 5초로 늘리기로.

“오늘 저녁 8시 배포 가능합니다.”

“QA는 얼마나 걸려요?”

민수가 나를 봤다. 나도 민수를 봤다.

“1시간이면 됩니다. 타임아웃 수치만 바뀐 거니까.”

“그럼 7시까지 QA 부탁드려요.”

지금 5시 20분이다.

팀원들한테 미안했다

저녁 약속 있던 애들도 있었을 거다.

수진이는 오늘 일찍 퇴근하려고 했다. 아이 학원 상담이 있다고 했다.

“미안. 오늘 좀 늦어질 것 같아.”

“괜찮아요. 남편한테 연락할게요.”

괜찮을 리가 없다. 근데 다들 괜찮다고 한다.

이게 제일 미안하다.

핫픽스 QA 시작했다. 4위 카드사 중심으로 결제 플로우 전체 체크.

타임아웃 5초로 바뀐 거 확인. 응답 시간 측정. 3.2초, 3.4초, 3.1초. 다 통과한다.

다른 카드사도 영향 없는지 확인. 주요 3사, 전부 체크.

6시 50분. 테스트 완료.

“배포 가능합니다.”

개발 리드가 고맙다고 했다. 경영진한테 보고 올라갔고, 8시 정각에 배포 시작.

8시 30분. 배포 완료.

스모크 테스트. 결제 플로우 전부 정상.

모니터링 지표 확인. 오류율 떨어지기 시작했다.

9시 10분. CS 문의 멈췄다.

퇴근길

10시 넘어서 퇴근했다.

엘리베이터 안에서 민수가 말했다. “팀장님 잘못 아니에요.”

“알아.”

“진짜로요. 저희가 다 한 건 아니지만, 우선순위는 맞게 정한 거잖아요.”

“응.”

근데 가슴 한구석이 답답하다.

우선순위가 맞았다는 건 안다. 리스크 기반 테스트 전략도 맞았다. 주요 3사 커버하면 95% 사용자 포함되는 거다.

근데 나머지 5%는?

집에 와서 남편한테 얘기했다.

“우리가 놓친 거 같아서.”

“시간이 부족했잖아. 네 잘못 아니야.”

“알아. 근데 결국 터진 건 사실이니까.”

남편은 개발자라서 이해한다. 완벽한 테스트는 없다는 거. 시간과 리소스는 한정돼 있다는 거.

근데 이해하는 것과 마음이 편한 건 다르다.

다음 날 아침

목요일 아침. 출근했다.

어제 이슈 포스트모템 회의가 10시에 잡혀 있었다.

회의실에 들어갔다. 개발팀, 기획팀, 인프라팀 전부 모였다.

원인 분석부터 시작했다.

“외부 API 응답 시간 변동성을 충분히 고려하지 못했습니다.”

재발 방지책?

“카드사별 성능 테스트 케이스 추가하겠습니다.” “타임아웃 설정값 리뷰하겠습니다.” “외부 API 의존성 높은 기능은 별도 모니터링 강화하겠습니다.”

CTO가 물었다. “QA 리소스는 충분했나요?”

순간 머뭇거렸다.

”…일정 내에서는 최선을 다했습니다.”

“그게 아니라, 리소스가 충분했냐는 질문입니다.”

“부족했습니다.”

처음으로 솔직하게 말했다.

“카드사별 성능 테스트까지 하려면 최소 3일은 더 필요했습니다. 자동화 인프라도 부족하고요.”

CTO가 끄덕였다. “알겠습니다. 다음 분기 계획에 반영하겠습니다.”

점심시간

팀원들이랑 밥 먹으러 갔다.

수진이가 물었다. “팀장님, 어제 많이 힘들었죠?”

“응. 너도 고생했어. 학원 상담은?”

“남편이 다녀왔어요. 괜찮아요.”

미안했다. 근데 고맙기도 했다.

민수가 말했다. “그래도 우리 빨리 찾았잖아요. 다른 팀이었으면 더 오래 걸렸을 거예요.”

“맞아. 그건 인정.”

점심 먹고 돌아오는 길에 생각했다.

QA의 책임은 어디까지일까.

모든 버그를 다 찾아야 할까? 불가능하다는 거 안다. 근데 버그가 터지면 결국 QA 탓이다.

우선순위를 정해서 테스트한다. 리스크 기반으로. 이게 맞는 방법이다.

근데 우선순위에서 밀린 부분에서 이슈가 터지면?

그것도 QA 책임이다.

오후 회의

오후에 팀 회의 했다.

“어제 건 우리 잘못 아니야. 근데 배울 건 배워야지.”

테스트 전략 다시 짰다.

외부 API 의존성 높은 기능은 별도 체크리스트 만들기로. 타임아웃, 재시도 로직, 에러 핸들링, 전부 명시적으로 확인.

카드사별 테스트는 자동화 목록에 추가. 다음 분기에 구축 목표.

“근데 솔직히 말하면.”

다들 나를 봤다.

“100% 막을 순 없어. 우리가 아무리 잘해도.”

”…알아요.”

“그래도 최선은 다해야지. 그게 우리 일이니까.”

다들 고개 끄덕였다.

저녁 퇴근길

7시에 퇴근했다.

엘리베이터에서 개발 리드 만났다.

“어제 고생했어요.”

“아니에요. 당연한 거죠.”

“품질팀 없었으면 더 큰일 났을 거예요. 빨리 찾아줘서 고마워요.”

고맙다는 말이 위로가 됐다. 근데 동시에 씁쓸했다.

빨리 찾은 게 아니라 애초에 못 찾은 건데.

집에 와서 샤워했다.

거울 보면서 생각했다.

13년 차 QA 팀장. 8명 팀 운영하고, 품질 전략 세우고, 이슈 대응하고.

여전히 버그 하나에 이렇게 마음이 무겁다.

이게 책임감인지 죄책감인지 모르겠다.

아마 둘 다인 것 같다.

금요일 아침

출근했다. 어제 배포한 기능 모니터링 지표 확인했다.

에러율 0.02%. 정상 범위다.

CS 문의도 없다.

안정적으로 돌아가고 있다.

근데 마음이 완전히 편하진 않다.

다음에 또 비슷한 일이 생기면 어떡하지?

그때도 우리가 놓치면?

슬랙에 메시지 왔다. CTO한테.

“QA 자동화 인프라 투자 건, 다음 주 예산 회의에서 논의하겠습니다.”

작은 진전이다.

자동화가 모든 걸 해결해주진 않는다. 근데 최소한 반복 작업은 줄어든다.

그럼 우리는 더 중요한 테스트에 집중할 수 있다.

카드사별 성능 테스트 같은 거.

점심시간에 QA 커뮤니티 게시판 봤다.

비슷한 고민하는 사람들 많더라.

“배포 후 일주일 뒤에 터진 버그, 이거 QA 책임인가요?”

댓글들 읽었다.

“당연히 아니죠. 일주일 동안 멀쩡했으면…” “근데 결국 QA가 해명해야 되더라고요.” “완벽한 테스트는 없어요. 다들 너무 자책하지 마세요.”

자책하지 말라고. 근데 자책하게 된다.

이게 QA의 숙명인가 싶다.

이번 주를 돌아보며

수요일 오후 2시 37분.

그 슬랙 알림 이후로 48시간이 지났다.

이슈는 해결됐다. 재발 방지책도 세웠다. 예산 확보 논의도 시작됐다.

객관적으로 보면 잘 대응한 거다.

근데 여전히 마음 한구석이 불편하다.

“우리가 놓친 게 아닐까?”

이 질문이 머릿속에서 떠나지 않는다.

13년을 일했는데도.

아마 30년을 일해도 똑같을 것 같다.

QA는 그런 일이다. 완벽을 추구하지만 완벽할 수 없는.

모든 버그를 찾으려 하지만 다 찾을 수 없는.

그래도 계속 찾아야 하는.

책임감과 죄책감 사이 어딘가에서 매일 일하는.


다음 주 화요일 배포도 준비해야 한다. 이번엔 더 꼼꼼히 보자.