테스트 주도 개발 (TDD, Test-Driven Development) - Red-Green-Refactor
핵심 인사이트 (3줄 요약)
- 본질: TDD (Test-Driven Development)는 실패하는 테스트를 먼저 쓰고, 그 테스트를 통과하는 최소 코드만 작성하는 개발 방식이다.
- 가치: Red-Green-Refactor 사이클은 요구사항을 작게 쪼개고, 회귀를 줄이며, 설계의 응집도를 높인다.
- 판단 포인트: TDD는 만능이 아니라, 핵심 로직과 경계 조건이 많은 영역에서 특히 효과가 크다.
Ⅰ. 개요 및 필요성
전통적인 개발은 코드를 먼저 만들고 나중에 테스트를 붙이는 경우가 많다. 이 방식은 빠르게 보이지만, 기능이 늘수록 무엇이 맞는지 잊어버리기 쉽다. TDD는 순서를 뒤집어 "무엇이 맞는가"를 먼저 적게 만든다.
실패하는 테스트는 요구사항을 구체적으로 만든다. 즉, 코드가 아니라 행동(behavior)을 먼저 정의하게 하므로, 개발 중간에 방향을 잃을 확률이 줄어든다.
📢 섹션 요약 비유: 정답지를 먼저 보고 문제를 푸는 것이 아니라, 먼저 문제를 보고 답을 맞추는 방식이다.
Ⅱ. 아키텍처 및 핵심 원리
TDD의 기본 사이클은 Red → Green → Refactor다. Red는 실패하는 테스트 작성, Green은 최소 구현, Refactor는 중복 제거와 구조 개선이다. 핵심은 한 번에 많이 고치지 않고, 작은 단위로 검증하는 데 있다.
| 단계 | 의미 | 산출물 |
|---|---|---|
| Red | 실패하는 테스트 먼저 작성 | 요구사항 명세 |
| Green | 통과할 최소 코드 작성 | 동작하는 코드 |
| Refactor | 구조 정리 | 유지 가능한 코드 |
실패하는 테스트(Red)
│
▼
최소 구현(Green)
│
▼
리팩토링(Refactor)
│
└──── 다음 테스트로 반복
AAA (Arrange-Act-Assert) 구조를 사용하면 테스트 본문이 읽기 쉬워지고, fixture와 mock을 적절히 쓰면 테스트가 외부 상태에 덜 흔들린다. TDD는 테스트 작성 기술이 아니라, 설계를 작게 나누는 습관이다.
📢 섹션 요약 비유: 연습 문제를 하나 풀고, 채점하고, 답안을 다듬는 과정을 계속 반복하는 것과 같다.
Ⅲ. 비교 및 연결
TDD는 일반적인 테스트 자동화와 연결되지만 같지는 않다. 자동화는 이미 있는 코드를 빠르게 검사하는 도구이고, TDD는 테스트를 설계의 출발점으로 삼는다. BDD (Behavior-Driven Development)는 행위 중심의 명세를 더 강조한다.
| 구분 | TDD | 일반 테스트 | BDD |
|---|---|---|---|
| 시작점 | 테스트 | 코드 | 행동 시나리오 |
| 중심 | 기술적 동작 | 회귀 검사 | 사용자 관점 |
| 장점 | 설계 개선 | 빠른 검증 | 소통 강화 |
TDD는 unit test와 잘 맞지만, integration test까지 모두 대체하지는 않는다. 즉 작은 안전망과 큰 안전망을 함께 봐야 한다.
📢 섹션 요약 비유: 짧은 메모로 방향을 잡는 것과, 여행 계획서 전체를 쓰는 것은 서로 다른 수준의 준비다.
Ⅳ. 실무 적용 및 기술사 판단
TDD는 계산 로직, 상태 전이, 규칙 엔진, 버그 재현처럼 경계 조건이 분명한 영역에서 효과가 크다. 반면 UI를 지나치게 세밀하게 테스트하면 수정이 잦아질수록 테스트가 먼저 깨진다.
- 채택: 규칙이 복잡하고, 리팩토링이 잦고, 회귀 비용이 큰 영역
- 회피: 구현 세부를 과도하게 검증하는 취약한 테스트
- 체크리스트
- 테스트가 행동을 검증하는가, 구현 세부를 검증하는가?
- 한 테스트가 너무 많은 것을 묻고 있지 않은가?
- 실패 메시지로 원인이 바로 보이는가?
- 테스트가 먼저 쓰여 실제 요구를 선명하게 만들었는가?
TDD는 "테스트를 쓰는 법"보다 "작게 설계하는 법"에 더 가깝다. 그래서 설계 품질과 연결해서 설명해야 한다.
📢 섹션 요약 비유: 먼저 빈 답안지를 만들고, 그 칸에 맞춰 공부하는 방식이다.
Ⅴ. 기대효과 및 결론
TDD는 회귀를 줄이고, 설계를 명확하게 하며, 변경에 대한 자신감을 높인다. 결국 이 개념은 "테스트가 나중에 따라오는 문서가 아니라, 처음부터 설계를 이끄는 기준"으로 기억하면 된다.
📢 섹션 요약 비유: 길을 먼저 그려 놓고 걸으면, 돌아갈 일도 줄어든다.
📌 관련 개념 맵
| 개념 | 연결 포인트 |
|---|---|
| TDD (Test-Driven Development) | 테스트 선작성 개발 |
| AAA (Arrange-Act-Assert) | 테스트 구성 패턴 |
| BDD (Behavior-Driven Development) | 행동 명세 중심 개발 |
| fixture | 테스트 환경 준비 |
| mock | 외부 의존성 분리 |
📈 관련 키워드 및 발전 흐름도
요구사항
│
▼
실패하는 테스트(Red)
│
▼
최소 구현(Green)
│
▼
리팩토링(Refactor)
│
▼
회귀 방지와 설계 개선
👶 어린이를 위한 3줄 비유 설명
- 먼저 "어떤 답이 맞는지"를 적어 놓고 시작해요.
- 그다음 그 답에 맞는 코드를 조금씩 만들어요.
- 그래서 틀리면 바로 고치고, 잘하면 더 튼튼하게 만들 수 있어요.