@Component와 Static 메소드 중 Utility Class는 어디에 만들까?
@Bean과 @Component는 기본적으로 다른 클래스에 종속성이 있을 때 사용한다는 공통점이 존재한다.
그 중에 @Bean은 메소드 단위에 쓰이며 외부 라이브러리에 종속성이 있을 때 사용한다.
@Component는 클래스 단위에 쓰이며 내부에 종속성 있을때, 즉, 내가 만든 클래스를 사용하고 싶을 때 쓸 수 있다.
하지만 여기서 얘기하고 싶은건 Util 함수에 관한 이야기인데, @Component로도 Utility 클래스를 만들 수 있고 Static 클래스로도 만들 수 있기에 어떠한 차이가 있는지 알아보았다.
Static
Static 메소드는 인자가 동일할 경우 항상 동일한 결과를 리턴해야 한다.
이 규칙을 지킬 수 없으면 Bean으로 만들어야 한다.
이것이 이뤄지려면 함수 안에서는 외부 자원에 대한 종속성이 없어야 한다.
외부 자원은 그 실행 결과의 일관성을 보장할 수 없기 때문이다. 결과적으로 Static은 종속성이 없을 때, 객체 생성이 필요 없을 때 사용한다.
이에 가장 잘 들어맞는 예는 StringUtils, CollectionUtils 같은 것들이다.
또 다른 장점으로는 서버 사이드 렌더링을 사용한다면 화면 영역에서 Static 클래스를 호출할 수 있다.
@Component
Test 코드를 작성하기 용이하다. Static은 항상 테스트하기 번거롭다.
종속적인 클래스를 쓰는데에 의의가 있는 어노테이션이기 때문에 단순 Utility 함수가 존재할 것 같다는 예상을 하기 어렵다.
성능 차이
현재는 서버의 성능이 다 우수한 편이라 둘의 성능은 거의 차이가 없을 정도라고 한다.
결과
쓰는 방식에 따른 찬반양론은 존재하지만 개인적으로 제일 와닿았던 것은 명확한 디자인에 초점을 맞추는 것은 시간이 지남에 따라 훨씬 더 중요하다고 여겨진다는 것이다.
그래서 Util은 Static으로 담는게 가장 Best 방법이라고 생각이 든다.
참고