본문 바로가기
[inflearn] 스프링 핵심 원리 - 기본편/섹션 9 - 빈 스코프

9-4. 프로토타입과 싱글톤 빈을 함께 사용할 때 주의할 점

by 슬픈 야옹이 2024. 7. 28.

 

프로토타입 빈은 조회 시점마다 새로 생성되기 때문에, 각 요청마다 서로 다른 빈을 사용하는 로직을 설계할 때 적합하다.

 

하지만 싱글톤 빈과 함께 사용할 경우 의도한대로 동작하지 않을 수 있다.

 

싱글톤 빈이 어떤 프로토타입 빈을 의존할 때, 생성 시점에 주입받은 프로토타입 빈은 여러번 받는게 아니기 때문이다.

 

 

싱글톤 스코프인 어떤 clientBean이 prototypeBean을 의존하는 예시를 보자.

싱글톤 빈과 프로토타입 빈 1 (강의자료 발췌)

 

clientBean은 prototypeBean 하나를 주입받아 가지고 있는 상황이다.

 

 

싱글톤과 프로토타입 빈 2 (강의자료 발췌)

 

여기서 여러 클라이언트가 내부적으로 prototypeBean을 사용하는 clientBean의 addCount() 메서드를 호출한다면,

여러 클라이언트가 같은 prototypeBean에 접근하게 된다.

 

clientBean이 주입받은 빈은 프로토타입 스코프지만, 생성 시점에 주입받았기 때문에 새로운 빈을 받을 일이 없기 때문이다.

 

물론 prototypeBean을 주입받는 또 다른 클라이언트, clientBean2 같은 클래스가 생긴다면 clientBean과 clientBean2가 가진 prototypeBean은 서로 다른 인스턴스가 될 것이다.

 

하지만 문제점은 같은 clientBean에 대한 여러 요청이 같은 prototypeBean을 사용한다는 것이다.

 

결과적으로 여러 요청에 대해 각각 다른 prototypeBean을 제공하려 했던 의도대로 동작하지 않았다.

 

이런 문제가 발생한 원인은 의존하는 빈을 생성 시점에 주입받았기 때문이다.

이러한 문제를 방지하려면 Provider를 활용해야 한다.