20231221 TIL

JaeYeong·2023년 12월 21일

Spring - 프로토타입 빈

프로토타입 빈?

싱글톤 빈이 스프링 컨테이너의 시작과 종료까지 유지되는 넓은 범위의 기본 스코프라면, 프로토타입 빈은 스프링 컨테이너가 빈의 생성과 의존관계 주입까지만 관여한다.
스프링 빈의 이벤트 라이프사이클은

컨테이너 생성 -> 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료

로 되어 있는데, 프로토타입 빈의 경우에는 빈의 생성 -> 의존관계 주입 ->초기화 까지만 스프링 빈이 관리하고 그 이후로는 관리하지 않는다. 그러다보니 종료 메서드도 호출되지 않으며, 관리는 프로토타입 빈을 요청한 클라이언트가 관리해줘야 된다.
그리고 싱글톤 빈과 초기화 시점도 다른데, 싱글톤 빈은 스프링 컨테이너가 생성되는 시점에 초기화 메서드도 같이 실행되지만, 프로토타입 빈은 스프링 컨테이너에서 빈을 조회할 때 생성과 초기화가 이루어진다.
또한 싱글톤 빈과는 다르게 요청할 때마다 새로 만들어진다. 싱글톤 빈은 클라이언트 1이 조회를 해도 클라이언트 2가 조회를 해도 같은 참조값을 뱉어냈지만, 프로토타입 빈은 그렇지 않다는 것이다.

그러면, 둘 다 같이 쓸 수 있을까?

같이는 쓸 수 있지만 문제점이 발생한다. 굳이 프로토타입 빈을 사용하는 이유는 사용할 때마다 계속 생성하고 싶어서 사용할 것이다. 결론만 말하면, 둘을 같이 쓰면 목적을 달성할 수 없다.
싱글톤 빈과 함께 사용하게 되면 싱글톤 빈은 프로토타입 빈 하나를 계속해서 사용하게 된다. 싱글톤 빈의 의존관계 주입은 딱 한 번 일어나게 되는데, 프로토타입 빈을 가져오는 시점은 의존관계를 주입하는 시점이다.
물론 싱글톤 빈이 여러 개가 있다면, 각각의 싱글톤 빈이 생성되는 프로토타입 빈은 다를 것이다. 각각의 싱글톤마다 한 번씩 프로토타입 빈을 가져오기 때문에, 싱글톤 빈의 갯수가 3개라면 프로토타입 빈은 각각 다른 3개의 빈일 것이다. 하지만 우리가 원하는 것은 한 싱글톤 빈 아래서 여러개의 프로토타입 빈을 쓰는 것인데...

해결책은 내일 다루기로 하자.

0개의 댓글