소프트웨어 개발 과정에서 우리는 "버그 터졌어!", "서버 에러 났어!" 와 같은 말을 흔히 사용합니다. 하지만 문제 해결의 효율성을 높이고 팀원들과 명확하게 소통하기 위해서는, 우리가 '버그'라고 뭉뚱그려 부르는 것들의 정체를 명확히 구분할 필요가 있습니다.
ISTQB(International Software Testing Qualifications Board)를 비롯한 소프트웨어 공학에서는 문제의 발생 과정을 오류(Error), 결함(Defect), 장애(Failure)라는 세 단계로 구분합니다. 이 세 용어의 차이와 인과 관계를 이해하는 것은, 품질 문제에 체계적으로 접근하는 첫걸음입니다.
정의: 사람이 저지르는 실수. 모든 문제의 근원이자 시작점입니다. 이는 시스템에 아직 반영되지 않은, 사고 또는 행동상의 실수를 의미합니다.
예시
정의: 시스템(코드, 문서, 설계 등)에 내재된 문제. 사람의 '오류'가 만들어낸 결과물입니다. 우리가 흔히 '버그'라고 부르는 것이 바로 이 결함입니다.
핵심: 아직 실행되지 않아 사용자에게 아무런 영향을 미치지 않고, 코드나 문서 속에 조용히 숨어있는 '흠집'과 같습니다. 테스트를 수행하더라도 해당 로직이 실행되지 않으면 결함은 발견되지 않을 수 있으며, 이것이 바로 테스트 설계와 커버리지의 중요성을 말해줍니다.
예시
정의: 시스템이 기대된 동작을 하지 못하는 현상. 내재되어 있던 '결함'이 특정 조건에서 실행될 때 외부로 드러나는 결과입니다.
핵심: 사용자가 직접 목격하거나 운영 로그, 모니터링 알람, 사용자 제보 등으로 식별할 수 있는, 명세와 다른 동작입니다.
예시
이 세 가지 용어는 명확한 인과 관계의 사슬을 형성합니다.
사람의 오류(Error)가 코드에 결함(Defect)을 만들고, 그 결함이 특정 조건에서 실행될 때, 사용자에게 장애(Failure)로 나타납니다.
마치 도미노가 쓰러지는 과정과 같습니다. 첫 번째 도미노인 사람의 '오류'를 바로잡는 것이 시간과 비용 측면에서 가장 저렴하며, 이것이 바로 'Shift-Left' 개념의 핵심입니다.
중요한 점은, 모든 결함이 반드시 장애로 이어지지는 않는다는 것입니다. 특정 조건이 충족되지 않아 실행되지 않는 코드 속의 결함은, 마치 아무도 건드리지 않는 줄 속에 잘못 서 있는 도미노와 같습니다.
데드 코드 (Dead Code) 속 결함:
예시: 과거 이벤트 기간에만 사용되었고, 현재는 어디에서도 호출되지 않는 calculate_special_discount() 함수 내에 치명적인 계산 결함이 있습니다. 이 코드는 시스템에 존재하지만 실행될 일이 없으므로 장애를 일으키지 않습니다.
드문 엣지 케이스 (Rare Edge-Case)의 결함:
예시: 시스템이 2월 29일(윤년)에만 날짜 계산을 잘못하는 결함이 있습니다. 이 결함은 4년에 단 하루만 실행될 수 있으므로, 대부분의 시간에는 장애로 나타나지 않습니다.
기능 플래그 (Feature Flag)로 비활성화된 결함:
예시: 아직 정식 출시되지 않은 '새로운 결제 기능' 코드에 결함이 있지만, 기능 플래그가 off 상태라서 사용자에게는 노출되지 않습니다. 이 결함은 플래그가 on으로 바뀌기 전까지는 장애를 유발하지 않습니다.
이 용어들을 구분하는 것은 단순히 학문적인 말장난이 아닙니다. 문제 해결의 접근 방식을 완전히 바꾸기 때문입니다.
장애 식별: 사용자가 "로그인이 안 돼요!"라는 장애를 보고합니다.
결함 분석 (디버깅): 개발팀은 로그를 분석하고 디버깅하여, 이 장애를 유발한 코드 내의 결함을 찾아냅니다. (예: password_hash() 함수 로직의 문제)
오류 근본 원인 분석 (RCA - Root Cause Analysis): "왜 이런 결함이 만들어졌을까?"를 파고듭니다. 이때 다음과 같은 기법을 활용할 수 있습니다.
5 Whys: "왜?"라는 질문을 다섯 번 반복하여 문제의 근본 원인에 도달하는 간단하지만 강력한 기법입니다.
피시본 다이어그램 (Fishbone Diagram / Ishikawa Diagram): 문제의 원인을 여러 카테고리로 나누어 시각적으로 분석함으로써, 다양한 측면의 원인을 놓치지 않도록 돕는 기법입니다. '물고기 뼈' 모양과 비슷하여 이런 이름이 붙었습니다.
(예시: '로그인 장애'에 대한 피시본 다이어그램 분석)
이처럼 피시본 다이어그램은 5 Whys가 단일 경로의 깊은 원인을 찾는 데 강점이 있는 반면, 문제에 영향을 미쳤을 수 있는 다양한 측면의 원인들을 종합적으로 식별하는 데 매우 유용합니다.
개선 조치: 단순히 결함을 수정하는 것에서 그치지 않고, 재발 방지를 위한 프로세스 개선(예: 배포 체크리스트에 '데이터 마이그레이션 확인' 항목 추가)과 해당 케이스를 검증하는 자동화 테스트 케이스를 추가하여 시스템을 더욱 견고하게 만듭니다.