개발자로써 10년 가까이 IT 분야에 종사하면서, 선후배 동료 개발자들에게 느낀 가장 큰 아쉬움 세 가지를 뽑자면, 개발 프로세스에 대한 관심 부족, 미흡한 툴 활용력, 마지막으로 단위 테스트의 중요성에 대한 인식 부족이다.
개발자 개개인의 잘못보다는 환경적인 요인이 크다. 예를 들어, 대학 교육을 마쳐도 소스 컨트롤, 지속적 통합, 리팩터링, 단위 테스트, 결함 관리 등과 같이 팀 개발 효율성과 제품 품질에 지대한 영향을 미치는 필수 개념들에 대해 제대도 들어보지도 못하고 사회의 문을 두드리는 경우가 허다하다.
이 책은 단위 테스트 프레임워크의 어머니라 할 수 있는 JUnit을 중심으로, 단위 테스트의 효과와 중요성, 성격이 다른 소프트웨어 각 영역별 지원 툴, 이들을 개발 프로세스에 녹이고 자동화시키는 방법까지, 내가 아쉬워했던 세 가지 영역을 골고루 아우른다. 더욱이 현업에 바로 적용할 수 있는 예제들을 중심으로 기본적인 이론과 다수의 모범 사례 등 알찬 내용들로 속이 꽉 채워져 있다.
물론 이것만으로 소프트웨어 개발을 논하기엔 부족함이 많지만, 프로페셔널 개발자로써 부끄럽지 않은 자신을 준비하는데는 후회 없는 선택이 될 것임을 확신한다.
나는 이 책에서 배운 것을 기반으로 독자들이 꼭 실천해보았으면 하는 것이 하나 있다. 바로 테스트 주도 개발(Test Driven Development)이다. 다름 아닌 독자들의 설계 역량 향상을 위해서이다. 테스트에서 설계역량을 논하는게 어색하다고 생각한다면 테스트를 절반밖에 이해하지 못한 것이다. 테스트와 설계는 맞닿아 있다.
설계와 구현을 먼저 하고 테스트가 뒤따르는 전통적 개발 프로세스에서의 테스트 케이스 제작은 “도메인(테스트 대상) 객체에 대한 분석력”만 있으면 가능하다. 쓰임새를 정확히 이해하고, 무엇을 검증해야 할 지와 개발자들이 주로 실수하는 부분이 어디인지를 잘 알고 있다면 좋은 테스트 케이스를 만들 수 있다.
반면 테스트 주도 개발에서의 테스트 케이스 제작이란 “구현 대상의 기능 요구사항을 (자연어가 아닌) 프로그래밍 언어로 기술하는 것”이다. 이는 개발자들을 자신이 만들 API의 사용자(고객) 입장에 서서 기능 제공 수준을 넘어, 사용성까지 고려한 설계를 하도록 이끈다. 결과로 우리가 얻는 것은 두 가지. 더 나은 설계의 제품과, 개발자의 설계 역량 향상이다. 당장의 제품 개발과 직접적으로 연관된다는 측면에서 관리자를 설득할 때는 전자가 더 효과적일 지 모르지만, 나는 후자의 값어치를 훨씬 높이 평가한다.
테스트 용이성과 좋은 설계의 상관관계가 잘 와 닿지 않는다면, 테스트하기 어려운 코드의 일반적인 특성을 살펴보면 도움이 된다. 대표적인 몇 가지를 나열해보았다.
- 인터페이스가 복잡하다: 사용법 자체를 이해하기 어렵거나 경우의 수가 너무 많아 충분히 테스트할 수 없다.
- 인터페이스가 직관적이지 않다 (혹은 모호하다): 사용법을 오해하기 쉽다.
- 인터페이스가 부족하다: 원하는 조건으로 설정하거나, 수행 결과를 확인할 길이 없다.
- 종속된 다른 모듈(혹은 환경)이 많거나, 숨은 종속성을 갖는다: 테스트 환경을 갖추기 어렵고, 문제의 원인을 찾기 어렵다.
- 모듈간 일관성이 부족하다: 다른 모듈과 똑같은 방식으로 사용했으나 문제가 발생한다.
어떠한가? 이를 반대로 하면 좋은 설계의 요건들과 너무도 흡사하지 않은가? 때문에 테스트할 수 있도록, 나아가 테스트하기 쉽도록 만들려는 고민은 자연스럽게 더 좋은 설계를 찾는 과정으로 이어지고, 그 경험과 깨달음과 개발자의 머릿속에 축적된다. 실제로 제어 역전과 같은 설계 패턴이 잘 적용된 설계와 그렇지 않은 설계의 테스트 용이성은 극명한 차이가 난다.
뿐만 아니라 설계의 좋고 나쁨을 판단함에 있어 ‘나는 왠지 이 디자인이 더 마음에 든다’나 ‘다른 제품을 보니 이렇게 했더라’ 보다 ‘테스트를 할 수 있다/없다’는 훨씬 명확하고 신뢰할만한 기준이 되어준다.
이런 이유들로 나는 “테스트 주도 개발보다 더 효과적인 설계 훈련법은 없다”고 생각하며, “단위 테스트 잘하는 개발자 치고 실력 없는 사람이 없다”는 믿음에 배신 당한 적이 없다.
그렇다면 이 책을 건너뛰고 테스트 주도 개발로 바로 넘어가 보는 것은 어떨까? 한마디로 굉장히 위험한 발상이며, 아마도 실패를 맛볼 것이다. 좋은 단위 테스트를 만들기란, 좋은 설계를 하는 것만큼이나 쉽지 않기 때문이다. 더욱이 나쁜 설계라도 대부분은 구현해낼 수는 있지만, 이를 단위 테스트한다는 것은 현실적으로 불가능하거나 투자한 노력 대비 소득이 너무 적을 가능성이 높다. 수많은 테스트 프레임워크들과 지원 툴들이 시장에 괜히 나와 있는 것이 아니다.
이 책을 통해 테스트 프레임워크가 제공해주는 다양한 기능과 시의 적절하게 사용할 수 있는 각종 지원 툴들, 그리고 모범 사례들을 익히며 공력을 쌓다보면, 향후 테스트 주도 개발로의 성공적인 이행에 큰 보탬이 되리라 확신한다.
자~ 그럼! 저자들과 역자의 노력, 그리고 인사이트 출판사의 선택이 부디 많은 한국 개발자들의 실력 향상에 비옥한 밑거름이 되어주길 바라며, 이만……