[개발 회고] 기존에 고쳤던 버그를 되돌리지 않는 법
기존에 고쳤던 버그를 되돌리지 않는 법
개발 회고 — 2026-08-04 (일)
오늘 작업 요약
두 개의 수정 브랜치에 대한 리뷰 피드백에 대응했다. 하나는 다이얼로그의 ESC 키 처리와 관련된 회귀 버그, 다른 하나는 프레임을 드래그할 때 발생하는 시각적 우선순위(z-order) 문제였다. 두 작업 모두 “코드를 고치기 전에 원인부터 진단한다”는 원칙을 따라, 과거 커밋 이력을 추적해 이미 해결됐던 버그를 실수로 되돌리는 일을 사전에 막았다.
다이얼로그 ESC 이벤트 처리 리뷰 대응
- 사용자 정의 ESC 키 처리 방식을 다이얼로그 라이브러리 내부 로직을 덮어쓰지 않는 방식으로 교체
- 특정 컴포넌트가 매 렌더마다 새로 생성되어 포커스가 유실되던 2차 버그 발견 및 수정
- 포커스가 다이얼로그 내부로 전혀 진입하지 않던 문제를 명시적 포커스 호출로 해결
- 과거에 이미 해결됐던 버그의 수정 코드를 실수로 지웠던 것을 발견해 복구
프레임 드래그 중 오버레이 조건 불일치 리뷰 대응
- 포커스 표시가 다른 UI 요소 위에 그려지던 버그가 리팩토링 과정에서 재발한 것을 확인, 렌더링 순서 복원
- 프레임 드래그 시작/종료 시 실제 오류가 발생하던 누락된 메서드 구현 추가
- 프레임 드래그를 검증한다던 테스트가 실제로는 다른 동작(리사이즈)만 확인하고 있던 것을 발견, 실제 드래그를 시뮬레이션하도록 재작성
- 캔버스 기반 렌더링의 좌표 계산 시행착오 끝에 기존에 검증된 테스트 패턴을 재사용하는 방식으로 안정화
- 이미 해결된 것으로 보이는 항목에 대해 사용자 요청으로 검증 테스트 추가
커밋 요약: 6개 커밋(다이얼로그 관련 1개, 프레임 드래그 관련 5개)
STAR 정리
Situation (상황)
두 개의 수정 작업에 대한 코드 리뷰 피드백이 들어왔다. 하나는 다이얼로그에서 ESC 키를 누를 때 발생하는 회귀 문제로, 사용자 정의 키 이벤트 처리가 다이얼로그 라이브러리의 내부 로직(최상위 모달 여부 확인, 이벤트 전파 중단 등)을 완전히 덮어써버려서 발생한 것이었다. 다른 하나는 프레임을 드래그할 때 나타나는 미리보기 오버레이와, 편집 가능한 셀을 어둡게 표시하는 처리 사이의 조건이 서로 어긋나는 문제였는데, 리팩토링 과정에서 과거에 이미 고쳤던 렌더링 순서 버그가 재발한 상황이었다.
Task (과제)
- 다이얼로그 ESC 처리 회귀를 라이브러리 내부 로직을 보존하는 방식으로 재구현
- 재구현 과정에서 발생할 수 있는 2차 회귀를 사전에 발견
- 프레임 드래그의 렌더링 순서 문제를 근본 원인부터 추적해 해결
- 실제 사용자 동작을 검증하지 못하고 있던 테스트를 재작성
Action (행동)
- 사용자 정의 키 이벤트 처리 로직을, 다이얼로그 라이브러리의 최상위 컨테이너가 아니라 내부 콘텐츠 영역에 붙이는 방식으로 옮겨서, 라이브러리 자체의 ESC 처리 로직을 건드리지 않도록 수정함
- 이 과정에서, 콘텐츠 영역을 렌더링하는 컴포넌트가 매번 새로운 함수로 재생성되면서 그 하위 트리 전체가 사라졌다가 다시 생성되어 포커스가 유실되는 2차 버그를 발견함. 메모이제이션과 참조 고정으로 컴포넌트의 정체성을 유지시켜 해결함
- 특정 다이얼로그들에서 포커스가 자동으로 진입하지 않도록 설정되어 있어 ESC 키 자체가 아예 동작하지 않던 문제를, 다이얼로그가 화면에 나타난 시점에 명시적으로 포커스를 지정하는 방식으로 해결함
- 코드 변경 이력을 추적하는 과정에서, 자동 포커스 강제 설정을 비활성화하는 코드가 실은 과거의 다른 버그(컬럼 필터 검색창의 포커스 문제)를 해결하기 위한 것이었음을 발견하고, 이를 실수로 제거하지 않도록 복구함
- 프레임 드래그 관련해서는, 포커스 표시가 하단 정보 영역이나 인디케이터 위에 잘못 그려지던 과거의 버그가 최근 리팩토링에서 재발한 것을 확인하고, 관련 요소들이 추가되는 순서를 원래대로 복원함
- 프레임을 드래그로 옮길 때 호출되어야 하는 다시 그리기(repaint) 메서드가 실제로는 구현되어 있지 않아서, 드래그 시작/종료 시 오류가 발생하던 실제 프로덕션 버그를 발견하고 기존 크기 조정 메서드와 같은 패턴으로 구현을 추가함
- 프레임 드래그를 검증한다고 되어 있던 기존 테스트가 실제로는 드래그가 아니라 리사이즈만 조작하고 있던 것을 발견함. 실제 드래그 시작 동작과 미리보기 오버레이의 등장 여부를 직접 검증하도록 테스트를 재작성함
- 캔버스 기반 렌더링에서 요소가 화면 경계에 잘리는 상태를 검증하기 위해 좌표를 직접 계산하려 했으나 여러 차례 시행착오를 겪음. 결국 과거의 다른 버그를 검증할 때 썼던 테스트 패턴(방향키로 이동하며 오버레이 등장 여부 확인)을 재사용하는 방식으로 단순화해 안정성을 확보함
- 드래그 중 편집 가능한 셀을 어둡게 표시하지 않으면서 동시에 미리보기 오버레이가 나타나는지를 검증하는 테스트를, 이미 공통 함수로 해결된 상태였지만 사용자 요청에 따라 명시적으로 추가함
Result (결과)
- 다이얼로그의 ESC 키 처리가 라이브러리 내부 로직을 보존하면서도 정상 동작하도록 수정됨
- 재구현 과정에서 발견된 2차 포커스 유실 버그도 함께 해결됨
- 과거에 이미 해결됐던 버그(컬럼 필터 검색창 포커스)의 수정 코드가 실수로 제거될 뻔한 상황을 사전에 방지함
- 프레임 드래그의 렌더링 순서 재발 버그와, 실제 프로덕션에서 오류를 일으키던 누락된 메서드가 모두 해결됨
- 프레임 드래그 테스트가 실제 사용자 동작을 검증하도록 재작성되어, 향후 유사한 누락 버그를 조기에 발견할 수 있는 기반이 마련됨
- 파일 수정 이력이 원인 불명으로 두 차례 되돌아가는 현상이 있었으나, 재적용으로 우선 해결하고 근본 원인은 다음 조사 과제로 남김
실제 측정 가능한 지표
| 지표 | 확인 방법 | 비고 |
|---|---|---|
| 커밋 수 | git log --stat (오늘 범위) |
6개 커밋(다이얼로그 1개, 프레임 드래그 5개) |
| 발견된 2차 버그 수 | 리뷰 대응 과정에서 추가로 발견한 버그 개수 | 포커스 유실 1건, 렌더링 순서 재발 1건 |
| 복구된 과거 수정 코드 | git blame으로 추적한 기존 fix 개수 | 1건(컬럼 필터 검색창 포커스) |
| 재작성된 테스트 케이스 | Cypress 테스트 파일의 변경된 it() 블록 수 |
프레임 드래그 검증 테스트 |
| 실제 프로덕션 오류 발견 여부 | 드래그 시작/종료 시 오류 재현 테스트 | 재현됨, 수정 후 해소 확인 필요 |
| 파일 수정 이력 분실 재현 여부 | 동일 파일을 다시 수정해 재발 여부 확인 | 원인 불명, 조사 필요 |
추정 가능한 효과 (근거 포함)
- 진단 우선 원칙으로 회귀 위험 사전 차단 (추정): 코드를 고치기 전에 변경 이력을 먼저 추적하는 습관 덕분에, 과거에 이미 해결됐던 버그의 수정 코드를 실수로 제거하는 일을 막을 수 있었을 것으로 예상됨. 근거: 자동 포커스 강제 설정 비활성화 코드가 과거 버그의 해결책이었음을 이력 추적으로 확인하고 복구한 사례가 실제로 있었음
- 기존 검증 패턴 재사용으로 테스트 안정성 향상 (추정): 캔버스 기반 렌더링처럼 좌표 계산이 환경에 따라 달라지기 쉬운 영역에서는, 새로 좌표를 계산하는 것보다 이미 검증된 테스트 패턴을 재사용하는 것이 더 안정적인 테스트를 만들 것으로 예상됨. 근거: 직접 좌표를 계산하는 방식에서 여러 차례 시행착오를 겪은 뒤, 기존 패턴으로 전환하고 나서 안정화된 것을 확인함
- 실제 사용자 동작 기반 테스트로 숨은 버그 발견 (추정): 프레임 드래그를 실제로 시뮬레이션하지 않고 리사이즈만 조작하던 기존 테스트로는 발견할 수 없었던 누락된 메서드 버그를, 테스트를 실제 동작 기반으로 재작성하면서 발견함. 근거: 재작성된 테스트를 통해 프로덕션 환경에서 실제로 발생하던 오류를 재현할 수 있었음
더 측정하면 좋은 지표
- 파일 수정 이력 분실의 재현 조건: 동일한 조건에서 다시 발생하는지, 특정 도구나 환경에 국한된 문제인지 추적
- 다이얼로그 포커스 관련 회귀 재발 여부: 유사한 다이얼로그 컴포넌트 전반에 같은 패턴의 문제가 남아있는지 전수 점검
- 캔버스 좌표 계산 테스트의 브라우저/환경별 안정성: 다양한 브라우저와 화면 크기에서 재작성된 테스트가 일관되게 통과하는지 확인
- 리뷰에서 발견된 버그 대비 실제 사용자 영향도: 오늘 발견한 버그들이 실제 배포 환경에서 얼마나 자주 발생했을지 로그 기반으로 역추적
- 진단 우선 원칙의 적용 빈도와 효과: 이 원칙을 적용한 사례와 적용하지 않은 사례에서 회귀 발생률 차이를 누적 비교
오늘 배운 것
- 코드를 수정하기 전에 변경 이력을 먼저 추적해서 원인을 진단하고, 여러 해결 방안을 제시한 뒤 선택을 받는 방식이 회귀 위험을 실질적으로 낮춘다는 것을 다시 확인함. 특히 “이 코드가 왜 여기 있었는가”를 먼저 묻는 습관이, 과거의 의도치 않은 제거를 막아준다는 것을 실감함
- 캔버스 기반 렌더링을 테스트할 때, 정확한 픽셀 좌표를 직접 계산하는 방식은 브라우저·환경·확대 비율 등 변수가 많아 깨지기 쉽다는 것을 배움. 이미 검증된 테스트 패턴이 있다면 새로 만들기보다 재사용하는 편이 훨씬 안정적임
- 어떤 동작을 검증한다고 이름 붙여진 테스트가 실제로는 다른 동작만 확인하고 있을 수 있다는 것을 다시 확인함. 핸들을 흉내 내는 것보다 실제 사용자 행동을 그대로 재현하는 테스트가 숨은 버그를 더 잘 잡아낸다는 점
어려웠던 점 / 막힌 부분
- 특정 파일의 수정 사항이 원인 불명으로 두 차례 되돌아가는 현상을 겪음. 작업 환경이나 외부 요인이 의심되지만 정확한 원인은 아직 파악하지 못했고, 재적용으로 우선 해결한 상태
- 캔버스 영역의 좌표를 계산할 때, 캔버스 자체의 위치 정보가 아니라 크기 조정에 반응하는 감싸는 요소(wrapper)의 위치 정보를 써야 한다는 것을 여러 번의 시행착오 끝에 알게 됨. 화면에 보이는 시각적 반응과 실제 DOM에서 계산되는 값 사이에 차이가 있었음
- 리뷰가 누적된 병합 요청에서, 이미 해결된 항목에 대한 코멘트가 더 이전 커밋에 달려 있어서 중복 피드백처럼 보이는 혼동이 있었음
내일 하면 좋은 작업
- 파일 수정 이력 분실 원인 조사
- 두 브랜치의 병합 상태 확인 및 최종 리뷰
한 줄 요약
오늘은 다이얼로그 ESC 전파와 프레임 드래그의 렌더링 순서 버그를 진단 우선 원칙으로 추적하고, 테스트 패턴 재사용으로 안정성을 확보한 하루였다.
댓글남기기