Spring Boot TDD
"왜 TDD를 도입하려 할까?"
TDD 는 구현 설계의 관점이 아닌 제품 가치에 중점을 두어 바라볼 수 있기 때문이다. 여기서, 구현 설계란 소프트웨어 엔지니어가 요구사항을 이행하는 비즈니스 로직에 그친다.
예를 들어, 캘린더에 할 일을 표기하면 앞으로는 할 일을 마쳤는지에 대한 상태 값을 관리한다고 한다.
구현 설계에 따르면 할 일을 완료 했을 때 상태가 올바르게 변경이 되는지를 우선적으로 고려하게된다. 이는 기능이 정상 동작하는지를 우선적으로 생각하게 되어 사고의 확장이 힘들 수 있다.
제품을 바라보는 입장에서는 기능의 고민에서 더 나아가 "할 일을 정말 완료하지 않았는데 완료율을 채우려고 눌렀다면 어떻게 해야할까?" 처럼 사용자에게 제공 하는 기능이 제품을 사용하는 사용자의 입장에서 생각할 수 있다는 것이다.
"하지만, 우리는 왜 매번 TDD 도입에 실패할까?"
TDD에 대한 오해
클래스를 작게 나누어야만한다.
구현 코드를 직접적으로 테스트 환경에서 사용하지 않고 인터페이스에 대해서만 테스트한다면, 내부 코드가 작든 크든 테스트에 미치는 영향은 없다.
클래스가 작을수록 유지보수에 용이한 것은 확실하나 이는 테스트와 무관하다.
현대적인 아키텍처(클린 아키텍처, 헥사고날 등) 를 사용해야한다.
현대적인 아키텍처는 기존의 많은 문제점을 고안하여 개선된 버전으로 도입 시 테스트 작성 비용이 감소할 수 있다. 다만, 현재 팀과 프로젝트 코드 기반이 아키텍처 도입에 어려운 상황이라면 테스트 작성만을 목적으로 아키텍처 도입을 하는 것은 굉장히 무모하다.
SpringBootTest 처럼 컨테이너를 사용하는 테스트는 몹시 느리다.
SpringBootTest 는 당연히 프로젝트의 빈 객체를 컨테이너로 모두 관리하고 있기 때문에 퓨어 자바의 객체만을 가지고 테스트 하는 것 보다 느리다.
다만, SpringBootTest 는 모든 테스트 코드에서 새롭게 빌드 되지 않고 싱글턴을 활용해 구성을 통합하면 최초의 1번만 또는 정말 필요한 환경만 빌드 되기 때문에 무조건 오래 걸린다고 볼 수 없다.
위와 같이 TDD를 도입하기 전 굉장히 높은 러닝커브와 주변에서 하는 말을 비추어 보았을 때 굉장히 많은 오해를 낳았다.
하지만 그 오해는 주관적인 것으로 실제 그렇지 않은 경우도 많다는 것이다.
Last updated