470. TDD (Test Driven Development) 생명주기 - 실패하는 테스트 작성(Red) -> 통과하는 최소 코드 작성(Green) -> 리팩토링(Refactor)
핵심 인사이트 (3줄 요약)
- 본질: TDD(테스트 주도 개발)는 테스트 기술이 아니다. 먼저 "어떻게 동작해야 하는지" 목표(테스트 코드)를 세우고(Red), 억지로라도 돌아가게 만들며(Green), 더러워진 구조를 아름답게 다듬는(Refactor) 과정을 무한 반복하는 **'피드백 주도형 소프트웨어 아키텍처 설계 기법'**이다.
- 가치: "코드를 다 짜고 나서 테스트를 짜려니 귀찮아서 안 짠다"는 인간의 본성을 완벽하게 타파한다. 배가 부르기 전(코딩 전)에 방어막(테스트)부터 치게 강제함으로써, 버그 발생률을 극단적으로 낮추고, 거대한 코드를 만질 때 "다른 곳이 터지지 않을까?"라는 공포심을 "언제든 뜯어고칠 수 있다"는 강철 같은 자신감(Confidence)으로 치환한다.
- 융합: 객체의 역할을 밖에서부터 조립해 들어가는 **의존성 주입(DI)**과 테스트 더블(Mock/Stub) 철학을 강제로 융합시키며, 지속적 테스팅(CI/CD) 파이프라인의 가장 견고한 바닥 돌(Foundation)로서 애자일(Agile) 속도전의 척추 역할을 수행한다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: TDD(Test Driven Development)는 켄트 벡(Kent Beck)이 창안한 익스트림 프로그래밍(eXtreme Programming)의 핵심 실천법이다. 전통적 코딩은
[설계 -> 프로덕션 코드 작성 -> 테스트 코드 작성]순서다. TDD는 이 우주를 뒤집어버린다. **[실패하는 테스트 코드 먼저 작성 -> 억지로 테스트 통과시키는 프로덕션 코드 작성 -> 썩은 코드 리팩토링]**의 기괴한 순서를 밟는다. 목표를 먼저 세우고 그 목표를 달성하는 코드를 역추적해 짜는 것이다. -
필요성: 3년 된 쇼핑몰 시스템이 있다. 할인 쿠폰 함수 100줄을 조금 우아하게 고치고 싶다(리팩토링). 그런데 코드를 살짝 바꿨더니 다른 쪽에서 결제가 터질까 봐 무서워서 손이 벌벌 떨린다. 방어막(테스트 코드)이 1개도 없기 때문이다. 그래서 개발자들은 더럽고 냄새나는 스파게티 레거시 코드를 "돌아가기만 하면 절대 만지지 마라!"라는 불문율로 방치한다. 이렇게 회사의 기술 부채가 쌓여 시스템이 파산한다. 코드를 과감하게 다 뜯어고쳐도 1초 만에 든든하게 뒤를 받쳐주는 '촘촘한 그물망(Test Suite)'을 태초부터 강제로 짜기 위해 TDD라는 족쇄가 필요하다.
-
💡 비유: TDD는 체조 선수가 공중제비(리팩토링)를 돌기 전에, 바닥에 **'두꺼운 안전 매트리스(테스트 코드)'**부터 깔아놓는 훈련법입니다. 옛날엔 매트리스 없이 쌩바닥에서 기술(코딩)부터 부렸습니다. 떨어지면 죽으니까 무서워서 새로운 고난도 기술을 시도조차 못합니다. 하지만 매트리스(TDD 방어막)를 먼저 100% 깔아두면, 100번이고 1,000번이고 넘어져도 안 다친다는 확신이 생겨 미친 듯이 코드를 비틀고 쪼개며 가장 아름다운 회전 기술(최적의 아키텍처)을 구사할 수 있게 됩니다.
-
등장 배경 및 발전 과정:
- Test-Last의 비극: 개발자에게 "다 짜고 테스트 짜"라고 하면, 이미 뇌의 에너지를 100% 써버려서 대충
assertTrue(true)같은 쓰레기 허수아비 테스트만 만들고 퇴근했다. - 켄트 벡의 선언 (1990s): "코딩을 하기 전에 무조건 테스트부터 짜라! 닭이 먼저가 아니라 알이 먼저다!"라며 xUnit 프레임워크(JUnit의 조상)와 함께 TDD 사이클(Red-Green-Refactor)을 종교처럼 전파했다.
- 클린 아키텍처의 도구 (현재): 단순히 버그를 잡는 툴이 아니라, 외부와 단절된 객체를 만들도록(DI) 강제하는 '최고의 객체지향 설계(Design) 유도 장치'로 그 철학적 위상이 격상되었다.
- Test-Last의 비극: 개발자에게 "다 짜고 테스트 짜"라고 하면, 이미 뇌의 에너지를 100% 써버려서 대충
-
📢 섹션 요약 비유: TDD가 아닌 방식은 **'과녁판 없이 일단 활부터 쏘고, 나중에 화살이 꽂힌 곳 주변에 과녁을 그리는 꼼수'**입니다(백발백중처럼 보임). TDD는 **'빈 벽에 과녁(테스트 코드)을 뚜렷하게 먼저 그려놓고, 화살(프로덕션 코드)이 정확히 정중앙에 꽂힐 때까지 끝없이 영점 조절(리팩토링)을 하는 저격수의 훈련법'**입니다. 과녁을 먼저 그려야만 명중을 증명할 수 있습니다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
1. TDD의 신성한 생명주기 (Red ➡ Green ➡ Refactor)
이 3단계의 바퀴(Cycle)를 벗어나는 순간 TDD가 아니다. 하나의 사이클은 5분을 넘기면 안 된다.
- 🔴 RED (실패하는 테스트 작성)
- 아직
Calculator.add()라는 함수(프로덕션 코드) 자체를 아예 안 만들었다. - 그런데 뻔뻔하게 테스트 파일에
assertEquals(3, Calculator.add(1, 2));라고 쓴다. - 당연히 함수가 없으니 컴파일 에러나 새빨간 실패(Red)가 뜬다. (목표 설정 완료)
- 아직
- 🟢 GREEN (최소한의 코드로 테스트 통과)
- 목표는 무조건 빨간불을 초록불(Green)로 바꾸는 것이다.
public int add(int a, int b) { return 3; }라고 미친 척하고 상수를 하드코딩해서 그냥 속임수로 1초 만에 테스트를 무식하게 통과시킨다. (일단 돌아가는 꼼수 확보)
- 🔵 REFACTOR (더러운 코드를 우아하게 리팩토링)
- 방금 하드코딩으로 만든 추악한 코드를
return a + b;로 제대로 고친다. - 고치는 와중에 혹시 잘못 고쳤더라도, 아까 짜둔 1번의 촘촘한 테스트가 0.1초 만에 삐빅! 하고 빨간불로 비명을 지르며 나를 지켜준다. (심리적 안정감 속에서 예술적 설계 적용)
- 방금 하드코딩으로 만든 추악한 코드를
2. TDD의 부수 효과: 아키텍처 설계 유도기 (Design Tool)
초보자들은 TDD를 "버그 없는 코드 짜기"로 오해하지만, 초고수들은 TDD를 **"결합도가 박살 난 우아한 객체를 강제하는 설계 도구"**로 쓴다.
-
의존성 혐오증: 내가
Order클래스를 테스트 먼저(Red) 짜려고 한다. 그런데 안에 진짜 DB(Oracle)가 박혀있으면 테스트 환경 세팅을 할 수가 없다. "아씨, 테스트부터 짜려니까 빡세네. 밖에서 인터페이스로 찔러넣게(DI) 설계 구조를 바꿔야겠다!" -
마법의 결과: 테스트 코드를 먼저 짜려고 낑낑거리다 보면, 필연적으로 콘크리트 코드를 찢어내어 인터페이스와 테스트 더블(Mock)로 외부 의존성을 덜어내는 완벽한 SOLID(객체지향) 설계로 코드가 스스로 진화(Driven)하게 된다. 이것이 TDD(테스트 주도 설계)의 진짜 흑마법이다.
-
📢 섹션 요약 비유: Red-Green-Refactor는 **'찰흙으로 도자기 만들기'**입니다. 처음에 대충 뼈대 철사를 세웁니다(Red). 철사에 진흙을 무식하게 한 움큼 덕지덕지 발라서 억지로 항아리 모양을 만듭니다(Green 꼼수). 모양이 안 넘어지고 돌아가는 게 확보되면, 물레를 윙~ 돌리면서 손칼로 예쁘고 정교하고 매끄럽게 깎아냅니다(Refactor). 처음부터 완벽하고 얇은 도자기를 빚으려다 와르르 무너지는 완벽주의자의 함정을 파괴하는 마법의 3박자입니다.
Ⅲ. 융합 비교 및 다각도 분석
1. TDD (Test-Driven) vs BDD (Behavior-Driven)
TDD가 훌륭하지만 '기획자와의 소통 단절'이라는 문제가 터지자 진화형(BDD)이 나타났다.
| 척도 | TDD (테스트 주도 개발) | BDD (행위 주도 개발) |
|---|---|---|
| 포커스 | 이 **'함수(Method)'**가 5를 뱉어내는가? | 사용자가 이 **'행위(Behavior)'**를 하면 목적을 이루는가? |
| 테스트 코드 모습 | assertEquals(5, calc.add(2,3)); (자바 문법으로 가득 찬 개발자 전용 외계어) | Given(상황) - When(버튼 누름) - Then(성공) (기획자도 읽을 수 있는 평범한 영어 소설책) |
| 작성/주도 주체 | 개발자 (Developer) | 기획자(PO) + QA + 개발자 (Three Amigos) |
| 도구 (Framework) | JUnit, NUnit, PyTest | Cucumber, JBehave |
| 관계 | 집 지을 때 벽돌이 안 깨지는지 망치로 때려봄 | 다 짓고 거실에서 생활하기 편한지 살아봄 |
과목 융합 관점
-
마이크로서비스 아키텍처 (격리와 경계): TDD의 런던 학파(Mockist) 사상은 MSA 시대에 꽃을 피웠다. 50개의 서비스가 거미줄처럼 얽혀있을 때, 내 서버를 테스트하기 위해 남의 서버를 띄울 필요가 없다. TDD를 할 때 모든 외부 API 호출 구간을 철저히 Mock과 Stub(테스트 더블)으로 잘라내고 내 로직만 순수하게 돌린다. TDD가 인프라 레벨의 결합도를 끊어내는 철학적 베이스캠프가 된 것이다.
-
데브옵스 (CI 파이프라인의 수호자): 젠킨스(Jenkins)에 1만 개의 테스트를 태워 자동화(지속적 통합, CI)를 했다 쳐보자. 만약 TDD로 안 짜고 "다 짜고 나중에 대충 짠" 엉터리 허수아비 테스트 1만 개라면? 젠킨스에 파란불(Pass)이 떠도 라이브 서버는 여전히 폭발한다. CI/CD 파이프라인이 단순한 '장난감'으로 전락하지 않고 진짜 '수문장(Quality Gate)'의 위엄을 뽐내려면, 모든 테스트 코드가 태초의 기획(Red)을 깐깐하게 물고 태어난 TDD산 순종이어야만 한다.
-
📢 섹션 요약 비유: TDD가 기계 내부의 **'엔진 톱니바퀴 맞물림 엑스레이 검사'**라면, BDD는 소비자가 볼 수 있는 **'사용자 매뉴얼(설명서) 자체를 검사기로 쓰는 것'**입니다. 아무리 톱니바퀴(TDD)가 예쁘게 맞물려도, 설명서에 적힌 "버튼 누르면 커피 나옴(BDD)"이 안 지켜지고 핫초코가 나오면 실패한 시스템입니다. 둘은 완벽한 시너지를 이룹니다.
Ⅳ. 실무 적용 및 기술사적 판단
실무 시나리오
-
시나리오 — TDD 맹신주의가 부른 끔찍한 생산성 저하와 폐기: 팀장이 어떤 책을 읽고 뽕을 맞아 "오늘부터 모든 코드는 100% TDD로 짠다! Getter/Setter 하나도 예외 없이 무조건 Red-Green 해!"라고 강압했다. 개발자들은 DB에서 이름 하나 읽어오는 단순 로직을 짜기 위해 Mock 대본을 50줄씩 타이핑하는 노가다에 지쳐 쓰러졌다. 개발 속도가 3배 느려졌고, 결국 야근에 지친 팀원들이 "TDD는 탁상공론의 쓰레기다!"라며 파업을 선언해 TDD 문화 자체가 사내에서 영구 제명되었다.
- 아키텍트의 해결책: 도메인의 복잡도(Complexity)를 무시한 맹목적 100% 강요 안티패턴이다. TDD는 만병통치약이 아니다. 단순한 게시판 CRUD나, UI 화면 껍데기를 그릴 때 TDD를 적용하는 것은 소 잡는 칼로 파리를 써는 짓이다. 아키텍트는 "핵심 결제 로직이나 할인율 계산 등 **복잡한 비즈니스 코어(Core Domain)**에만 TDD를 강제하고, 단순 DB 매핑 껍데기(DAO)나 컨트롤러는 자유롭게 방임하라"는 실용주의적 가이드라인을 세워 팀원들의 인건비 번아웃을 막아내야 한다.
-
시나리오 — 방치된 Refactor(리팩토링) 단계, 괴물이 된 테스트 코드: 개발자들이 Red(목표)와 Green(통과)까지는 재밌게 잘했다. 초록불(Pass)이 딱 뜨니까 기분이 너무 좋아서, "오 돌아가네? 다음 기능 개발하자!"라며 3단계인 Refactor(우아하게 코드 다듬기) 단계를 스킵하고 도망가버렸다. 결과적으로 라이브 서버에는 Green을 통과하기 위해 임시방편으로 짜놓은 복붙(Copy & Paste) 쓰레기 코드와 하드코딩된 괴물 덩어리들이 덕지덕지 쌓여 레거시 폭탄으로 돌변했다.
- 아키텍트의 해결책: TDD 생명주기의 3번째 축(Refactor) 붕괴다. 켄트 벡은 "작동하는 깔끔한 코드(Clean code that works)"를 목표로 했다. 초록불(Green)은 끝이 아니라 리팩토링의 든든한 면허증(면책특권)을 갓 따낸 시작점일 뿐이다. 아키텍트는 페어 프로그래밍(Pair)이나 깐깐한 코드 리뷰 문화를 통해, "초록불 띄워놓은 더러운 코드를, 중복을 제거(DRY)하고 함수를 20줄 이내로 예쁘게 찢어(Refactoring) 놓지 않으면 절대 PR(Merge) 승인을 안 내주는 조직적 강제성"을 발동해야 한다.
도입 체크리스트
- 비즈니스적: 현재 비즈니스가 1주일 만에 MVP를 던져 반응을 봐야 하는 극초기 스타트업인가? "내일 회사가 망할지도 모르는데 촘촘한 테스트 코드 그물망부터 짜자"고 하면 투자자가 목을 조른다. 이런 '퀵 앤 더티(Quick & Dirty)'의 생존 탐색 구간에서는 TDD를 쿨하게 버려라. 하지만, 비즈니스가 시장의 검증을 통과하여 **'안정적인 장기 서비스 궤도'**에 오르고 팀원이 10명을 넘어가는 순간, 당장 모든 기능 개발을 멈추고라도 TDD 체질로 전환하지 않으면 거대한 기술 부채 폭발로 회사가 무너진다.
- 기술적: TDD 테스트 코드를 프로덕션 코드와 똑같은 수준의 1급 시민으로 대우하는가? 대충 변수명을
test1,test2로 짓고, 100줄짜리 뚱뚱한 테스트 함수를 짜고 방치하는가? 테스트 코드 자체가 "이 시스템이 어떻게 동작해야 하는지 알려주는 살아있는 백과사전(Living Documentation)"이다. 아키텍트는 테스트 코드 퀄리티를 유지하기 위한 린터(Linter)와 클린 코드 사상을 본품 코드와 똑같이 잔혹하게 들이대야 한다.
안티패턴
-
"Test-Last (나중에 몰아서 테스트 짜기)": 기능을 1주일 내내 500줄짜리 스파게티 함수로 다 짜놓고(결합도 박살), 배포 전날 부랴부랴 억지로 테스트 코드를 끼워 맞추려는 시도. 애초에 설계가 남의 객체와 콘크리트처럼 붙어있게(new) 짜여 있어서, 테스트 더블(Mock)을 주입할 구멍조차 없어 결국 "이건 복잡해서 테스트 못 짭니다!"라며 포기하게 되는 가장 뻔하고 절망적인 수순.
-
📢 섹션 요약 비유: TDD의 리팩토링(Refactor) 단계를 스킵하는 것은, 외출 전 5분 만에 **'떡진 머리에 비니 모자만 대충 덮어쓰고(Green 꼼수 통과) 소개팅을 나가는 것'**과 같습니다. 겉으로는 멀쩡해 보여서 약속 장소(빌드 통과)에는 나갔지만, 식당에서 실수로 모자가 벗겨지는 순간(유지보수, 기능 추가) 떡진 머리가 들통나서 대참사(버그 덩어리)가 벌어집니다. 모자를 썼다는 심리적 안정감 속에서, 반드시 샴푸로 머리를 감고 예쁘게 세팅하는(리팩토링) 시간 투자를 해야만 진짜 미남(클린 아키텍처)입니다.
Ⅴ. 기대효과 및 결론
정량/정성 기대효과
| 구분 | 기능을 다 짜고 나중에 수동 테스트(Test-Last) (AS-IS) | Red-Green-Refactor TDD 생명주기 강제 (TO-BE) | 개선 효과 |
|---|---|---|---|
| 정량 | 릴리즈 직후 숨어있던 크리티컬 버그 10건 발생 | 버그의 99%가 타이핑 1초 만에 로컬에서 방어됨 | 라이브 운영 환경 장애(Defect) 발생률 90% 이상 우주 방어 |
| 정량 | 스파게티 코드가 무서워 사소한 구조 변경에 3일 낭비 | 1만 개 그물망(Test Suite) 믿고 1시간 만에 구조 다 뜯어고침 | 리팩토링 및 신기능 추가 리드타임 80% 극적 가속 |
| 정성 | "이거 배포했다가 터지면 내 목 날아가는데.." 공포증 | "빨간불 안 뜨면 100% 돌아간다"는 종교적 신념 | 개발 피로도(Burnout) 하락 및 압도적 코드 자부심(Confidence) 획득 |
미래 전망
- AI TDD (Prompt-Driven TDD): 개발자가 "로그인 실패 5번 시 잠금"이라는 목표(Red)를 주석으로 딱 한 줄 남기면, 깃허브 코파일럿(Copilot)이 알아서 JUnit 실패 테스트 코드를 1초 만에 타이핑해 준다. 그다음 AI가 스스로 "어? 빨간불이네?" 하고 비즈니스 프로덕션 코드(Green)를 토해내어 초록불을 맞춘다. 마지막으로 "코드 좀 예쁘게(Refactor) 다듬어봐"라고 명령하면 3단계 사이클을 AI가 스스로 무한 회전하는, 인간의 타이핑이 소멸하는 AI 자가 진화 TDD 시대가 오고 있다.
- 아키텍처 단위의 피트니스 함수 (Evolutionary Architecture): 코드 1줄(메소드) 단위의 쪼잔한 TDD를 넘어, 아예 시스템 거대 설계 단위의 TDD로 확장되었다. "A 마이크로서비스는 절대 B 마이크로서비스의 DB를 찔러선 안 돼"라는 거대한 목표(Red)를
ArchUnit같은 툴로 규약(테스트)으로 박아버린다. 만약 신입이 몰래 남의 DB를 찌르는 코드를 짜면, 젠킨스 빌드가 삐용삐용 터지면서 아키텍처 자체의 붕괴를 막아내는 진화적 아키텍처(Evolutionary Architecture) 기반의 무결점 시스템으로 사상이 거대하게 스케일 업(Scale-up)되고 있다.
참고 표준
- Kent Beck (켄트 벡): "테스트 주도 개발(Test-Driven Development by Example)"이라는 책을 써서 전 세계 프로그래머들에게 Red-Green-Refactor라는 종교적 율법을 하사한 익스트림 프로그래밍(XP)의 창시자.
- xUnit 프레임워크: JUnit(Java), NUnit(C#), PyTest(Python) 등 세상의 모든 언어가 TDD를 빛의 속도로 돌리고 초록불/빨간불 UI를 띄워줄 수 있게 만들어진 표준 자동화 프레임워크 생태계.
TDD(테스트 주도 개발)는 버그를 잡는 돋보기가 아니다. 그것은 타락하고 게으른 프로그래머의 영혼을 구원하는 **'스파르타식 금욕과 훈련의 절대 규율'**이다. 우리는 코딩을 하다 보면 빨리 성과 화면을 보고 싶은 조급함(Green의 유혹)에 빠져, 뚱뚱하고 추잡한 1,000줄짜리 하드코딩 덩어리를 낳게 되는 나약한 인간이다. 기술사는 켄트 벡의 가르침을 빌려, 개발자들의 손목에 Red라는 족쇄를 채우고, 촘촘한 테스트 그물망이라는 완벽한 면책 특권을 쥐여주어야 한다. 가장 두려운 리팩토링의 낭떠러지 앞에서도 눈 감고 몸을 던질 수 있는 강철 같은 안도감, 수백만 줄의 코드를 마음대로 찰흙처럼 주무르고 부수며 가장 아름다운 아키텍처의 도자기로 깎아낼 수 있는 미친 자유로움, 그것은 오직 1만 개의 초록불(Green)이 뒤를 받쳐주는 TDD의 요람 안에서만 잉태될 수 있다.
- 📢 섹션 요약 비유: TDD 없이 거대 시스템을 짜는 것은 **'브레이크가 고장 난 페라리(포르쉐)'**를 타고 아우토반을 시속 300km로 달리는 것입니다. 엄청 빠르게 코딩하는 것 같지만 코너(요구사항 변경)가 나오면 벽을 들이박고 다 같이 피를 토하며 죽습니다(재앙). TDD는 자동차에 0.001초 만에 차를 세워주는 **'세계 최고의 카본 세라믹 브레이크(테스트 1만 개)'**를 튜닝해 넣는 것입니다. 나를 무조건 살려줄 완벽한 브레이크가 달렸다는 강렬한 믿음이 있어야만, 비로소 파일럿은 코너 앞에서 두려움 없이 엑셀을 바닥까지 끝까지 밟아댈(극한의 최적화 리팩토링) 수 있는 폭발적인 용기를 얻게 됩니다.
📌 관련 개념 맵 (Knowledge Graph)
| 개념 명칭 | 관계 및 시너지 설명 |
|---|---|
| 리팩토링 (Refactoring) | TDD 생명주기의 3번째 파편(Refactor). 이 행위가 빠진 TDD는 그냥 쓰레기를 초록색으로 포장한 껍데기일 뿐이다. 겉모습은 유지한 채 뼈대를 우아하게 발골하는 예술 작업. |
| 의존성 주입 (DI) | TDD(Red 단계)를 짜다 보면 "아, 이 코드는 밖에 묶여서 테스트가 안 되네"라는 고통을 받게 되고, 살기 위해 자연스럽게 코드를 인터페이스로 찢어 DI 구조로 만들게 된다. TDD가 낳은 최고의 아키텍처 선물. |
| 테스트 더블 (Mock/Stub) | TDD로 코드를 격리하고 단위(Unit)를 자를 때, 잘라낸 혈관에 피가 새지 않게 꽂아 넣는 환상의 가짜 인형들. 이것이 없으면 테스트가 너무 무거워져 TDD 속도(5분)가 붕괴한다. (이전 장 458번) |
| BDD (Behavior-Driven) | "테스트 코드가 몬 소린지 기획자는 1도 모르겠는데요?"라는 불만을 깨부수고, Given-When-Then 이라는 영어 소설책 구조로 TDD를 포장하여 전 직원에게 팔아먹은 애자일 진화형. |
| 지속적 통합 (CI) | 각자의 컴퓨터에서 10,000번 TDD 초록불을 띄운 파편화된 코드들을 젠킨스라는 거대한 용광로에 합쳐서(Merge) 다시 한번 단체로 초록불이 뜨는지 돌려보는 전사적 합창 교향곡. |
👶 어린이를 위한 3줄 비유 설명
- 내가 레고 집을 만들 때 보통은 그냥 손에 잡히는 대로 벽돌을 막 쌓아 올리죠?(일반 코딩). 그럼 나중에 1층이 삐뚤어져서 다 부서질 때가 많아요.
- 그래서 새로운 방법을 썼어요. 먼저 종이에 **"문은 10cm 크기여야 해!(빨간불/목표)"**라고 적고, 10cm 문 뼈대만 대충 어떻게든 맞춘 다음(초록불/임시통과), 안 무너지는 걸 확인하고 예쁜 색깔 블록으로 다시 튼튼하게 교체했어요(리팩토링/다듬기).
- 이렇게 무작정 벽돌부터 쌓는 게 아니라, 항상 목표와 검사 도구를 먼저 놔두고 조금씩 안전하게 깎아 나가는 똑똑한 조립 훈련법을 **'TDD (테스트 주도 개발)'**라고 부른답니다!