9년간의 복잡한 버그에서 배운 교훈
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
디버깅
대상자
- 소프트웨어 개발자
- 테스트/디버깅 엔지니어
- 중간~고급 수준의 개발자 (버그 원인 분석 및 방지 전략 포함)
핵심 요약
- 빈 값/제로 처리 중요성 강조:
null
,0
,빈 문자열
을 고려하지 않으면 발생하는 버그 예시:hasApiKey=false
가 잘못 노출된 문제 - 시간 기반 로직의 예외 처리: 휴일(예: 일본 황금주), 주말, 현재 날짜 기준의 오류 예방
- 로그 분석의 핵심 역할:
Kibana
와 같은 로깅 도구를 통해비정상 데이터 수신
,버그 원인 추적
가능
섹션별 세부 요약
1. 빈 값 처리 (Empty Cases)
- 빈 라인/공백/제로 값 문제: CSV 헤더 누락, 제로 매핑 오류 등 발생
- 과거 경험:
null
처리 미비로 인한 버그 재발 가능성 - 해결 방안:
assert
또는if (value == null || value.isEmpty())
로 예외 처리 강화
2. 시간 관련 로직 (Days)
- 휴일/주말 처리: 일본 황금주와 같은 연속 휴일 예외 처리 필요
- 계약 유효성 검증:
start_date > today
또는end_date < today
로만 판단하면 오류 발생 가능 - 시계열 데이터 검증:
current_date
대신business_day
기준으로 로직 재설계
3. 오래된 데이터 포맷 (Old Data Formats)
- 데이터 마이그레이션: 기존 DB의
legacy format
을new format
으로 전환 시legacy data
대응 필요 - 트랜지션 기간 처리:
old agreement name
이 공백으로 끝나는 경우4-eye approval
로직 오류 발생 - 해결 방안:
data migration
스크립트와legacy compatibility layer
구현
4. 복사된 딕셔너리 (Aliased Dicts/HashMaps)
- 딕셔너리 복사 오류:
dict2 = dict1.copy()
대신dict2 = dict1
로 할당 시mutable reference
로 인한 동시 수정 - 예시:
dict1['key'] = 'new_value'
시dict2['key']
도 같이 변경 - 방지 대책:
copy.deepcopy()
또는new_dict = {k: v for k, v in original.items()}
사용
5. 로컬 변경사항 (Local Changes)
- CI 테스트 미커버: 로컬 수정 후
git push
누락으로 인한 배포 오류 - 코드 주석 처리 오류: 주석 해제 시
기존 로직 변경
으로 인한 버그 - 해결 방안:
pre-commit hook
으로CI test coverage
강화
6. 탐색적 테스트 (Exploratory Testing)
- 기능 상호작용 버그:
feature A
와feature B
가 동시에 활성화 시 예상치 못한 동작 - 사용자 피드백: 사용자가 기능을 예상과 다른 방식으로 사용하는 경우 발견
- GUI 기반 검증:
GUI에서 hasApiKey=false
가 노출된 문제 감지
7. 테스트 환경 구성 (Smaller Config in Test)
- 이벤트 핸들러 차이: 테스트 시 1개, 프로덕션 시 2개 이벤트 핸들러로 인한 병렬 처리 오류
- 해결 방안:
test environment
를prod environment
와 동일하게 구성
8. 접근 권한 (Access Rights)
- 테스트 시 권한 과도:
admin user
사용으로 기능이 정상 작동하는 것으로 오인 - 방지 대책:
test user
를role-based access control
로 설정
9. 로깅 (Good Logging)
- 로그 분석의 중요성:
calendar service
오류 시start-up data
누락 감지 - 타임스탬프 활용:
Kibana
에서dead letter
발생 시점의 로그 검색
10. 동료와의 논의 (Discussing with Colleagues)
- 오프사이트 협업 효과: 물리적 근무 시
real-time debugging
가능성 - 해결 사례:
faulty if-statement
오류 감지
11. 알림 설정 (Alerting)
- 자동 알림의 효과:
critical error
시alerting system
으로 조기 발견 - 예시:
node restart
누락 시old software version
실행
12. 최소 사례 재현 (Reproducing with Smallest Case)
- 코드 주석 처리:
main branch
와feature branch
의 차이 분석 - 해결 방안:
minimized test case
로 버그 원인 추적
결론
- 버그 원인 분석:
empty/zero/null
처리,time-based logic
,logging
분석이 핵심 - 실무 적용 팁:
Kibana
와 같은 로깅 도구 사용,pre-commit hook
으로 CI 테스트 강화,legacy data migration
스크립트 구현 - 9년간 평균: 2개월에 1개의 복잡한 버그 발생, 70%는 개발자 스스로 유발
- 핵심 메시지: "버그는 학습의 기회"로,
디버깅 전략
과테스트 커버리지
개선이 필수