요구사항이 변경되면서 유틸 클래스로 되어있는 코드를 변경해야할 일이 생겼고, 이에 대한 테스트 코드를 작성하다보니 어려운 부분이 있어서 해당 유틸 클래스를 빈으로 변경한 일이 있었다.
이러한 경험을 기반으로 어떨 때는 유틸 클래스를 쓰는 것이 좋고, 어떨 때는 빈을 사용하는 것이 좋은지에 대한 내용을 정리해보려한다.
스프링 애플리케이션을 개발하다보면 “이 로직을 어디에 둘까” 같은 고민을 자주 하게 된다. 예를 들면 날짜를 포맷팅하거나, 문자열을 변환한다거나 하는 단순한 로직은 유틸 클래스에 정적 함수처럼 쓰면 간단하다. 반대로 외부 API를 호출하거나, 설정 값에 따라 달라지는 동작이라면 스프링의 빈을 사용하는게 더 자연스럽다.
모든 걸 유틸로 둔다면, 테스트 코드 작성이 어려워지고 확장성이 떨어질 수 있다. 반면에 모든걸 빈으로 둔다면 단순한 로직도 컨텍스트 의존성을 가지게 된다.
즉, “두 가지 중 한 방식이 무조건 옳다” 라는 개념보다는 서로 장단점을 가지고 있어 코드 작성 시 판단하여 선택할 필요가 있다.
따라서, 두 방식에 대한 장단점을 파악하고, 상황에 맞게 선택할 줄 알아야 가볍고, 테스트하기 좋으면서도 확장성 있는 구조를 유지할 수 있다.
유틸 클래스는 보통 순수 함수나 단순한 공용 기능을 모아두는데 사용한다. Kotlin 기준으로는 object 싱글턴이나 top-level 함수 혹은 companion object 형태로 많이 정의한다.