모든 객체를 스프링 빈으로 등록할 경우에는 메모리 사용량이 많아짐에 따라 애플리케이션의 성능에 문제가 생길 수 있다.
그렇기에 어떤 클래스를 Bean으로 등록하는지를 고민할 필요가 있다.
평소에는 Controller, Service, Repository는 빈으로 관리한다는 무의식적인 개발을 했기에 명확한 기준을 설명하라고 말하면 조금 어려웠고 아래와 같이 추상적으로 생각했다.
- 재사용이 잦은 객체(?)
- 상태가 없는 객체(?)
공식문서에서
스프링 공식문서에서는 일반적으로 서비스 계층, DAO, 웹 컨트롤러와 같은 인프라 객체를 정의한다고 말한다.
또한 일반적인 도메인 세부 객체는 정의하지 않고, 이에 대한 이유로는 도메인 객체를 생성하고 로드하는 것은 대개 리포지토리와 비즈니스 로직의 책임이기 때문이라고 언급한다.
Quote
These bean definitions correspond to the actual objects that make up your application. Typically, you define service layer objects, persistence layer objects such as repositories or data access objects (DAOs), presentation objects such as Web controllers, infrastructure objects such as a JPA
EntityManagerFactory, JMS queues, and so forth. Typically, one does not configure fine-grained domain objects in the container, because it is usually the responsibility of repositories and business logic to create and load domain objects.
도메인 객체는 해당 도메인의 값을 담는 것이 주된 역할이다. 그리고 Client간 요청-응답이 끝난다면 소멸된다.
반면 공식문서에서 언급하는 인프라 객체는 각 도메인에 대한 로직, 작업수행을 담당한다.
정리하자면 다음과 같다.
빈으로 등록해야 하는 객체
- 공통 로직 및 비즈니스 컴포넌트
- 의존성 주입이 필요한 객체
- 공유해서 사용하는 설정/유틸리티 객체
- 외부 라이브러리 객체
빈으로 등록하지 말아야 하는 객체
- 상태(State)를 가지며 일회성으로 생성/소멸하는 데이터 객체
- 의존성 주입이 필요 없는 단순 유틸리티 및 생성 즉시 사라지는 객체