개념
'버그'는 표준 용어가 아니다
모듈 1 레슨 2에서 오류(error)·결함(defect)·실패(failure)를 구분하고 전파 구조를 배웠다. 사람이 실수하면(오류) 산출물에 결함이 남고, 그 결함이 실행되면 실패가 나타난다.
그 지식 위에서 이 레슨이 묻는 것은 하나다. 그럼 우리가 매일 쓰는 '버그'는 그중 무엇인가?
답은 "맥락에 따라 다 다르다"이다. 그리고 그게 문제다.
"버그 등록했어요" → 결함(defect)을 가리킨다
"버그 났어요" → 실패(failure)를 목격했다는 뜻이다
"이거 버그 아니에요?" → 이상(anomaly)인지 의도된 동작인지 묻는 것이다
"그 버그 원인이 뭐예요?" → 결함의 위치를 묻는다
"버그 세 건 수정" → 결함 세 건을 고쳤다는 뜻한 단어가 다섯 가지를 가리킨다. 팀 안에서는 맥락으로 통하지만, 리포트와 지표에서는 이 뭉뚱그림이 비용이 된다.
표준 용어 다섯 개
| 용어 | 뜻 | 어디에 존재하는가 |
|---|---|---|
| 오류 (error, mistake) | 잘못된 결과를 낳는 사람의 행위 | 사람의 머릿속·행동 |
| 결함 (defect, fault) | 실행될 때 실패를 일으킬 수 있는 산출물의 결점 | 코드·문서·설정 안에 정적으로 |
| 실패 (failure) | 요구된 기능을 수행하지 못한 사건 | 실행 중에 관찰되는 현상 |
| 이상 (anomaly) | 문서·표준·기대와 어긋나는 관찰된 모든 것 | 결함일 수도, 아닐 수도 |
| 인시던트 (incident) | 조사가 필요한 관찰 결과이자 그 기록 | 테스트·운영 중 보고되는 것 |
이 정의들은 ISO/IEC/IEEE 24765(시스템·소프트웨어 공학 어휘)와 ISO/IEC/IEEE 29119 계열, 그리고 IEEE 1044(소프트웨어 이상 분류)에 근거한다. 모듈 8에서 29119를 다뤘는데, 29119의 동적 테스트 프로세스에 '인시던트 보고' 라는 활동이 있는 것이 이 체계 때문이다.
왜 '이상(anomaly)'이 따로 있는가
여기가 실무적으로 가장 쓸모 있는 구분이다.
테스터가 뭔가 이상한 걸 봤다
↓
이상(anomaly) ← 이 시점에는 이게 정확한 이름이다
↓
조사한다
↓
┌────┴─────┬──────────┬──────────┐
결함이다 의도된 동작 환경 문제 테스트 오류
(defect) (as designed) (environment) (test error)발견 시점에는 그것이 결함인지 알 수 없다. 그래서 표준은 중립적인 이름을 준다. 조사 후에야 결함인지 아닌지가 정해진다.
이 구분을 아는 팀과 모르는 팀의 차이:
[모르는 팀] "버그 등록했는데 개발자가 '이건 버그 아니다'라고 반려함"
→ 등록한 사람이 틀린 것처럼 느껴진다
→ 반려율이 개인 평가처럼 작동한다
→ 애매하면 등록을 안 하게 된다 ← 가장 나쁜 결과
[아는 팀] "이상 보고했고 조사 결과 의도된 동작으로 분류됨"
→ 정상적인 절차의 한 갈래일 뿐이다
→ 애매해도 일단 보고한다반려(Rejected)가 실패가 아니라 분류 결과가 된다. 모듈 6 레슨 1에서 본 결함 생명주기의 Rejected 상태가 이 관점에서 다시 읽힌다.
관계를 한 그림으로
[사람] [산출물] [실행] [보고]
오류 → 결함 → 실패 → 인시던트
(error) (defect/fault) (failure) (incident)
실수 코드·문서에 남은 결점 관찰된 사건 조사 대상 기록
↑ ↓
조사로 도달 테스터가 목격
└────── 이상(anomaly) ──────┘
"뭔가 어긋난 것"의 중립적 이름리포트에 적는 것은 실패의 증상이고, 고치는 것은 결함이다. 이 둘을 섞으면 리포트가 모호해진다.
리포트에서 정확한 대상 가리키기
용어를 아는 것의 실익은 문장에서 나온다.
✗ "로그인 버그"
→ 무엇을 가리키는지 모호하다
✓ 제목(실패의 증상): 비밀번호 20자 입력 시 로그인 실패
원인(결함의 위치): 인증 API의 입력 길이 검증이 16자로 하드코딩됨
영향(실패의 범위): 20자 이상 비밀번호 사용자 전원 로그인 불가제목은 실패로 쓰고, 원인은 결함으로 쓴다. 이 구조가 모듈 6에서 배운 "개발자가 되묻지 않는 결함 리포트"의 언어적 토대다.
지표가 달라진다
용어를 섞어 쓰면 숫자의 뜻이 흔들린다.
| 지표 이름 | 무엇을 세는가 | 섞였을 때의 문제 |
|---|---|---|
| 이상 보고 건수 | 테스터가 보고한 모든 관찰 | 테스트 활동량 지표 |
| 결함 건수 | 조사 결과 결함으로 확정된 것 | 제품 품질 지표 |
| 실패 건수 | 실행 중 관찰된 실패 사건 | 하나의 결함이 여러 실패를 만든다 |
결함 1건이 실패 50건을 만들 수 있다
→ "실패 50건"과 "결함 1건"은 같은 상황의 다른 숫자다
→ 둘을 섞어 "버그 51건"이라고 보고하면 아무 의미가 없다경영진에게 보고하는 숫자가 이 셋 중 무엇인지 를 정하지 않으면 품질 추세 그래프가 활동량 그래프가 되기도 하고 품질 그래프가 되기도 한다. 모듈 26에서 다룬 품질 커뮤니케이션이 여기서 무너진다.
그럼 '버그'를 쓰지 말라는 건가
레슨 1의 "말과 글을 분리한다" 그대로다.
말할 때·팀 채널 "버그" → 그대로 둔다. 자연스럽고 빠르다
이슈 트래커 이슈 타입 "Bug" → 도구 기본값이다. 바꿀 실익이 적다
결함 리포트 본문 구분해서 쓴다 → 제목은 실패, 원인은 결함
대외 문서·성적서 "결함" → 표준 용어를 쓴다
지표·보고서 정의를 명시 → "결함 건수(조사 확정 기준)"고칠 곳은 리포트 본문·대외 문서·지표 정의 셋뿐이다.
한국어 대역어의 함정
영어 원어와 한국어 번역이 1:1로 안 붙는 경우가 있다.
| 원어 | 흔한 번역 | 주의 |
|---|---|---|
| defect / fault | 결함 / 결점 / 오류 | fault를 '오류'로 옮기면 error와 겹친다. 결함으로 통일한다 |
| error | 오류 / 에러 | '에러 메시지'의 에러는 실패의 증상이지 표준의 error가 아니다 |
| failure | 실패 / 장애 | 운영 맥락에서는 '장애'가 자연스럽다. 문서 안에서 통일한다 |
| anomaly | 이상 / 이상 현상 | 낯설어서 잘 안 쓰이지만 대체할 단어가 없다 |
| incident | 인시던트 / 사건 / 장애 | 운영의 '장애 대응(incident response)'과 겹친다. 맥락 표기 필요 |
fault 를 '오류'로 번역하는 문서를 만나면 특히 조심한다. 표준의
error와 정반대 위치를 가리키게 된다.
ISTQB 용어집도 'bug' 를 결함의 비공식 동의어로 다루고 'anomaly' 를 기대와 어긋난 조건 전반으로 둔다. 다만 규격과 용어집은 판·번역본마다 문구가 조금씩 다르므로, 문서에 인용할 때는 원문 정의를 확인한다. 번역본의 한 문장을 근거로 팀 규칙을 정하면 나중에 되돌려야 한다.
'하자'·'장애' — 다른 세계에서 온 두 단어
대역어 표의 다섯 줄 중 실무에서 실제로 사고를 내는 것은 '하자'와 '장애' 다. 둘은 QA 용어 체계 밖에서 들어온 말이다.
'하자' ← 계약·검수의 언어. 하자보수·하자담보책임 조항과 묶여 있다
'장애' ← 운영의 언어. 서비스가 멈춘 사건과 그 등급을 가리킨다
'결함' ← 품질 공학의 언어. 산출물 안에 정적으로 존재하는 결점세 단어가 가리키는 대상의 범위가 다르다. 결함은 아무도 겪지 않았어도 결함이고, 장애는 사용자가 겪어야 장애이고, 하자는 계약이 약속한 수준에 못 미친 것이다. 고쳐야 할 코드가 하나여도 세 문서가 세 가지로 센다.
계약서의 '하자' 는 특히 조심한다. 검수 회의에서 "결함 12건" 이라고 말한 숫자가 상대 회의록에 "하자 12건" 으로 적히면, 그 줄은 품질 보고가 아니라 의무의 범위에 관한 진술이 되어버린다. 숫자를 그대로 넘기는 대신 집계 기준을 함께 적는다.
경계 문구 — 계약상 '하자' 의 법적 범위와 책임은 법무·계약 담당자가 판단할 영역이다. 이 레슨은 "QA 의 '결함' 과 같다고 가정하지 말라" 까지만 말한다. 실제 해석이 필요한 자리에서는 전문가 확인을 받는다.
대외 문서 세 종류에 어떤 말을 쓰나
레슨 1의 "말과 글을 분리한다" 를 이 용어 체계에 적용하면 문서 유형별로 답이 갈린다.
| 문서 | 쓰는 말 | 이유 |
|---|---|---|
| 시험성적서·시험 결과 보고 | 결함 / 이상 | 관찰한 것이 이상이고 판정으로 확정한 것이 결함이다. '장애' 는 운영 사건이라 성적서에 들어갈 자리가 없다 |
| 계약·검수 산출물 | 상대 문서의 용어를 그대로 | 발주처가 '하자' 를 쓰면 우리가 '결함' 으로 바꿔 적지 않는다. 대신 집계 기준을 각주로 붙인다 |
| 인증·심사 산출물 | 인용한 규격의 말 | IEEE 1044를 인용하면 anomaly, 29119를 인용하면 incident |
| 운영 보고·사후 분석 | 장애 / 인시던트 | 사용자가 겪은 사건이 단위다 |
| 릴리즈 판정 | 결함 | 고칠 대상의 수가 기준이다(모듈 4 레슨 5) |
두 번째 줄이 레슨 1의 원칙과 반대로 보인다. 대외 문서는 표준 용어로 쓰라고 했는데 여기서는 상대의 용어를 따르라고 한다. 차이는 그 문서가 누구의 문서인가 다. 우리가 발행하는 성적서는 우리가 용어를 고르고, 상대가 발행한 계약서의 용어는 우리가 바꿀 권한이 없다. 바꿔 적으면 그것 자체가 해석 행위가 된다.
'장애' 와 '결함' 을 한 표에 넣으면 숫자가 둘 다 거짓이 된다
가장 비싼 혼용이 이것이다. 두 집계는 모집단도 단위도 닫히는 조건도 다르다.
| 결함 집계 | 장애 집계 | |
|---|---|---|
| 세는 것 | 고칠 대상(산출물의 결점) | 사용자가 겪은 사건 |
| 모집단 | 테스트·리뷰에서 발견된 것 | 운영 중 발생한 것 |
| 같은 원인의 재발 | 중복으로 병합한다 | 별건으로 센다 |
| 닫히는 조건 | 수정·검증 완료 | 서비스 복구 |
| 읽는 사람 | 개발·QA | 운영·경영(모듈 26) |
결함 1건(인증 토큰 만료 처리 누락)
→ 장애 3건(3월 2일·3월 9일·3월 16일 각각 로그인 불가)
→ 하자 0건 또는 1건(계약의 판단 기준에 따라 다르다)
같은 하나를 세 문서가 1 · 3 · 0~1 로 센다. 전부 맞는 숫자다.둘을 한 대시보드에 올리면 양쪽이 동시에 거짓이 된다. 장애를 결함 표에 넣으면 결함 밀도가 부풀고(모듈 6 레슨 5), 결함을 장애 표에 넣으면 가동률 집계가 망가진다. 한쪽만 고쳐도 다른 쪽은 그대로 거짓으로 남는다.
섞였는지 확인하는 질문이 하나다. "이 표의 한 행이 닫히는 조건이 무엇인가?" 수정 완료와 서비스 복구가 한 열에 섞여 있으면 그 표는 이미 두 가지를 세고 있다.
도구의 이슈 타입과 용어 체계는 어디까지 맞추나
도구에서 이 다섯 용어를 그대로 구현할 필요는 없다. 손댈 자리가 정해져 있다.
| 용어 체계 | 도구에서 대응되는 것 | 손대야 하나 |
|---|---|---|
| 이상(anomaly) | 이슈 타입 Bug 의 등록 직후 상태 | 아니다 — 기본값으로 둔다 |
| 결함(defect) | 분류가 끝난 Bug | 아니다 |
| 의도된 동작 | 해결(Resolution) 값 | 여기를 손댄다 |
| 환경·테스트 자산 문제 | 해결 값 또는 별도 이슈 타입 | 여기를 손댄다 |
| 인시던트·장애 | 다른 프로젝트·다른 큐 | 섞여 있으면 분리한다 |
이슈 타입 이름을 Anomaly 로 바꾸는 것은 거의 항상 손해다. 이름을
바꿔도 사람들은 '버그' 라고 부르고, 연동된 자동화·대시보드·필터만 깨진다.
모듈 6 레슨 4의 필드 설계 원칙이 그대로 적용된다 — 이름보다 값과 구조가
집계를 만든다.
효과가 나는 지점은 해결 값과 큐 분리 둘이다. 해결 값이 Fixed·Won't Fix 둘뿐이면 의도된 동작과 환경 문제가 전부 Won't Fix 로 들어가고,
그러면 집계에서 이 셋을 나눌 수 없다. 원인을 제품·테스트 자산·환경으로
나누는 분류 절차 자체는 모듈 8 레슨 5가 다루고, 이 레슨에서 할 일은
그 분류가 들어갈 칸을 도구에 만들어 두는 것 이다.
용어를 바꾼 날을 기록한다
지표의 이름이나 집계 기준을 바꾸면 그 전후의 숫자가 비교 불가능해진다 — 레슨 2(판 개정)·레슨 7(등급 체계)과 같은 문제다.
| 바꾼 것 | 끊기는 것 | 해야 할 일 |
|---|---|---|
| "버그 건수" → "결함 건수(확정 기준)" | 추세선. 확정 기준은 항상 더 작은 숫자 다 | 전환 시점 주석 |
| 장애를 결함 표에서 분리 | 과거 결함 건수가 갑자기 줄어 보인다 | 분리 전 혼입 건수를 함께 적는다 |
| 해결 값 세분화 | 과거의 Won't Fix 는 되살릴 수 없다 | 과거는 그대로 두고 전환일만 남긴다 |
과거 데이터를 다시 라벨링하지 않는다. 재판정 비용이 얻는 것보다 크고, 재판정 자체가 또 하나의 기준 변경이 된다. 그래프에 세로선 하나와 "3월부터 확정 기준" 한 줄이면 충분하다.
사례 — 결함과 장애가 한 큐에 있던 11개월
공공 시스템 운영 이관 후의 SM 팀이다. Jira 프로젝트 하나에 결함과 장애를 같이 등록 했고, 11개월간 누적 1,860건 이 쌓였다.
실패. 분기 품질 보고에 "결함 건수 감소 추세" 로 올렸는데, 발주처 운영 점검에서 "같은 장애가 세 번 났는데 집계에 1건으로 보인다" 는 지적을 받았다.
원인. 1,860건 중 장애 기원이 412건 이었다. 결함 운영 규칙이 "같은 원인의 재발은 중복 병합" 이어서, 장애 재발이 병합되어 사라졌다. 반대 방향의 오염도 있었다 — 서비스 복구와 함께 Closed 로 닫힌 건이 87건 있었고, 그중 코드가 수정되지 않은 것이 대부분이었다.
바꾼 것. 큐를 둘로 나눴다(결함 프로젝트 / 운영 인시던트 프로젝트).
둘을 잇는 링크 타입 caused by 를 하나 만들었다. 해결 값에 As Designed·Environment·Test Asset 을 추가했다. 과거 1,860건은 손대지
않고 전환일 주석 한 줄 만 남겼다.
결과. 다음 분기에 장애 재발이 9건으로 집계 됐고(이전 기준으로는 3건이었다), 결함 쪽 Closed 중 미수정 건이 87건에서 4건 으로 줄었다. 그리고 링크가 쌓이자 장애 412건의 원인 결함이 71건 이라는 것이 보였다.
- 거짓이었던 쪽은 둘 다였다. 결함 추세는 부풀고 장애 재발은 지워졌다. 한쪽만 고치면 다른 쪽은 그대로 거짓으로 남는다
- 링크 타입 하나가 분리의 비용을 갚았다. 큐를 나누면 "그럼 둘의 관계는"
이 남는데,
caused by한 줄이 그 질문을 데이터로 만든다 - 용어 문제로 보였던 것이 자리 문제였다. 단어를 고르는 대신 표를 나누는 것 이 답이었다
실무에서 왜 필요한가
반려가 개인 평가로 작동하지 않는다
'이상 → 조사 → 분류'라는 구조를 팀이 공유하면 반려가 정상 절차가 된다. 그러면 애매한 것도 일단 보고하게 되고, 그게 발견율을 올린다. 반대로 반려를 실패로 취급하는 팀에서는 테스터가 확신 없는 관찰을 삼키게 되는데, 그중에 진짜가 섞여 있다.
지표가 의미를 갖는다
"이번 스프린트 버그 40건"이 무엇을 뜻하는지 아무도 모른다. "이상 보고 40건, 그중 결함 확정 28건, 의도된 동작 9건, 환경 3건"은 세 가지를 동시에 말한다 — 테스트 활동량, 제품 품질, 요구사항 명세의 모호함(의도된 동작이 많다는 것은 명세가 불명확하다는 신호다).
개발과의 대화가 짧아진다
"이거 버그예요"로 시작하는 대화는 "버그 아닌데요"로 이어진다. "이 동작이 명세와 어긋나 보여서 이상으로 등록했습니다. 의도된 동작이면 명세에 추가해 주세요"로 시작하면 논쟁이 아니라 확인 작업 이 된다.
채용시장에서의 위치
이 주제는 용어 퀴즈처럼 물어오지만 답에서 운영 경험이 드러나는 자리다. 정의를 외운 답과 집계를 책임져 본 답이 한 문장에서 갈린다.
| 질문 | 약한 답 | 강한 답 |
|---|---|---|
| "버그와 결함의 차이가 뭔가요?" | "같은 말입니다" | "'버그' 는 맥락에 따라 결함·실패·이상을 다 가리킵니다. 그래서 리포트 제목은 실패로, 원인 칸은 결함으로 나눠 씁니다" |
| "왜 '이상(anomaly)' 이라는 말이 따로 있나요?" | "표준에 그렇게 적혀 있습니다" | "발견 시점에는 결함인지 알 수 없기 때문입니다. 중립적 이름이 있어야 반려가 개인 평가로 작동하지 않습니다" |
| "결함 건수는 어떻게 세세요?" | "등록된 이슈 수입니다" | "등록 기준과 확정 기준을 구분합니다. 전자는 테스트 활동량이고 후자가 제품 품질입니다" |
| "장애와 결함을 같은 표에서 관리하면요?" | "구분이 안 됩니다" | "닫히는 조건이 달라서 양쪽이 동시에 거짓이 됩니다. 결함은 수정 완료로, 장애는 복구로 닫힙니다" |
| "팀 용어를 표준으로 통일하시겠어요?" | "전부 결함으로 바꿉니다" | "대화는 그대로 두고 리포트 본문·대외 문서·지표 정의 셋만 고칩니다" |
네 번째가 가장 변별력이 크다. 앞의 셋은 용어집을 읽으면 답할 수 있지만, 네 번째는 두 집계를 동시에 책임져 본 사람만 하는 걱정이다. "구분이 안 된다" 는 답은 틀리지 않았지만 불편함을 말한 것이고, "양쪽이 동시에 거짓이 된다" 는 답은 그 표를 보고 의사결정하는 사람이 있다는 것을 안다 는 신호다. 면접관이 이어서 "그럼 어떻게 나누셨어요" 를 물으면, 큐 분리와 링크처럼 설정 수준의 구체성 이 나올 수 있어야 한다.
세 번째도 같은 역할을 한다. 결함 건수를 묻는 질문에 숫자 하나로 답하는 사람과 "어느 시점 기준으로 말씀드릴까요" 를 되묻는 사람의 차이는, 그 숫자가 경영 보고로 올라가 본 적이 있는지에서 온다. 그 다음에 거의 반드시 "반려된 건은 어디로 가나요" 가 따라오는데, 반려 사유를 갈래로 나눠 둔 경험 이 있으면 대화가 개선 활동 이야기로 넘어간다.
공고 표현으로는 "결함 관리 프로세스 수립", "품질 지표 정의·보고", "운영 품질 관리" 가 이 레슨에 걸린다. 특히 개발과 운영을 함께 보는 포지션 (SM·서비스 운영 인접 QA)에서는 장애와 결함을 분리해 본 경험이 그대로 평가 항목이 된다.