Showing Posts From

배포

Jira 티켓 200개, 어디부터 시작해야 할까?

Jira 티켓 200개, 어디부터 시작해야 할까?

월요일 아침의 선물 출근했다. Jira 열었다. 미해결 티켓 203개. 금요일에 180개였는데. 주말 사이 23개가 더 생겼다. 핫픽스 배포했다가 새 버그가 나온 거다. 예상했다. 커피 한 잔 마시고 화면을 봤다. P1, P2, P3, P4가 뒤섞여 있다. 어떤 건 상태가 "재확인 필요", 어떤 건 "개발 완료 대기". 정리 안 된 티켓이 반은 넘는다. 팀장이 슬랙 보냈다. "민수야, 이번 주 목표 티켓 30개 처리. 가능하지?" 30개. 하루에 6개씩이다. 재현 시간, 확인 시간, 리포트 작성 빼면 불가능하다. 하지만 "네" 라고 답장했다. 어차피 할 거니까.우선순위라는 이름의 정치 P1부터 봤다. 41개다. 심각도 높음, 긴급 처리. 그런데 진짜 긴급한 건 10개도 안 된다. 나머지는 누군가 급하다고 우긴 것들이다. "로그인 안 됨" - P1 맞다. "프로필 이미지 안 뜸" - P2인데 기획자가 P1 박았다. "특정 기종에서 폰트 이상" - P3이다. 근데 대표님 폰이라서 P1. 우선순위는 기술적 판단이 아니다. 정치다. 개발팀장은 자기 팀 버그는 P3로 낮추고 싶어 한다. 기획팀은 자기가 만든 기능 버그는 P1로 올리고 싶어 한다. 영업팀은 클라이언트가 말한 건 뭐든 P1이다. 결국 내가 판단해야 한다. 실제 사용자 영향도로. 기준을 만들었다. 엑셀에 정리했다. P1 (10개)앱 크래시 핵심 기능 동작 안 함 데이터 손실 가능성 보안 이슈P2 (35개)주요 기능 오작동 특정 기종 크래시 UI 심각하게 깨짐 결제 관련 오류P3 (98개)부가 기능 오류 텍스트 오타 디자인 의도와 다름 특정 상황에서만 재현P4 (60개)개선 제안 극히 드문 케이스 차기 버전 고려 스펙 논의 필요재분류했다. 기획자한테 메신저 왔다. "민수님, 제가 P1 올린 건데요?" "사용자 영향도 낮아서 P2로 조정했습니다." "근데 팀장님이 중요하다고 하셨거든요." "팀장님께 제가 말씀드릴게요." 이런 대화를 5번 했다. 점심 전에.현실적인 처리 계획 10개 P1부터 시작했다. 하지만 순서가 있다. 재현 가능한 것부터다. "특정 조건에서 크래시" - 재현 스텝 불명확. 개발자한테 물어봐야 함. 나중. "로그인 실패" - 바로 재현 가능. 지금. "결제 오류" - QA 서버에서 테스트 가능. 지금. 엑셀에 컬럼 추가했다.재현 가능 여부 예상 소요 시간 의존성 (다른 티켓이나 개발자 답변 필요) 테스트 환경 (Dev/QA/Prod)P1 10개 계획 세웠다.즉시 처리 가능: 4개 (2시간) 개발자 확인 필요: 3개 (대기 후 1시간) 특수 환경 필요: 2개 (내일 오전) 재현 불가: 1개 (리포터 추가 정보 요청)4개부터 시작했다. 첫 번째 버그. 로그인 화면에서 백버튼 누르면 크래시. 재현했다. Charles로 네트워크 확인했다. API 응답은 정상. 앱 로그 확인. Null Pointer Exception. 스크린샷 3장, 로그 파일, 재현 스텝 정리해서 Jira 업데이트. 개발자 assign. 20분 걸렸다. 두 번째 버그. 결제 완료 후 화면 멈춤. 재현 안 됨. QA 서버에서는. Prod에서만 발생한다는 리포트. 운영팀한테 Prod 로그 요청. 대기. 세 번째로 넘어갔다. 효율이다. 막힌 건 넘어가고 진행 가능한 것부터. 하루 종일 한 티켓만 붙잡고 있을 수 없다. 오후 3시. P1 4개 처리했다. P2 시작했다.리소스 관리의 현실 하루에 처리 가능한 티켓 수는 정해져 있다. 단순 계산. 근무 8시간.회의 1시간 점심 1시간 이메일/슬랙 응대 1시간 실제 작업 시간 5시간버그 하나당 평균 소요 시간.재현: 15분 원인 파악: 20분 리포트 작성: 15분 개발자 커뮤니케이션: 10분 총 60분하루 5개가 현실적이다. 근데 예상 밖 변수가 있다.재현 안 되는 버그: +30분 디바이스 세팅 시간: +20분 긴급 이슈 터짐: +1시간 기획 스펙 확인: +30분실제로는 하루 3-4개다. 주 5일이면 15-20개. 팀장이 원하는 30개가 안 된다. 솔직하게 말했다. "30개는 어렵습니다. 현실적으로 20개 목표 잡겠습니다." "왜 안 돼?" "평균 처리 시간이 1시간인데, 예상 외 이슈 대응 시간 빼면 하루 4개가 한계입니다." "야근하면 되지 않아?" "야근해도 집중력 떨어지면 버그 놓칩니다. 그럼 배포 후 더 큰 문제 됩니다." 팀장 표정이 안 좋았다. 하지만 인정했다. "알았어. 20개 목표로 하자." 숫자로 말하니까 통했다. 감정이 아니라 데이터로. 배치의 기술 200개를 20개씩 나눴다. 10주 걸린다. 현실성 없다. 그 사이 새 티켓이 100개는 더 생긴다. 다른 방법이 필요하다. 배치 처리. 비슷한 버그끼리 묶었다. 로그인 관련 (8개)한 번에 테스트 환경 세팅 연속으로 처리하면 컨텍스트 스위칭 없음 2시간 안에 끝결제 플로우 (12개)QA 서버 결제 테스트 계정 필요 한 번에 몰아서 테스트 3시간UI 버그 (25개)디바이스별 확인 스크린샷 찍으면서 체크리스트 2시간특정 기종 이슈 (15개)해당 디바이스 세팅 한 번만 4시간월요일: 로그인 + 회원가입 관련 화요일: 결제 플로우 수요일: UI 버그 집중 목요일: 특정 기종 테스트 금요일: 긴급 이슈 대응 + 정리 효율이 올라갔다. 컨텍스트 스위칭이 줄었다. 테스트 환경 세팅을 반복 안 해도 됐다. 첫 주에 23개 처리했다. 목표보다 3개 더. 커뮤니케이션 비용 버그 처리보다 시간 많이 드는 게 있다. 설명이다. 개발자: "이거 재현 안 되는데요?" 나: "재현 스텝 Jira에 있습니다." 개발자: "그대로 했는데 안 돼요." 나: "화면 공유 해드릴까요?" 개발자: "네." 화면 공유 10분. 재현 보여줌. 개발자: "아 제 빌드가 달라서 그런가 봐요." 나: "..." 이런 일이 하루에 5번. 그래서 리포트 양식 만들었다. [재현 스텝] 1. 앱 실행 2. 로그인 (테스트 계정: qa_test01) 3. 마이페이지 진입 4. 프로필 수정 버튼 탭 5. 닉네임 입력 (20자 이상) 6. 저장 버튼 탭 → 크래시 발생[환경] - 빌드: v2.3.1 (build 451) - OS: Android 13 - 기기: Galaxy S23 - 서버: QA 서버[로그] (첨부)[기대 동작] 닉네임 저장 후 완료 토스트 메시지[실제 동작] 앱 크래시, 재실행 시 닉네임 변경 안 됨[추가 정보] iOS에서는 정상 동작 확인이렇게 쓰니까 "재현 안 돼요" 가 줄었다. 하지만 여전히 질문은 온다. 기획자: "이거 버그예요 스펙이에요?" 나: "스펙 문서에는 A인데 실제는 B입니다." 기획자: "음... 원래 B가 맞는 것 같은데." 나: "그럼 스펙 문서 수정해주세요." 기획자: "네, 근데 이미 개발된 거 바꾸기 애매한데..." 이런 대화 20분. 결론은 "다음 회의 때 논의". 티켓 상태를 "Pending - 스펙 확인 중"으로 바꿨다. 내 할 일 목록에서 뺐다. 안 그러면 계속 신경 쓰인다. 포기의 기술 200개를 다 할 수 없다는 걸 인정했다. P4 60개는 사실상 안 한다. "차기 버전 검토" 라벨 붙이고 백로그로 보냈다. P3 중에서도 "재현 불가" 30개는 "추가 정보 필요" 상태로 리포터한테 돌려보냈다. 1주일 안에 답 안 오면 자동 종료. 실제 처리 대상은 110개. 이것도 많다. 하지만 200개보다 심리적으로 낫다. 팀장한테 보고했다. "P4 60개는 다음 분기로 이관하겠습니다." "왜?" "리소스 대비 사용자 영향도가 낮습니다. 대신 P1, P2를 2주 안에 정리하겠습니다." "음... 알았어." 전부 다 하려고 하면 중요한 것도 못 한다. 포기할 걸 정하는 것도 능력이다. 진행 상황 추적 매일 아침 30분. 엑셀 업데이트했다. [주간 목표] 목표: 20개 완료: 23개 진행중: 5개 블록: 3개[티켓 상태] Open: 176개 (203→176, -27) In Progress: 8개 Pending: 12개 Resolved: 15개 (이번 주)숫자가 보이니까 뿌듯했다. 203에서 176. 한 주만에 27개 줄었다. 물론 새로 생긴 것도 있다. 하지만 처리 속도가 더 빠르다. 팀장한테 주간 리포트 보냈다. 슬랙에 공유했다. 개발팀장이 답했다. "오 민수님 고생 많으시네요." 인정받는 기분. 나쁘지 않다. 자동화의 유혹 P3 중에 반복 작업이 많다. "5개 기종에서 UI 확인" - 30분씩 5번, 2시간 반. "20개 화면 레이아웃 체크" - 1시간. 자동화하면 30분으로 줄어든다. 문제는 자동화 스크립트 짜는 데 5시간 걸린다는 거다. 계산했다. 이 테스트를 앞으로 10번 이상 할 거면 본전이다. UI 회귀 테스트는 매 배포마다 한다. 2주에 한 번. 1년이면 26번. 투자 가치 있다. 퇴근 후 집에서 Appium 튜토리얼 봤다. 2시간. 간단한 스크립트 짰다. 5개 화면 자동 캡처. 1시간 걸렸다. 아직 완벽하지 않다. 하지만 시작했다. 다음 주부터 하나씩 자동화 케이스 늘리기로 했다. 실전 팁 200개 티켓 앞에서 멘붕 안 오려면. 1. 일단 분류부터 우선순위 재조정. 30분 투자해서 전체 보기. 2. 배치 처리 비슷한 것끼리 묶어서. 컨텍스트 스위칭 줄이기. 3. 블로킹 이슈 따로 관리 진행 안 되는 건 Pending 처리. 내 리스트에서 빼기. 4. 매일 목표 작게 하루 5개. 달성 가능한 숫자. 5. 숫자로 추적 엑셀이든 뭐든. 진행 상황 시각화. 6. 커뮤니케이션 효율화 리포트 템플릿. 반복 질문 줄이기. 7. 포기할 것 정하기 P4는 과감히 백로그로. 집중력 분산 방지. 8. 자동화 조금씩 반복 작업부터. 5시간 투자해서 20시간 아끼기. 한 달 후 4주 지났다. Jira 티켓 128개. 203에서 75개 줄었다. 물론 새로 생긴 것도 있다. 하지만 관리 가능한 수준이다. 팀장이 말했다. "민수야, 이번 달 티켓 처리율 좋던데?" "네, 배치 처리 방식 바꿔서요." "다른 팀원들도 좀 공유해줘." 오후에 팀 회의. 내 방법 설명했다. 15분. 신입 QA가 물었다. "그럼 우선순위는 누가 정해요?" "우리가 정해야죠. 사용자 영향도 기준으로." "근데 기획팀에서 P1 올리면요?" "데이터로 설명하세요. 사용자 몇 명한테 영향 가는지, 얼마나 자주 발생하는지." 신입이 고개 끄덕였다. 회의 끝나고 슬랙에 정리 문서 공유했다. 내가 쓴 엑셀 템플릿이랑 우선순위 기준표. 3명이 따봉 달았다.티켓은 계속 쌓인다. 하지만 이제 안다. 전부 다 할 필요 없다는 걸. 중요한 것부터, 효율적으로, 숫자로 증명하면서. 그게 프로고 살아남는 방법이다.

금요일 오후 5시 59분, 배포 요청이 들어왔다

금요일 오후 5시 59분, 배포 요청이 들어왔다

5시 59분 금요일 오후 5시 59분. 슬랙이 울렸다. "민수님, 급한 배포 건이 있어서요. 월요일 아침까지 올려야 해요." 기획팀 김과장이다. 배포는 내일 토요일 오전 10시래. 내일. 10시. 지금부터 15시간.무슨 변경인데 "어떤 기능이요?" "결제 플로우 일부 수정이요. UX 개선." 결제. 플로우. 가장 건드리면 안 되는 부분이다. "스펙 문서 있어요?" "아, 지금 정리 중이에요. 30분 뒤에 드릴게요." 30분. 6시 30분이면 된다는 거다. 개발은 언제 끝나냐고 물었다. "밤 10시쯤요? 늦어도 11시?" 밤 11시. 그럼 테스트 시작은 자정. 토요일 새벽부터 오전 10시까지. 10시간. 결제 플로우 전체를 10시간 안에. 계산 책상 앞에 앉았다. 계산기를 켰다. 결제 테스트 케이스: 총 147개. 풀 테스트하면 8시간. 리그레션까지 하면 12시간. 시간이 4시간 부족하다. 범위를 줄여야 한다. 어디를.스펙 문서 7시 10분. 스펙이 왔다. 40분 늦었다. 열어봤다. 4페이지. "결제 버튼 위치 변경" "카드 선택 UI 개선" "쿠폰 적용 로직 수정" 로직 수정? "쿠폰이랑 포인트 동시 사용 가능하게" 이건 단순 UI가 아니다. 비즈니스 로직이다. 쿠폰, 포인트, 할인율, 최종 금액. 경우의 수가 몇 개지. 쿠폰 3종류, 포인트 전액/일부, 상품 할인... 최소 20개 케이스. 개발자 호출 개발팀 이대리한테 전화했다. "대리님, 쿠폰이랑 포인트 동시 사용. 테스트 어디까지 해야 돼요?" "음... 일단 정상 케이스만요. 시간 없잖아요." 정상 케이스만. "근데 쿠폰 여러 개 적용은요?" "아, 그건 원래 안 되는 거라 괜찮아요." 원래 안 되는 게 괜찮다는 게 아니라, 이번에 안 건드렸다는 거다. "포인트 부족하면요?" "그것도 기존 로직 그대로요." 기존 로직. 그럼 새로 테스트 안 해도 되나. "근데 화면은 바뀌잖아요." "네, 화면만요." 화면만. 그래도 확인은 해야 한다. 범위 결정 화이트보드에 적었다. 필수:쿠폰+포인트 동시 사용 (정상) 결제 버튼 위치 확인 카드 선택 UI 동작준필수:포인트 부족 시나리오 쿠폰 단독 사용 최종 금액 계산 검증제외:쿠폰 여러 개 조합 배송지 변경 (이번 건 무관) 리워드 적립 (서버 로직, 별도)제외 항목을 보니 불안하다. 배송지는 정말 무관할까. 최종 금액이 배송비에 영향 주지 않나.PM한테 물었다 "배송비 로직은 변경 없죠?" 기획팀 김과장이 답했다. "네, 그건 안 건드렸어요." "확실해요?" "...개발팀한테 확인할게요." 5분 뒤. "아, 배송비 무료 조건이 '할인 전 금액' 기준으로 바뀌었대요." 바뀌었다고. "그럼 쿠폰 쓰면 배송비 나올 수 있다는 거네요?" "네... 그렇네요?" 그렇네요가 아니다. 테스트 케이스 15개 추가다. 8시 30분 여자친구한테 문자 왔다. "저녁 먹자. 치킨?" "오늘 야근. 미안." "또? 금요일인데." "배포." "배포가 뭐길래 매번." 설명할 기운이 없다. "내일 저녁에. 내가 살게." "...ㅇㅇ" ㅇㅇ. 화났다는 거다. 빌드 대기 밤 10시. 빌드를 기다렸다. 개발팀 단톡방을 봤다. "빌드 언제 나와요?" "조금만요. 충돌 해결 중." "11시는 될 것 같아요." 11시. 또 늦는다. 컵라면을 끓였다. 사무실 비상 재고. 매운 맛. 밤샘할 때 먹는 맛. 11시 47분 빌드가 올라왔다. 바로 다운로드. 설치. 앱 실행. 로그인. 상품 담기. 결제 화면 진입. UI가 바뀌었다. 버튼 위치가 아래로. 카드 선택 탭이 깔끔해졌다. 쿠폰 선택. 포인트 입력. 최종 금액 확인. 정상이다. 첫 번째 케이스 통과. 시간은 자정 넘어 12시 3분. 두 번째 케이스 포인트만 사용. 쿠폰 없이. 결제 진행. "오류가 발생했습니다." 터졌다. 재현해봤다. 또 터진다. 찰스 프록시 켰다. 로그 확인. "couponId: null" null을 못 받는다. 개발팀 단톡에 올렸다. "포인트만 쓰면 에러나요. couponId null 처리 안 됨." 이대리가 답했다. "아... 수정할게요. 30분?" 새벽 1시에 30분. 1시 30분이면 다시 빌드. 대기 시간 책상에 엎드렸다. 30분. 잘 수는 없다. 테스트 케이스를 다시 봤다. 우선순위를 재조정했다. null 처리 버그. 심각도 높음. 다른 곳에도 있을까. 배송지 null, 카드 정보 null, 쿠폰 코드 invalid... 체크리스트를 만들었다. Null/Empty 체크:쿠폰 미선택 포인트 0원 배송 메모 없음 카드 없을 때전부 확인해야 한다. 2시 10분 빌드가 또 올라왔다. 1시 30분 약속은 지켰다. 다시 설치. 로그인. 포인트만 사용. 테스트. 통과. 쿠폰만 사용. 통과. 둘 다 사용. 통과. 쿠폰+포인트+배송비. 금액 계산 확인. 9,800원 상품. 2,000원 쿠폰. 3,000원 포인트. 결과: 4,800원 + 배송비 3,000원. 맞다. 근데 할인 전 금액 기준 배송비 무료는 10,000원부터. 9,800원은 300원 모자라니까 배송비 나온다. 이게 맞나. 유저는 혼란스러울 것 같은데. PM한테 물었다 새벽 2시 30분에 슬랙을 보냈다. "배송비 무료 기준이 할인 전 금액이면, 9,800원 상품에 쿠폰 써도 배송비 나와요. 의도 맞아요?" 답이 없다. 당연하다. 잘 시간이다. 기획 의도를 모르겠으면 테스트를 어떻게 하나. 일단 버그는 아니니까 통과 처리. 이슈로 남겼다. "배송비 정책 UX 혼란 가능성 있음. 기획 검토 필요." 3시 47분 결제 완료까지 갔다. 주문 내역 확인. 정상. 쿠폰 차감됨. 포인트 차감됨. 리워드 적립. 확인. 여기까지 8개 케이스 완료. 남은 건 7개. 배송지 변경 케이스, 카드 여러 개 케이스, 할부 개월 수... 눈이 감긴다. 커피를 마셨다. 네 번째. 결제 취소 환불 테스트를 시작했다. 쿠폰 쓴 주문 취소. 쿠폰 복구돼야 함. 취소 완료. 쿠폰함 확인. 없다. 쿠폰이 안 돌아왔다. 다시 해봤다. 또 안 돌아온다. 심각하다. 단톡에 올렸다. "결제 취소 시 쿠폰 복구 안 됨. Blocker." 4시 21분 개발자가 답했다. 이대리가 아니라 팀장이다. "확인했습니다. 수정 중. 5시까지." 5시. 배포까지 5시간 남았다. 5시 13분 빌드 올라왔다. 다시 테스트. 쿠폰 결제. 취소. 쿠폰함 확인. 돌아왔다. 포인트도 확인. 정상. 통과. 남은 케이스 6개. 시간은 5시간. 할 수 있다. 7시 카드 할부 케이스 테스트 중. 3개월 할부. 정상. 6개월. 정상. 12개월. 금액 계산 이상함. 수수료가 두 번 붙었다. 또 버그다. 심각도는 중간. Blocker는 아니다. 12개월 할부 쓰는 사람 많지 않음. 하지만 금액 오류는 민감하다. 올렸다. "12개월 할부 수수료 중복 계산." 답이 없다. 아직 개발팀이 안 왔다. 8시 40분 개발팀이 출근했다. 이대리가 단톡 확인했다. "12개월 할부 버그는 배포 후 핫픽스 가능할까요?" 가능할까요가 아니라. PM이 답했다. "일단 배포하고 다음 주에 수정해요." 다음 주. 유저가 12개월 할부 쓰면 손해 본다. 그냥 배포한다고. 9시 20분 남은 케이스 2개. 배송 메모 특수문자, 긴 텍스트. 둘 다 통과. 테스트 완료. 총 15개 케이스. 버그 3건. Blocker 1건 수정 완료. 중간 심각도 1건 다음 주 수정. 낮은 심각도 1건 이슈 등록. 배포 승인 PM한테 보고했다. "테스트 완료. 배포 가능합니다. 단, 12개월 할부 버그 있음. 다음 주 수정 예정." "고생하셨어요. 10시에 배포 진행할게요." 고생하셨어요. 15시간 일하고 듣는 말. 10시 배포 앱스토어에 올라갔다. 배포 완료. 모니터링 시작. 슬랙, 센트리, 파이어베이스 크래시 리포트. 에러 없다. 30분 지났다. 아직 조용하다. 1시간. 여전히 조용하다. 다행이다. 11시 30분 집에 왔다. 샤워하고 침대에 누웠다. 여자친구한테 문자 보냈다. "끝났어. 저녁 먹자. 7시?" 답이 바로 왔다. "ㅇㅇ 어디?" 아직 화났나. "네가 고르면 내가 살게." "그럼 스테이크." 비싸다. 근데 어쩔 수 없다. "ㅇㅇ" 월요일 출근했다. 슬랙에 알림 하나. CS팀이다. "결제 관련 문의 들어왔어요. 12개월 할부 금액이 이상하대요." 시작됐다. 개발팀 단톡에 포워딩했다. "금요일에 리포트한 버그입니다. 수정 일정 알려주세요." 이대리가 답했다. "오늘 수정해서 내일 배포 가능해요." 내일 배포면 내가 또 테스트한다.금요일 5시 59분. 그 1분이 주말을 날렸다. 근데 배포는 성공했다. 그게 다행인 건가, 불행인 건가. 모르겠다.

엣지 케이스 사냥꾼 일지 - 버그는 디테일에 숨어있다

엣지 케이스 사냥꾼 일지 - 버그는 디테일에 숨어있다

엣지 케이스 사냥꾼 일지 - 버그는 디테일에 숨어있다 오늘도 엣지 케이스가 날 찾아왔다 출근했다. 테스트 빌드가 와 있다. 개발팀에서 "간단한 수정"이라고 했다. 간단한 수정일수록 더 무섭다는 걸 4년 차면 안다. 빌드 설치하고 앱 켰다. 정상 시나리오부터 돌린다. 문제없다. 이제부터가 진짜다. 나는 엣지 케이스 사냥꾼이다. 정상 사용자가 절대 안 할 것 같은 동작. 그게 내 테스트 범위다.네트워크를 미친 듯이 끊어봤다 첫 번째 타겟. 네트워크. 앱 실행 → 로그인 → 메인 화면. 여기서 와이파이 껐다. 정상 사용자는 안 그런다고? 지하철 타면 터널이다. 계속 끊긴다. 엘리베이터 타도 끊긴다. 이게 엣지 케이스가 아니라 일상이다. 데이터 로딩 중에 끊었다. 로딩 표시가 멈췄다. 무한 로딩. 뒤로 가기도 안 된다. 앱 죽일 수밖에. 버그 등록했다. 재현 스텝 꼼꼼히 적었다. "데이터 로딩 시작 후 2초 시점에 네트워크 차단 → 무한 로딩 → 사용자 액션 불가" 개발자 답변 왔다. "실제로 그럴 일이 있나요?" 있다. 매일 있다.텍스트 필드에 미친 짓을 했다 두 번째 타겟. 입력 필드. 회원가입 화면 띄웠다. 이름 입력란이 보인다. 정상 입력: "홍길동" 내 입력: 이모지 100개. 🎉🎉🎉🎉🎉🎉🎉... 계속. 앱이 버벅거렸다. 입력은 됐다. 다음 버튼 눌렀다. 서버 에러. 500. 또 입력했다. 이번엔 특수문자. !@#$%^&*() 되긴 된다. 저장도 된다. 마이페이지 가서 확인했다. 레이아웃 깨졌다. 글자가 화면 밖으로. 버그 두 건 등록. "이모지 100자 이상 입력 시 서버 에러" "특수문자 포함 이름 저장 시 UI 깨짐" 개발자가 물었다. "누가 이름에 이모지 100개를 넣어요?" 몰라. 근데 막을 거 아니면 처리해야지. 전화번호 입력란도 테스트했다. 숫자 말고 문자 넣어봤다. "가나다" 입력이 된다. 막혀야 하는데. 인증번호 요청 눌렀다. 당연히 실패. 근데 에러 메시지가 이상하다. "undefined error occurred" 세 번째 버그 등록. "전화번호 필드 문자 입력 허용, 에러 메시지 미정의" 오전에 버그 3개. 아직 점심 전이다. 화면 회전을 미친 듯이 돌렸다 점심 먹고 왔다. 세 번째 타겟. 화면 회전. 결제 화면 띄웠다. 가로로 돌렸다. 세로로 돌렸다. 가로. 세로. 가로. 세로. 5번쯤 돌렸을 때 앱이 죽었다. 재현했다. 또 죽었다. 버그 등록. "결제 화면에서 화면 회전 반복 시 앱 크래시" 개발자 반응. "누가 결제 중에 화면을 돌려요?" 누가 알아. 근데 돌릴 수 있으면 대응해야지.동시에 눌러봤다 네 번째 타겟. 동시 액션. '저장' 버튼이 있다. 한 번 누르면 저장된다. 정상. 양손으로 동시에 눌렀다. 연타했다. 5번. 저장 완료 메시지가 5번 떴다. 데이터 확인했다. 같은 데이터가 5개 저장됐다. 중복 저장 방지 안 됨. 버그 등록. "저장 버튼 연타 시 중복 저장 발생" 개발자: "그렇게 빨리 누를 수가 있나요?" 있다. 터치 반응 느리면 사용자가 연타한다. 실제로 CS에서 중복 결제 문의 들어온 적 있다. 좋아요 버튼도 테스트했다. 연타했다. 숫자가 이상하게 올라간다. 1 → 3 → 2 → 5 → 4 API 호출 타이밍 문제인 듯. 버그 추가 등록. 오후에 버그 2개 더. 백그라운드에서 복귀했다 다섯 번째 타겟. 앱 상태 전환. 앱 켜고 로딩 중에 홈 버튼. 10초 기다렸다. 앱 복귀. 화면이 하얗다. 데이터가 안 보인다. 앱 죽이고 다시 켜야 한다. 버그 등록. "백그라운드 복귀 시 데이터 미표시" 개발자: "생명주기 처리 놓쳤네요" 알고 있었다. QA가 없으면 배포됐을 버그다. 푸시 알림도 테스트했다. 앱 켜진 상태에서 푸시 받았다. 알림 탭했다. 해당 화면으로 이동. 뒤로 가기 눌렀다. 앱이 종료됐다. 스택이 잘못 쌓였다. 버그 등록. 하루에 버그 7개. 평균치다. 권한을 미친 듯이 껐다 여섯 번째 타겟. 권한. 카메라 권한 필요한 기능이다. 권한 거부했다. 안내 팝업 뜬다. 정상. 설정 가서 권한 껐다. 앱으로 돌아왔다. 카메라 실행 버튼 눌렀다. 앱이 죽었다. 권한 체크 안 함. 버그 등록. "카메라 권한 거부 상태에서 크래시" 위치 권한도 테스트했다. '항상 허용'에서 '앱 사용 중에만' 변경. 지도 화면 갔다. 내 위치가 업데이트 안 된다. 권한 변경 감지 안 함. 버그 추가. 알림 권한 껐다. 앱에서 알림 설정 화면 들어갔다. 스위치가 다 켜져 있다. 실제론 안 오는데 UI는 켜진 상태. 또 버그. 오늘 10개. 오래된 데이터를 불러왔다 일곱 번째 타겟. 데이터 상태. 1년 전 테스트 계정이 있다. 로그인했다. 마이페이지 들어갔다. 프로필 이미지가 안 보인다. URL이 만료됐나 보다. 오래된 게시글 눌렀다. 댓글이 이상하게 보인다. 탈퇴한 사용자 표시가 안 됨. 찜 목록 들어갔다. 삭제된 상품이 그대로 있다. 눌렀더니 404 에러. 버그 3개 더 등록. "만료된 이미지 URL 처리 미흡" "탈퇴 사용자 댓글 표시 오류" "삭제된 상품 찜 목록 표시" 개발자들이 안 보는 데이터. 오래된 것, 삭제된 것, 만료된 것. 여기서 버그가 나온다. 이상한 조합을 시도했다 여덟 번째 타겟. 기능 조합. 검색하면서 필터 바꿨다. 정렬하면서 새로고침 했다. 동영상 재생 중에 화면 잠갔다. 검색어 입력 중에 필터 변경. 검색어가 사라졌다. 입력 상태 초기화. 버그. 동영상 재생 중 화면 잠금. 5분 후 해제. 동영상이 계속 재생 중이다. 소리는 안 나는데 재생은 됨. 배터리가 닳는다. 버그. 장바구니에 담고 로그아웃. 다른 계정으로 로그인. 장바구니가 이전 계정 거다. 데이터 안 지워짐. 심각한 버그. 오늘 15개. 배포 전이라 다행이다. 개발자와의 대화 버그 리포트 15건 올렸다. 개발자가 채팅 보냈다. "민수님, 이거 다 고쳐야 해요?" "네." "근데 이런 상황 실제로 일어나나요?" "네. 다 재현했어요." "우선순위 좀 정해주세요." 버그 심각도 다시 봤다. Critical: 3개 (앱 크래시, 데이터 유실) High: 7개 (기능 동작 안 함) Medium: 5개 (UI 깨짐, 불편) "Critical 3개는 배포 전에 필수요." "High는 다음 배포까지요." 개발자가 물었다. "이런 엣지 케이스를 어떻게 다 생각해요?" 몰라. 그냥 생각난다. 앱 쓰다 보면 자동으로 떠오른다. '이렇게 하면 어떻게 될까?' '여기서 끊으면?' '이걸 동시에 누르면?' 4년 차 직업병이다. 엣지 케이스가 일상이 된 순간 퇴근길 지하철. 유튜브 보다가 터널 들어갔다. 네트워크 끊겼다. 버퍼링. 터널 나왔다. 재생 재개. '이거 우리 앱은 어떻게 되지?' 테스트했었다. 버그 있었다. 고쳐졌을까? 내일 확인해야지. 편의점 들렀다. 결제 앱 켰다. 바코드 표시. '화면 밝기 최저일 때는?' '화면 회전하면?' '배터리 1%일 때는?' 다 테스트해봐야겠다. 내일 할 일이 또 생겼다. 집 와서 배달 앱 켰다. 주문하다가 앱이 튕겼다. '재현 가능한가?' 다시 켰다. 또 튕겼다. 리뷰 남겼다. "주문 중 앱 크래시, 아이폰 14 Pro, iOS 17.2, 재현 가능" 재현 스텝까지 적었다. 친구가 물었다. "너 왜 리뷰를 버그 리포트처럼 써?" 습관이다. 고칠 수가 없다. QA의 자부심 사람들은 묻는다. "QA가 뭐 하는 건데요?" "버그 찾는 거요." 틀렸다. 우리는 사용자를 보호한다. 정상 사용자가 안 할 동작을 내가 대신 한다. 앱이 죽을 수 있는 상황을 내가 먼저 찾는다. 엣지 케이스는 엣지가 아니다. 누군가에겐 일상이다. 네트워크가 불안정한 사람. 터치를 빨리 하는 사람. 화면을 자주 돌리는 사람. 백그라운드 전환이 잦은 사람. 그 사람들이 버그를 만나기 전에 내가 먼저 만난다. 개발자들은 정상 시나리오를 만든다. 나는 비정상 시나리오를 만든다. 둘 다 필요하다. 오늘 찾은 버그 15개. 배포 후 사용자가 만났을 버그 15개. 내가 막았다. 내일의 엣지 케이스 내일 테스트 계획 세웠다. 메모리 부족 상황 테스트. 앱 여러 개 켜놓고 우리 앱 실행. 백그라운드에서 죽는지 확인. 저장 공간 부족 상황. 파일 다운로드 시도. 에러 처리 되는지 확인. 시간대 변경 테스트. 해외 시간대로 바꾸고 날짜/시간 표시 확인. 언어 변경 테스트. 영어로 바꿨을 때 레이아웃 깨지는지 확인. 접근성 테스트. VoiceOver 켜고 스크린 리더로 사용 가능한지. 할 게 많다. 엣지 케이스는 끝이 없다. 그래도 좋다. 버그 찾을 때 짜릿하다. '이거 아무도 생각 못 했을 텐데' 싶은 버그 찾으면 이상하게 기분이 좋다. 나는 엣지 케이스 사냥꾼이다. 디테일에 숨은 버그를 찾는다. 그게 내 일이다.오늘도 버그 15개. 내일은 몇 개나 찾을까.