Util 클래스 VS Bean 등록

잼구·2023년 11월 8일
1

특정 목적을 가지는 메서드들을 class 로 따로 분리하면 관련된 책임만을 갖는 클래스는 가독성이나, 유지 보수성, 재사용성 등을 향상 시킬 수 있다. 보통 분리 방법은 2가지 인데, Util 클래스로 사용하는 것과 Bean 으로 등록해 주입 받아 사용하는 것이다. 그럼 언제 어떤 경우에 무엇으로 사용하고 둘의 차이는 무엇일까?

차이점

  1. Bean으로 관리하는 클래스의 장점
  • 의존성 주입(Dependency Injection): Bean으로 등록하면, 해당 클래스를 필요로 하는 다른 클래스에 쉽게 주입할 수 있다. 이는 코드의 결합도를 낮추고, 유연성 및 재사용성을 높인다.

  • 스코프 관리: Bean의 생명 주기를 관리할 수 있다. 예를 들어, 싱글턴(singleton)으로 설정하면 하나의 인스턴스만 생성되며, 애플리케이션 전체에서 공유되고 프로토타입(prototype) 같은 다른 스코프도 설정할 수 있다.

  • AOP(Aspect-Oriented Programming) 지원: Bean으로 관리되는 클래스는 AOP를 사용하여 관리할 수 있다. 예를 들어, 로깅, 트랜잭션 관리 등을 메서드 호출에 자동으로 적용할 수 있다.

  • 테스트 용이성: 의존성 주입을 사용하면, 테스트 시에 실제 의존성 대신에 모의 객체(mock objects)나 스텁(stubs)을 주입하여 테스트를 용이하게 할 수 있다.

  • 확장성: 상속이나 인터페이스 구현을 통해 확장 가능하기에 변경에 유연하다.

  1. 유틸리티로 관리하는 클래스의 장점
  • 간단한 접근: 유틸리티 클래스는 대개 static 메서드를 사용하기 때문에, 인스턴스화 없이 바로 메서드에 접근할 수 있다.

  • 상태 관리 불필요: 상태를 갖지 않는다면, 여러 부분에서 동시에 사용해도 서로 영향을 주지 않아 동시성 관리가 덜 복잡하다.

  • 메모리 효율: 유틸리티 클래스는 인스턴스를 생성하지 않기 때문에, 메모리 사용량이 적을 수 있다.

결론

Util 이 적합한 경우
1. spring 에 의해 관리 받지 않아도 되는 경우 : 생명주기 관리나 AOP 등을 사용하지 않아도 되는 경우
2. 내부 로직이 외부 라이브러리를 사용하지 않거나, 간단한 경우 처럼 변경의 여지가 적은 경우 : 의존성 주입을 하지 않으므로 다형성 활용 불가능 하기 때문
3. 유닛 테스트를 진행할때 문제가 안되는 경우 : 랜덤한 값을 내뱉는 경우 테스트 진행 시 값 추적이 어려울 수 있음
4. 상태가 없는 경우 : 내부에 상태를 변경하는 메서드가 없어서 상태관리를 하지 않아도 되는 경우 객체의 인스턴스를 생성하고 관리할 필요가 없다. 스레드 안전하기 때문. 상태가 있는 객체를 Bean으로 등록하는 이유는, 객체의 상태가 요청마다 다르거나, 사용자 세션, 애플리케이션 상태 등을 추적해야 할 때 객체의 생명주기를 좀 더 세밀하게 관리할 수 있기 때문. Bean 으로 등록함으로써, 이러한 상태를 가진 객체는 프레임워크에 의해 생명주기가 관리되며, 필요에 따라 다양한 스코프(예: 싱글턴, 프로토타입, 요청, 세션 등)로 설정할 수 있다.

즉, 변경할일이 적고, 상태변경 로직이 없으며, 테스트에 어려움이 없는 경우 util 이 적합하다.
이 외의 경우는 모두 Bean이 관리하는 형식으로 class 를 사용하자.


ref
해당 내용에 대한 아고라...

profile
잼구입니다

0개의 댓글