커밋 9개로 재구성하고 후속 버그 9개를 잡은 날

26년 05월 18일

커밋 9개로 재구성

이날은 빡센 날이었다.

새 코스 종류 도입 작업을 커밋 9개로 재구성하고 파생된 후속 버그 9개를 잡고 알파 배포를 다섯 번 돌렸다.

틈틈이 QA 에이전트 알파 배포랑 컨텍스트 오버플로 버그 분석도 했다.

새 코스 종류 도입 작업이 끝났다.

근데 커밋이 난잡했다.

작업하면서 찔끔찔끔 커밋하다

보니까 하나의 커밋에 여러 기능이 섞여 있고 임시 파일도 커밋되어 있었다.

이걸 9개 기능 단위 커밋으로 재구성했다.

각 커밋이 하나의 기능을 담당하게 했다.

깃이그노어, API 호출, 학습 페이지, 탭 스타일, 툴바 레이아웃, 레이아웃 컴포넌트 순으로. 임시 파일은 제거하고 린트 에러랑 타입체크 에러를 해당 커밋으로 흡수했다.

그러니까 CI가 깨끗하게 통과했다.

린트 0개, 타입체크 0개, 전체 앱 빌드 성공. 커밋을 재구성하는 게 왜 중요한가.

리뷰어가 이해할 수 있는 단위로 나뉘어 있어야 리뷰가 된다.

거대한 커밋은 리뷰를 포기하게 만든다.

“이 커밋이 뭘 하는지”가 한눈에 들어와야 한다.

후속 버그 9개

커밋을 재구성하면서 파생된 후속 버그를 잡았다.

새 분기 로직을 넣으니까 예상치 못한 곳에서 버그가 줄줄이 나왔다.

진행률이 안 보이는 문제

순차 수강 잠금 파트에서 진행률이 안 보이는 문제가 있었다.

잠긴 파트도 진행률을 보여줘야 하는데, 잠금 상태에서는 진행률 바가 숨겨지고 있었다.

그리고 선택 강의만 있는 파트는 진행률 바를 숨겨야 하는데, 이 조건도 빠져 있었다.

반올림 처리도 손봤다.

99.5% 이상이면 100%로 보여주게 했다.

소수점을 안 보여주니까 99.5%가 99%로 보이는 건 이상하다.

출석체크 약관 분기

새 코스 종류인데 기존 코스 약관이 나오는 문제도 있었다.

출석체크 약관이 기존 코스 종류 전용이었는데, 새 종류에서도 기존 약관이 보인 거다.

분기 로직이 빠져 있었다.

이걸 잡으면서 상태 갱신 문제도 발견했다.

약관 동의 후에 상태가 갱신되지 않았다.

API 호출이 빠져 있었다.

그리고 캐시 무효화도 안 되어 있었다.

동의를 해도 화면에 반영이 안 되는 거다.

캐시를 무효화하는 호출을 추가해서 해결했다.

잠금 모달 경로 누락

잠금 모달이 모든 진입 경로에서 떠야 하는데, 일부 경로에서 안 떴다.

사이드바, 이전이나 다음 버튼, 직접 URL, 대시보드 이렇게 네 경로가 있다.

이 중 일부 경로에서 잠금이 안 먹혔다.

모든 경로를 찾아내서 각 경로에서 잠금 모달이 뜨게 만들었다.

한 경로라도 빠지면 잠긴 파트로 들어갈 수 있다.

모달 닫기 타이밍 버그

모달 닫기에 미묘한 버그가 있었다.

모달이 닫히는 전환 시간 동안 오버레이가 클릭을 가로채는 거다.

약 200~300밀리초 동안 오버레이가 클릭을 먹어서 그 뒤에 하려던 동작이 안 된다.

해결은 300밀리초 지연을 넣는 거였다.

모달이 닫힌 후에 실행해야 할 동작을 잠시 미루는 거다.

오버레이 전환이 끝난 후에 동작하게 만들었다.

알파 배포 다섯 번

버그를 잡으면서 알파 배포를 다섯 번 돌렸다.

잡고 배포하고 또 잡고 배포하고. 모노레포에서 9개 앱에 걸쳐 배포하다

보니까 한 번에 안 끝난다.

앱마다 의존성이 있으니까 순서대로 검증해야 한다.

버그를 잡을 때마다 다시 배포한다.

다섯 번이면 하루에 다섯 번 배포한 거다.

이런 날이 빡세다.

근데 버그가 나올 때마다 잡고 배포하는 게 맞다.

쌓아두면 나중에 한 번에 잡기 어렵다.

컨텍스트 오버플로 버그 분석

틈틈이 에이전트 도구 쪽에서 컨텍스트 오버플로 버그도 분석했다.

증상은 묘했다.

컨텍스트가 100%인데, 프롬프트를 보내면 조용히 멈춘다.

응답이 없다.

에러도 안 나고 그냥 아무 일도 안 일어난다.

원인을 추적해보니 두 가지가 있었다.

첫째, 컨텍스트 사용률 계산에서 캐시 생성 토큰이 빠져 있었다.

실제로는 99.86%를 쓰고 있는데, 계산에서는 덜 나와서 “아직 괜찮다”고 판단한 거다.

둘째, 컨텍스트 검사가 대기 상태에서만 돌았다.

실행 중에 프롬프트가 들어오면 검사를 안 한다.

그러니까 실행 중에 컨텍스트가 꽉 차도 모른다.

이건 분석만 하고 수정은 다음으로 넘겼다.

근데 원인을 찾은 게 중요했다.

“조용히 멈추는” 버그는 잡기 어렵다.

원인을 찾으면 수정은 금방이다.

마무리

이날의 핵심은 새 코스 종류 도입이 파생시킨 버그를 줄줄이 잡은 거다.

분기 로직을 넣으면 예상치 못한 곳에서 버그가 나온다.

진행률 표시, 약관, 잠금 모달, 모달 닫기 타이밍까지 전부. 새 분기를 넣을 때는 그 분기가 영향을 주는 모든 경로를 찾아야 한다.

하나라도 빠지면 버그가 된다.

잠금 모달이 네 경로 중 세 곳에서만 뜨면, 한 경로로 들어가면 잠금이 안 먹힌다.

그리고 커밋을 재구성하는 것도 중요했다.

난잡한 커밋을 9개로 정리하니까 리뷰가 가능해졌다.

거대한 커밋은 리뷰를 포기하게 만든다.

리뷰 가능한 단위로 나누는 게 코드 품질의 기반이다.