TDD(Test-Driven Development)는 테스트 주도 개발이라 불리는 개발 방법론으로, 작동하는 깔끔한 코드(clean code that works)를 궁극적인 목표로 한다. TDD는 요구사항을 검증하는 단위 테스트를 먼저 작성한 후, 이를 만족시키는 프로덕션 코드를 작성하고, 코드를 리팩토링하는 세 단계의 사이클을 짧고 빠르게 반복한다.
RED
: 실패하는 작은 테스트를 작성한다. 처음에는 컴파일조차 되지 않을 수 있다.GREEN
: 빨리 테스트가 통과하게끔 만든다. 이를 위해 어떤 죄악을 저질러도 좋다.REFACTORING
: 일단 테스트를 통과하게만 하는 와중에 생겨난 모든 중복을 제거한다.
기존 방식의 경우, 요구사항 분석
→ 설계
→ 프로덕션 코드 개발
→ 테스트
의 단계를 거쳐 프로그램을 개발한다. 이러한 방식은 끊임없이 변화하는 요구사항에 유연하게 대응하지 못 한다는 한계가 있다. 요구사항에 맞춰 초기 설계와 다른 방향으로 코드를 수정하는 과정에서, 코드가 원하는 대로 작동한다는 확신이 없기 때문에 불안정성과 결함률이 높아지고 결국 생산성이 저하된다.
하지만 TDD의 경우, 사이클을 짧은 주기로 반복하기 때문에 요구사항에 유연하게 대응할 수 있다. TDD 개발자는 가장 작은 단위의 기능이 작동한다는 단위 테스트를 작성하고 이를 통과(성공)시키는 프로덕션 코드를 발전시킴으로써, 기능이 작동한다는 확신을 바탕으로 코드를 자유자재로 수정하고 발전시킬 수 있다. 새로운 기능의 추가, 필요 없어진 기능의 삭제 등이 자유로워지면서 자연스럽게 코드가 간결해지고 결함률도 감소하는 것이다.
작년에 단위 테스트를 향한 갈증을 느끼고 TDD에 대해 검색해본 적이 있다. 그 때는 나 스스로도 TDD를 잘 모르니 그 실효성에 대해 공감하지도 못 했었고, 개발자 포스팅을 보면 한 절반 정도는 TDD에 대해 회의적인 입장이었다. 특히, TDD를 잘 하려면 그 전에 단위 테스트에 어떤 TC가 필요한지에 대한 경험이 필요하다는 말을 봐서, 그걸 보고 쫄아서 TDD를 포기했던 기억이 난다.
그런데 이렇게 막상 아무런 베이스 없이 바로 TDD로 프로그램을 만들어 보고 공부를 해보니, 완전 할 만했다! 재빨리 작은 테스트를 추가하는 것이 TDD의 중요한 규칙 중 하나기 때문에, 테스트가 거창하고 완벽할 필요가 전혀 없었다. 그래서 처음 접하는 건데도 남이 써 놓은 테스트보고 슬슬 모방하면서 쓰다 보면, 요구사항을 테스트로 표현하는 법을 배울 수 있었다. 뿐만 아니라, TDD를 통해 테스트를 빠르게 많이 경험하면서 Junit5, Hemcrest 같은 라이브러리도 빨리 익힐 수 있었다.
만약 테스트 전문가(ㅎ;)가 된 후에 TDD를 시작하려는 마음가짐으로 단위 테스트를 공부했다면 이렇게 빠르게 적응하지 못 했을 것이라 확신한다.
내가 원하는 기능이 돌아간다는 확신이 있으니 자신감 넘치게 프로그래밍을 할 수 있다. TDD를 하기 전에는 정말 모든 기능에 대해 콘솔창이나 Postman에서 하나하나 실행을 한 후 출력 내용을 눈으로 대조하며 확인을 했었다. 정말 시간낭비 자원낭비 체력낭비 건강낭비 그 자체였다. 그렇다고 코드 작성 후에 테스트를 작성하면, 테스트가 끼워 맞춘 느낌인데다가, 코드가 장황하고 더러워지는 경우가 많았다. 그런데 이제는 성공하는 것도, 실패하는 것도 모두 코드가 보장을 해주기 때문에 내 코드를 내가 신뢰할 수 있게 됐다.
중복을 없애고 읽기 좋은 코드를 만드는 것이 TDD의 목적이라는 것도 자신감을 많이 실어 준다. 내 코드는 혼자 허덕이면서 짜낸 그지같은 스파게티가 아니고, 이 기능만은 확실히 동작하는 잘 쓰여진 코드라고 말을 할 수 있기 때문이다. 아직까지 어디가서 말 해 본 적은 없지만..
TDD 책을 보면, 맨 앞에 TDD의 장점에 "작성하는 동안 기분이 좋다."라는 말이 적혀 있다. 근데 사실이다ㅋㅋㅋㅋ 이게 새로운 패러다임을 배워서 반짝 흥미를 느끼는 걸 수도 있지만, 아무튼 요구사항을 테스트로 표현하고, 이를 성공적으로 수행하는 코드를 깔끔하게 만들어내면 정말 짜릿하다. 이 맛에 코딩하지 싶다.
TDD의 목표가 계속 코드를 리팩토링해서 좋은 품질의 코드를 만들어내는 것이다 보니, 프로그램과 내가 함께 성장하는 게 느껴진다. 항상 더 나은 설계와 좋은 코드를 위해 고민하는 게 TDD에 아주 중요하고, 이것을 고민하는 과정이 정말 재밌다. 아직 코드 자체는 병아리 수준이지만, 그래도 이런 느낌을 유지하고 계속 성장하고 싶게 만든다. 이 느낌 잃지 않고 롱런하고 싶다.