Utility 클래스는 어떻게 관리해야할까 String Bean vs static Method

Y_Sevin·2022년 7월 5일

String Bean

String Bean은 주로 스프링 프레임워크에서 사용되는 개념으로, 관리되는 객체(Bean)을 사용하여 유틸리티 메서드를 제공합니다. 이러한 빈은 스프링 컨테이너에 의해 관리되며, 주입을 통해 접근할 수 있습니다.

장점

  1. 의존성 주입: 스프링 컨테이너가 빈을 관리하므로, 유틸리티 클래스에서 다른 빈에 대한 의존성을 쉽게 주입할 수 있습니다. 이는 클래스 간의 의존성을 명확히 하고 테스트를 용이하게 합니다.
  2. 테스트 용이성: 스프링 컨테이너를 사용하면 목(mock) 객체를 주입하여 단위 테스트를 쉽게 수행할 수 있습니다.
  3. AOP 활용: 스프링의 AOP(Aspect-Oriented Programming) 기능을 활용하여 유틸리티 메서드에 공통적인 로직(예: 로깅, 트랜잭션 관리)을 쉽게 적용할 수 있습니다.

단점

  1. 설정 복잡성: 스프링 설정을 통해 빈을 정의하고 관리해야 하므로 초기 설정이 다소 복잡할 수 있습니다.
  2. 성능 오버헤드: 스프링 컨테이너가 빈을 관리하기 때문에, 호출 시 약간의 성능 오버헤드가 발생할 수 있습니다.

Static Method Utility 클래스

Static Method Utility 클래스는 정적 메서드(static method)로만 구성된 클래스를 의미합니다. 이 클래스는 인스턴스화할 필요 없이 클래스 이름을 통해 직접 메서드를 호출할 수 있습니다.

장점

  1. 간편성: 별도의 설정 없이 즉시 사용할 수 있어 초기 설정이 간단합니다.
  2. 성능: 메서드 호출 시 스프링 컨테이너를 거치지 않으므로 성능 오버헤드가 적습니다.

단점

  1. 의존성 주입 불가: 정적 메서드는 의존성 주입을 지원하지 않으므로, 다른 객체나 서비스를 활용할 수 없습니다.
  2. 테스트 어려움: 정적 메서드는 목(mock) 객체를 주입할 수 없으므로 단위 테스트가 어렵습니다.
  3. 유연성 부족: AOP 같은 스프링의 다양한 기능을 활용할 수 없습니다.

함수 일관성 규칙

Static Method Utility 클래스의 모든 함수는 동일한 인자를 받을 경우 항상 동일한 결과를 반환해야 합니다. 이 규칙을 지킬 수 없으면 해당 클래스를 POJO(Plain Old Java Object) Bean으로 만들어야 합니다. 이 규칙이 이루어지려면 함수 내부에서 외부 자원(resource)에 의존하지 않아야 합니다. 외부 자원은 실행 결과의 일관성을 보장할 수 없기 때문입니다. 이에 가장 잘 들어맞는 예는 StringUtils, CollectionUtils 같은 클래스들입니다.

일관성을 위한 조건

  • 외부 자원 의존성 배제: 함수 내부에서 데이터베이스, 파일 시스템, 네트워크 호출 등 외부 자원에 접근하지 않아야 합니다. 이러한 자원은 항상 동일한 결과를 반환하지 않을 수 있습니다.
  • 순수 함수: 입력 값에 따라 항상 동일한 출력을 반환하는 순수 함수(pure function)로 작성되어야 합니다.

언제 무엇을 사용할까?

String Bean을 사용해야 하는 경우

  • 다른 빈에 의존하는 경우: 유틸리티 메서드가 다른 서비스나 리포지토리와 같은 빈에 의존할 때.
  • AOP가 필요한 경우: 메서드에 트랜잭션 관리, 로깅 등 공통적인 로직을 적용해야 할 때.
  • 테스트가 중요한 경우: 유틸리티 메서드의 단위 테스트가 필요할 때.
  • 일관성 보장이 어려운 경우: 외부 자원을 사용하는 메서드나 결과의 일관성이 보장되지 않는 메서드를 사용할 때.

Static Method Utility 클래스를 사용해야 하는 경우

  • 간단한 유틸리티 메서드: 의존성이 없고, 단순한 연산을 수행하는 유틸리티 메서드일 때.
  • 성능이 중요한 경우: 메서드 호출 빈도가 매우 높아 성능이 중요한 경우.
  • 초기 설정을 피하고 싶은 경우: 설정을 최소화하고 빠르게 개발을 시작하고 싶을 때.
  • 일관성 보장 가능: 동일한 인자로 항상 동일한 결과를 반환할 수 있는 경우.

결론

String Bean과 Static Method Utility 클래스는 각각의 장단점이 있지만, 외부 의존성을 가진다면 Bean 아니라면 Static 메서드로 작성하면 될것같습니다.

참고
https://stackoverflow.com/questions/7270681/utility-class-in-spring-application-should-i-use-static-methods-or-not
https://toryfren.tistory.com/45
https://www.inflearn.com/questions/434014
https://os94.tistory.com/158
https://100100e.tistory.com/339

profile
매일은 아니더라도 꾸준히 올리자는 마음으로 시작하는 개발블로그😎

0개의 댓글