개발을 하며, "테스트 코드를 위해 프로덕션 코드에 영향을 줘도 될까?"라는 고민이 테스트 코드를 작성하다 보니 생겼습니다.

 

고민해본 예시는 다음과 같습니다. Querydsl을 사용하며 Projection을 사용할 때 Setter를 만들지 않고, field 주입을 이용해 객체를 생성할 수 있습니다. 팀 내에서 field 주입만 사용하고 있기에 Getter만 생성해서 사용했습니다. 

 

문제는 테스트 코드를 작성하며, 모든 값을 채우는 All 생성자나 Setter가 없기에 객체를 생성한 후 Reflection을 이용해서 값을 채워야 했습니다. 결국 Builder나 All 생성자가 없어 Service 계층의 테스트 코드는 Reflection이 덕지덕지 붙고 말았습니다.. 

 

어떤 상황이 있는지 알아봤고, 본론으로 테스트 코드를 위해 프로덕션 코드에 영향을 줘도 될까에 대해서 생각해보겠습니다. 

 

YAGNI -> You Ain't Gonna Need It 필요한 코드만 작성해라! 라는 말을 한 번쯤을 들어봤을 것이라고 생각합니다. 말 그대로 미래에 쓰일 것이라고 예측되는 코드가 아닌 현시점에서 쓰이는 코드만 필요한 코드만 작성하는 것을 권장하는 말입니다. 하지만 관점에 따라 다르게 볼 수 있을 거 같습니다.

 

1. 프로덕션 코드에서의 관점

-> Builder or All 생성자는 없어도 되는 코드니까 작성하는 것은 권장하지 않아!

 

2. 테스트 코드에서의 관점

-> 테스트 코드를 작성할 때 사용하는 코드이니까 필요한 코드니까 작성해도 무방해!

 

저는 테스트 코드를 작성하는 시점이기에 2번 관점에서 관점에서 바라봤고, 코드 리뷰를 하는 팀원은 1번 관점에서 바라봤습니다. 둘 다 옳게 바라본 관점이라고 생각합니다. 

 

이때 제가 생각하는 테스트 코드 자체의 역할에 대해서 생각해보겠습니다. 

 

1. 로직을 검증한다.

2. 로직의 변경이 있을 경우에 사이드 이펙트를 체크할 수 있다.

 

Builder or All 생성자를 만듦으로써, 테스트 코드 자체의 역할에 기여할 수 있는가?? 

-> 그렇다고 생각하지 않습니다. 단지 테스트 코드 작성의 용이함을 가져오는 것 뿐입니다.

 

"역시 Builder or All 생성자를 만들지 않는 게 좋구나!!" 그렇지만은 않습니다.

-> 위에서 언급했듯이, 테스트 코드는 검증과 사이드 이펙트를 체크할 수 있으므로 작성하는 것은 권장이 아니라 필수로 생각됩니다. 그렇기에 빠르고 정확하게 작성하는 것 또한 중요합니다. (Builder 이용)

 

창과 방패의 대결 같이 혼자만의 생각으로는 결론이 나지 않았습니다. 주변의 많은 사람들에게 의견을 물어봤지만, 의견이 분분했습니다. 따라서 저만의 방식으로 정의했습니다.

 

결론

테스트 코드를 위한 코드를 작성한다면, 아래의 조건을 만족하는지 확인한 후 코드를 추가하기로 결정했다.

 

1. 추가된 코드가 프로덕션 코드에 사이드 이펙트를 가져오지 않아야 한다.

2. 코드로 인해 테스트 코드 작성의 용이점이 뚜렷해야 한다. 

 

이렇게 일주일 가량의 고민이 끝났고, 주변 개발자들의 의견을 들을 수 있어서 재밌었습니다.