카테고리 없음

[Spring] 스프링에서 사용하는 Util클래스 @Component? Static?

_hanbxx_ 2024. 8. 22. 12:08
728x90

본격적으로 들어가기에 앞서 @Component의 기본적인 개념에 대해 간략하게 언급해보자면

@Component

클래스 단위로 쓰이며 내부에 종속성이 존재할 때, 즉 내가 만든 클래스를 사용하고 싶을 때 쓸 수 있다

 

보통 프로젝트에서 Util 클래스는 Static 메서드를 사용해 구현하는 경우가 많다. 이는 주로 상태가 필요 없고, 특정 기능만 반복적으로 수행하는 단순한 작업에 적합하기 때문이다. 하지만, 내가 현재 참여 중인 프로젝트에서는 @Component를 사용하여 Util 클래스를 정의하고 있어서, 보편적인 Static 메서드와 현재 적용중인 @Component 방식 중 어느 것이 더 적절한지 제대로 알아보고자 한다.

 

먼저 Static으로 구성했을 때를 알아보자
Static

Static메소드는 인자가 동일한 경우 항상 동일한 결과를 리턴해야 한다. 이 규칙을 지킬 수 없으면 Bean으로 만들어야 한다

Static 함수는 모든 객체가 공유하기 위한 함수이다. 

Static 함수는 상태를 가지지 않기 때문에, 외부 의존성을 주입할 수 없다. 그렇기 때문에, 만약 메서드 내에서 다른 클래스의 객체를 사용하거나, 외부 리소스나 의존성이 필요한 작업을 해야 한다면 Static으로 구현하는 것은 적합하지 않다. 
예를 들어, Spring의 의존성 주입(DI)이 필요한 경우, Static 메서드로는 그 기능을 활용할 수 없다. Spring이 관리하는 Bean 객체를 사용해야 하므로 이때는 @Component 또는 @Service와 같은 애노테이션을 사용하여 클래스를 빈으로 등록해야 한다. 이러한 방식으로 빈을 등록하면, Spring의 DI 컨테이너를 통해 다른 빈들을 주입받아 사용할 수 있다.

반면에, Static 메서드는 단순한 유틸리티성 함수들, 예를 들어 문자열 변환, 숫자 계산, 파일 경로 처리 등 상태나 의존성이 전혀 필요하지 않은 경우에 적합하다. 이런 경우 Static 메서드로 구현하면 성능적으로도 이점이 있을 수 있다. 모든 인스턴스가 동일한 메서드를 공유하기 때문에 메모리 효율성도 높아진다.

 

@Component
코드가 복잡해지고, 다른 클래스나 의존성과의 관계가 발생한다면 Static 메서드보다는 Spring 빈을 사용하는 것이 더 유연하고 관리하기 용이하다. 따라서 Static 메서드와 Spring 빈(@Component, @Service 등)은 그 사용 용도가 명확히 나뉘며, 프로젝트의 요구 사항에 따라 적절한 방식을 선택하는 것이 중요하다. 

 

 

결론


결론적으로, Static 메서드는 상태가 없고 외부 의존성 주입이 필요하지 않은 단순한 작업에 적합하며, 반대로 외부 의존성을 필요로 하거나 상태를 관리해야 하는 작업은 @Component나 @Bean을 통해 Spring 빈으로 관리하는 것이 더 적합하다.

이 프로젝트에서 현재 FileUtil을 선언해서 @Component를 달아 사용하고 있는데, 그 이유는 S3 SDK를 사용해야 하기 때문이다. Static으로 선언할 경우 외부 의존성을 주입받을 수 없기 때문에, 정적인 클래스로 선언하는 것보다는 Spring에서 관리되는 빈으로 등록하여 사용하는 것이 더 나을 것이라고 판단했다.

이처럼 상황에 맞게 Util 클래스를 유연하게 구성할 수 있다는 점을 배울 수 있었다. Util 클래스라도 단순한 작업만 수행하는 경우에는 Static 메서드로, 외부 의존성이나 상태 관리가 필요한 경우에는 Spring 빈으로 관리하는 것이 좋다는 것을 알 수 있었다.

 

https://stackoverflow.com/questions/55805497/spring-dependency-injection-vs-static-classes-for-utilities

728x90