- 03 Dec, 2025
새벽 2시, 라이브 버그 대응 중인 QA 엔지니어의 혼잣말
새벽 2시, 라이브 버그 대응 중인 QA 엔지니어의 혼잣말 배포 완료 30분 후 새벽 1시 40분. 배포 완료. 슬랙에 '배포 완료' 메시지 올라왔다. CTO가 이모지 달았다. 개발팀장도 '수고하셨습니다' 남겼다. 난 아직 퇴근 못 한다. 모니터링이 남았다. 최소 1시간. 이게 QA의 숙명이다.센트리 대시보드 켜놨다. 파이어베이스 크래시리틱스도 띄웠다. 찰스 프록시 돌리고, 테스트 계정으로 주요 플로우 돌린다. 로그인. 메인 화면. 상품 검색. 장바구니. 결제. 다 정상이다. 응답 속도도 괜찮다. 여자친구한테 카톡 왔다. "아직 일해?" 읽씹했다. 지금은 집중해야 한다. 새 버전 설치한 유저가 1200명 넘었다. 크래시 0건. 좋다. 이대로 가자. 커피 한 모금. 식었다. 상관없다. 2시 11분, 센트리 알람 띠링. 센트리에서 알람 왔다. 'NullPointerException in PaymentActivity' 심장 내려앉는다. 결제 화면에서 크래시다. 제일 중요한 곳이다. 빠르게 로그 확인한다. 스택 트레이스 읽는다. at com.company.payment.PaymentActivity.updateUI(PaymentActivity.java:247)247번째 줄. 뭔가 null이다. 문제는 재현이다. 내 폰에선 안 난다. 테스트 계정 5개로 다 해봤다. 전부 정상이다.슬랙에 조용히 메시지 올린다. "결제 크래시 1건 발생했습니다. 재현 중입니다." 1분도 안 돼서 답장 온다. 개발자 '지훈'이다. "어떤 상황에서요?" "파악 중입니다." 센트리 로그 다시 본다. 유저 정보 확인한다.안드로이드 9 갤럭시 S9 신규 가입 유저 결제 수단: 카카오페이카카오페이. 우리가 이번에 추가한 거다. 테스트 계정으로 카카오페이 선택한다. 결제 진행한다. 정상이다. 뭐가 다른 거지. 로그 더 파고든다. 유저 플로우 추적한다. 앱 설치 → 회원가입 → 상품 담기 → 결제 시도 → 크래시 회원가입 직후 바로 결제한 유저다. 테스트 계정은 전부 기존 계정이었다. 신규 가입 플로우로 다시 해본다. 회원가입한다. 카카오 간편가입 쓴다. 상품 담는다. 카카오페이 선택한다. 결제하기 누른다. 앱이 꺼진다. "씨발." 재현됐다. 2시 27분, 핫픽스 회의 슬랙에 '@channel' 멘션 날린다. "결제 크래시 재현 완료. 신규 가입 + 카카오페이 조합에서 발생합니다." 30초 만에 단톡방 난리 났다. 지훈: "지금 코드 확인 중" 팀장: "영향 범위 얼마나 되나요" CTO: "핫픽스 해야 하나" 난 센트리 보고 답한다. "현재까지 크래시 3건. 전부 같은 패턴입니다." 3건. 많지 않다. 하지만 결제다. 한 건도 놓칠 수 없다.지훈이 원인 찾았다. "신규 유저는 포인트 정보가 null인데, 카카오페이 선택하면 포인트 차감 로직이 실행돼요. null 체크 안 했습니다." 간단한 버그다. 하지만 치명적이다. CTO가 결정한다. "핫픽스 갑니다. 지훈님 수정하고, 민수님 검증 부탁드립니다." "네." 지훈이 코드 수정 시작한다. 난 테스트 케이스 정리한다.신규 가입 + 카카오페이 결제 신규 가입 + 신용카드 결제 신규 가입 + 네이버페이 결제 기존 유저 + 카카오페이 결제 포인트 있는 유저 + 카카오페이 결제최소 5가지는 확인해야 한다. 여자친구한테 카톡 보낸다. "미안 오늘 못 갈 것 같아" 읽씹 당한다. 당연하다. 2시 58분, 빌드 나옴 지훈이 수정 완료했다. "빌드 올렸습니다." 바로 다운받는다. 설치한다. 테스트 시작한다. 신규 가입한다. 이메일 아무거나. test_20250601_0258@test.com 상품 담는다. 9900원짜리 테스트 상품. 카카오페이 선택한다. 결제 진행한다. 결제 완료 화면 뜬다. 크래시 없다. "1차 확인 완료. 정상입니다." 나머지 케이스도 돌린다. 신용카드. 네이버페이. 포인트 있는 계정. 포인트 없는 계정. 전부 정상이다. 기존 기능도 확인한다. 리그레션이다. 일반 결제. 쿠폰 적용. 배송지 변경. 장바구니 수정. 20분 걸린다. 다 정상이다. 슬랙에 보고한다. "핫픽스 검증 완료. 배포 가능합니다." 팀장이 답한다. "고생하셨습니다. 바로 배포하겠습니다." 3시 23분, 재배포 완료 배포 완료 메시지 뜬다. 이번엔 조마조마하다. 또 뭐 나오면 어쩌나. 센트리 지켜본다. 크래시리틱스 모니터링한다. 5분 지난다. 알람 없다. 10분 지난다. 여전히 조용하다. 신규 설치 유저 500명 넘었다. 크래시 0건. 가슴 쓸어내린다. 살았다. CTO가 슬랙에 쓴다. "민수님 덕분에 큰 사고 막았네요. 고생 많으셨습니다." 지훈도 쓴다. "민수님 재현 안 해주셨으면 큰일 날 뻔했습니다." 기분은 좋다. 하지만 복잡하다. 이게 칭찬받을 일인가. 배포 전에 못 잡은 게 내 잘못 아닌가. 3시 40분, 퇴근 준비 모니터 끈다. 가방 챙긴다. 사무실 아무도 없다. 지훈도 퇴근했다. CTO도 접속 종료했다. 난 1시간 더 있었다. 마지막까지 확인했다. 엘리베이터 타면서 생각한다. '테스트 케이스에 신규 가입 플로우 추가해야겠다.' '카카오페이 테스트 계정 새로 만들어야겠다.' '다음 스프린트 때 자동화 시나리오에 포함시켜야겠다.' 이게 QA다. 사고 막아도 티 안 난다. 사고 나면 제일 먼저 욕먹는다. 택시 탄다. 기사님이 묻는다. "야근하셨어요?" "네. 급한 일 있었어요." "요즘 젊은 분들 고생 많으시네요." 대답 안 한다. 창밖 본다. 새벽 거리는 조용하다. 편의점 불만 켜져 있다. 핸드폰 본다. 센트리 알람 없다. 크래시 0건 유지 중이다. 여자친구한테 카톡 온다. "조심히 들어와. 내일 저녁은 꼭 같이 먹자." "그래. 미안해." "괜찮아. 고생했어." 고마운 사람이다. 4시 12분, 집 도착 집 도착했다. 샤워한다. 침대에 눕는다. 핸드폰 한 번 더 본다. 센트리 확인한다. 여전히 조용하다. 알람 끈다. 눈 감는다. 내일 출근하면 또 테스트다. 또 버그 찾는다. 또 재현한다. 반복이다. 끝없는 반복이다. 근데 이상하다. 싫지 않다. 버그 잡았을 때 쾌감. 사고 막았을 때 안도감. 이게 날 버티게 한다. 'QA는 아무나 하는 거 아니다.' 스스로 되뇌인다. 눈 감힌다. 의식 꺼진다. 내일 또 싸운다. 버그랑.새벽 핫픽스 끝나고 집 가는 택시 안, '오늘도 살았다' 생각했다.
- 02 Dec, 2025
제 PC에선 안 그러는데요? - 개발자와의 영원한 신경전
제 PC에선 안 그러는데요? - 개발자와의 영원한 신경전 이 말을 들으면 심장이 철렁한다. 버그 리포트 올렸다고 개발팀 슬랙 채널에 댓글 달면, 정확히 이 말이 돌아온다. 매번이다. 정말 매번이다. 어제도 마찬가지였다. 로그인 화면에서 비밀번호 입력 후 뒤로가기 버튼 누르면 앱이 크래시 되는 버그를 찾았다. 갤럭시 S21, 안드로이드 12, 특정 네트워크 환경에서만 재현됐다. 재현 스텝 6줄, 스크린샷 3장, 로그 파일까지 첨부했다. 서툴지 않다고 생각했다. 개발자 김인호가 답했다. "어? 제 PC에선 안 그러는데요? 그리고 저 버튼 눌러본 적도 없는데 왜 누르시는 거예요?" 이게 뭐 하는 말이야.재현 못 하는 버그의 무력함 문제는 간단해 보이는데 복잡하다. 나는 진짜 버그를 찾은 거다. 스크린샷도 있고, 재현 스텝도 명확하고, 로그에도 에러 메시지가 떴다. 근데 개발자 PC에선 안 나온다. 이게 뭐 하는 일인가.처음엔 이게 일반적인 일인 줄 몰랐다. 신입 때는 모든 버그가 재현되는 줄 알았다. 테스트 케이스 만들고, 실행하고, 버그 나오고, 개발자가 고치고 끝. 그렇게 단순할 줄 알았다. 하지만 QA 4년차인 지금 안다. 재현 못 하는 버그가 더 많다는 걸. 이게 진짜 일이구나. 이게 진짜 스트레스구나. 재현 못 하면 뭐가 되냐? 버그 등록도 애매해진다. Jira에 어떻게 쓸까. "확인 됨? 미확인? Known Issue? Needs More Information?" 이것도 고민이다. 개발자는 Needs More Information이라고 달면서 나한테 더 자세한 정보를 달라고 한다. 근데 더 뭘 주지. 내가 이미 다 줬는데. 배포 이후 사용자한테서 버그 리포트 들어오면 더 답답하다. "사용자가 보고한 버그를 재현 못 했습니다"라고 개발팀에 보고하면, 그럼 뭐하냐는 눈빛으로 본다. 너희 QA는 뭐 해주는 건데, 재현도 못 했어? 내가 뭐를 해야 하는 거다.환경 변수의 악마 이 모든 게 환경 때문이다. 개발자가 쓰는 PC와 테스트 기기, 사용자 폰이 다르다. 네트워크 상태도 다르고, 안드로이드 버전도 다르고, 제조사별 커스텀도 다르다. 심지어 캐시 상태, 저장소 용량, 백그라운드에 돌고 있는 앱까지도 영향을 준다. 나는 이 모든 걸 고려해서 테스트한다. 갤럭시, LG, 삼성, 소니 폰. 안드로이드 8부터 13까지. Wi-Fi, 4G, 5G, 약한 신호 상태. 특정 앱이 백그라운드에서 돌 때. 저장소 용량이 거의 없을 때. 화면 회전. 다크모드. 폰트 크기 조정. 접근성 옵션 활성화. 개발자는 주로 최신 Mac에서 에뮬레이터로 테스트한다. 깔끔한 환경. 캐시도 없고, 다른 앱도 거의 없고, 저장소는 충분하다. 그 환경에선 안 나온다. 당연하지. "제 PC에선 안 그러는데요"라는 말은 사실 말이다. 진짜 안 나온다. 내가 거짓말하는 게 아니고, 개발자가 거짓말하는 것도 아니다. 그냥 환경이 다르다.근데 이 말을 들으면 진짜 화난다. 왜? 왜냐하면 내가 하는 일을 폄하하는 것처럼 들리기 때문이다. "너네 테스트가 이상한 거 아니야? 내가 개발한 코드는 완벽한데 너네 환경에서만 문제 나는 거지 뭐"라는 뉘앙스다. 아니다. 사용자들이 다양한 환경에서 쓴다. 그게 내가 테스트하는 이유다. 개발자가 완벽하게 만든 코드도, 사용자 환경에서는 문제가 날 수 있다. 그 문제를 먼저 찾아주려고 나는 여기 앉아 있는 거다.버그인지 스펙인지 헷갈릴 때 어제 또 다른 버그가 올라왔다. 이번엔 결제 화면에서 상품 개수를 99개까지 조정할 수 있는데, 100개를 넘어가는 경우를 테스트했다. EditText에 직접 100을 입력할 수 있었다. 이게 버그인가? 스펙인가? 나는 버그라고 생각했다. 일반적으로 상품 개수는 최대 99개까지만 가능하게 UI를 제한한다. 그런데 여기선 뭔가 숨을 쉴 수 있는 구멍이 있었다. 이걸 막아야 한다고 생각했다. 개발자는 달랐다. "아, 그건 스펙이에요. 관리자를 위해서 100개 이상도 가능하도록 열어뒀어요." 처음 들었다. 그런 스펙은 어디에 있나. 요구사항 문서엔 없다. 기획서엔 없다. 슬랙 채널 어딘가에 있나? 아니다. 개발자가 임의로 정한 것 같다.이게 QA의 제일 어려운 부분이다. 버그인지 스펙인지 판단하는 거. 개발자들은 스펙이라고 하면 일단 스펙인 거고, 버그는 버그인 거다. 근데 스펙이 명확하지 않으면 어떻게 하나. 나는 기획팀에 물어본다. 기획팀도 처음 본다고 한다. 그럼 개발자한테 다시 물어본다. "어디서 이 스펙이 나왔어요?" "아, 제가 임의로 추가했어요." 그럼 버그지 뭐. 하지만 이미 개발된 상태다. 다시 고치려면 리뷰도 해야 하고, 테스트도 다시 해야 한다. 번거롭다. 보통 "일단 Known Issue로 두고 다음 버전에서 수정하자"고 된다. 근데 다음 버전에서도 안 고쳐진다.신뢰를 만드는 방법 그런데 정말로 일 잘하는 QA와 개발자의 팀은 다르다. 신뢰가 있는 팀 말이다. 우리 팀에는 테스트리드 박수진이가 있다. 3년 전에 들어온 사람인데, 지금은 거의 QA 리더 역할을 한다. 그 사람이 버그를 올리면 개발자들이 다르다. 바로 확인한다. 재현 못 했어도 "확인해볼게"라고 한다. 왜? 박수진이의 버그 리포트는 정확하기 때문이다. 박수진이의 비결을 봤다. 첫째, 버그 재현 스텝이 정말 명확하다. "1단계: 로그인. 2단계: 비밀번호 입력 창에서 복붙 실행. 3단계: 백스페이스로 모두 삭제. 4단계: 뒤로가기 버튼 클릭." 이런 식이다. 복잡한 말은 없다. 둘째, 스크린샷과 로그를 잘 찍는다. 버그가 나타나는 정확한 순간의 스크린샷. 그리고 logcat에서 관련 에러 메시지만 추출해서 코드 스니펫처럼 첨부한다. 셋째, 개발자를 존중한다. 버그를 올릴 때도 "혹시 제 테스트 환경 문제일 수도 있지만"이라고 시작한다. 그리고 개발자가 "제 PC에선 안 그러는데요"라고 해도, 바로 함께 재현해본다. 개발자 PC에도 설치해보고, 개발자 환경에 맞춰서 테스트한다. 그러다 보니 "아, 이 환경에서만 나오네요"라고 발견하거나, 때론 정말로 내 환경 문제인 걸 알 수도 있다. 그럼 개발자들이 박수진이를 다르게 본다. "수진아, 버그 올려줄래? 너 올린 건 믿고 가"라고 한다. 심지어 개발자들이 자기 코드에 자신 없으면 박수진이에게 먼저 테스트해달라고 부탁한다. [IMAGE_4] 나도 그렇게 하려고 한다. 근데 정말 힘들다. 하루에 테스트할 게 너무 많다. 요구사항 문서를 다시 읽고, 개발자들과 미리 회의하고, 재현 스텝을 정리하고... 시간이 없다. 그래도 최근 3개월간 노력했다. 주 1회 개발팀과 테스트 전략 회의를 했다. "이번 스프린트에선 어떤 부분을 집중해서 테스트할까?"라고. 개발자들과 의논해서 고위험 영역을 미리 파악했다. 그 결과 버그 재현율이 올라갔다. 개발자들도 내 버그 리포트를 더 빨리 처리하기 시작했다. 뭐가 달라졌냐? 신뢰다.버그가 안 나오는 게 가장 무서운 일 역설적이지만, QA로서 가장 무서운 건 테스트할 때 버그가 안 나오는 거다. 배포하고 나서 사용자한테서 버그가 들어오는 게 가장 답답하다. 어제는 새로운 결제 모듈을 배포했다. 3주간 매일 테스트했다. 아침 9시부터 저녁 6시까지. 점심시간만 빼고. 결제 프로세스의 모든 경로를 테스트했다. 정상 결제, 결제 실패, 취소, 환불, 네트워크 끊김. 심지어 결제 중에 앱을 강제 종료하고 다시 켜봤다. 결과? 버그 없음. 배포 완료. 그리고 오늘 아침, 사용자 1명이 "결제 후 영수증이 없어요"라고 신고했다. 영수증? 내가 뭘 놓쳤지. 다시 확인해봤다. 오 맞다. 결제 완료 후 영수증 페이지가 없었다. 근데 내가 왜 테스트 안 했지? 요구사항 문서를 다시 읽어봤다. 있다. "결제 완료 후 영수증 페이지 표시"라고. 내가 빠뜨렸다. 나는 결제 성공까지만 확인했다. 그 다음은 테스트하지 않았다. 체크리스트에 없었다. 아니, 있었나? 다시 봐도 없다. 그럼 내가 만드지 않았나? 3주 전 테스트 플랜을 찾아봤다. 아, 있네. 뭔가 했던 메모가. "영수증 페이지 테스트 완료"라고. 그럼 뭐가 문제야. [IMAGE_5] 개발자한테 물었다. "영수증 페이지, 스펙이 변경되지 않았나요?" 개발자가 답했다. "아, 그건 나중에 추가되는 거 아닌가요?" 그게 뭐 하는 소리야. 너가 구현한 기능인데. "몰라요. 정의 안 됐어요." 결국 나 때문이다. 내가 체크리스트에 넣고도 테스트를 빠뜨렸거나, 개발자가 아직 구현하지 않았는데 내가 완료했다고 체크했거나. 둘 다 내 책임이다. 이게 QA의 일이다. 버그를 찾는 것도 일이지만, 버그를 놓치지 않는 게 더 중요한 일이다.다음 주는 또 다른 싸움 내일 또 새로운 빌드가 나온다. 소셜 로그인 기능. 마찬가지로 3주간 테스트할 거다. 체크리스트를 만들었다. 사실 이미 만들어놨다. 지난주에. 테스트 항목: 50개. 테스트 케이스: 150개. 예상 테스트 시간: 30시간. 실제 주어진 시간: 2주. 다시 말해서, 하루에 8시간을 테스트에만 써야 한다. 버그 리포팅, 개발자와의 미팅, 기타 업무는 따로다. 즉, 야근은 필수다. 개발자가 또 말할 거다. "제 PC에선 안 그러는데요." 나는 또 알 거다. 그건 너의 PC가 아니라는 거. 사용자의 환경이 다르다는 거. 그리고 내 일은 그 환경에서 버그를 찾는 거라는 거. 하지만 여전히 답답할 거다. 왜? 왜냐하면 의사소통이 부족하기 때문이다. 스펙이 명확하지 않기 때문이다. 개발자와 나 사이의 신뢰가 완벽하지 않기 때문이다. 그래도 한 가지는 안다. 내가 놓친 영수증 버그가 100명 사용자한테는 영향을 미치지 않았다는 거. 왜? 왜냐하면 1명만 신고했으니까. 즉, 79명의 사용자는 이미 마주쳤는데 신고하지 않았거나, 아직 그 경로를 지나가지 않았을 수도 있다. 최악의 경우, 조용히 앱을 삭제했을 수도 있다. 내가 할 수 있는 건 다음 번엔 더 꼼꼼히 하는 거다.제 PC에선 안 그러는데요 - 그래, 알겠어요 이 말을 들으면 아직도 짜증난다. 하지만 이제는 안다. 이건 싸움이 아니라는 거. 누가 잘못했는지를 판단하는 자리가 아니라는 거. 개발자는 자기 환경에서 코드가 제대로 작동하는 걸 본 거다. 그게 거짓이 아니다. 나는 사용자 환경에서 코드가 제대로 작동하지 않는 걸 봤다. 이것도 거짓이 아니다. 둘 다 진짜다. 그냥 환경이 다른 거다. 그래서 이제는 이렇게 대답한다. "네, 저도 알고 있어요. 그래서 저는 다양한 환경에서 테스트하는 거고, 개발자님은 PC 환경에서 테스트하시는 거예요. 저희가 함께 이 버그를 재현해볼까요?" 그럼 개발자도 다르게 반응한다. "아, 그럼 같이 해볼까요?" 신뢰는 이렇게 만들어진다. 하지만 여전히 밤샘 배포는 무섭고, 영수증 버그 같은 실수는 반복될 거고, 개발자와의 신경전은 계속될 거다. 그게 QA의 일이니까. 내일도 새벽까지 테스트해야 한다. "제 PC에선 안 그러는데요"라는 말을 준비하면서.아, 커피 더 마셔야겠다. 오늘도 길 거 같다. [IMAGE_6]