🍃 Spring

@Component와 Static 메소드 중 Utility Class는 어디에 만들까?

loose 2022. 11. 13. 03:25
반응형

@Bean과 @Component는 기본적으로 다른 클래스에 종속성이 있을 때 사용한다는 공통점이 존재한다.

그 중에 @Bean은 메소드 단위에 쓰이며 외부 라이브러리에 종속성이 있을 때 사용한다.

@Component는 클래스 단위에 쓰이며 내부에 종속성 있을때, 즉, 내가 만든 클래스를 사용하고 싶을 때 쓸 수 있다.

하지만 여기서 얘기하고 싶은건 Util 함수에 관한 이야기인데, @Component로도 Utility 클래스를 만들 수 있고 Static 클래스로도 만들 수 있기에 어떠한 차이가 있는지 알아보았다.

 

Static

 

Static 메소드는 인자가 동일할 경우 항상 동일한 결과를 리턴해야 한다.

이 규칙을 지킬 수 없으면 Bean으로 만들어야 한다.
이것이 이뤄지려면 함수 안에서는 외부 자원에 대한 종속성이 없어야 한다.

외부 자원은 그 실행 결과의 일관성을 보장할 수 없기 때문이다. 결과적으로 Static은 종속성이 없을 때, 객체 생성이 필요 없을 때 사용한다.

이에 가장 잘 들어맞는 예는 StringUtils, CollectionUtils 같은 것들이다.

또 다른 장점으로는 서버 사이드 렌더링을 사용한다면 화면 영역에서 Static 클래스를 호출할 수 있다.

 

@Component

 

Test 코드를 작성하기 용이하다. Static은 항상 테스트하기 번거롭다.

종속적인 클래스를 쓰는데에 의의가 있는 어노테이션이기 때문에 단순 Utility 함수가 존재할 것 같다는 예상을 하기 어렵다.

 

성능 차이

 

현재는 서버의 성능이 다 우수한 편이라 둘의 성능은 거의 차이가 없을 정도라고 한다.

 

결과

쓰는 방식에 따른 찬반양론은 존재하지만 개인적으로 제일 와닿았던 것은 명확한 디자인에 초점을 맞추는 것은 시간이 지남에 따라 훨씬 더 중요하다고 여겨진다는 것이다.

그래서 Util은 Static으로 담는게 가장 Best 방법이라고 생각이 든다.

 

참고

 

Utility class in Spring application - should I use static methods or not?

Let's say I have a utility class DateUtil (see below). To use this method a caller method uses DateUtils.getDateAsString(aDate). Would it be better to remove the static modifier and make DateUtil a

stackoverflow.com

 

 

performance of static vs non static method for an utility class

I have a utility class which has non static methods with no instance variables. So I am thinking of converting all the methods to static methods. I doubt there will be any memory or performance imp...

stackoverflow.com

 





728x90