프로토타입 빈과 싱글톤 빈 - 문제점

초보개발·2021년 12월 19일
0

Spring

목록 보기
26/37

프로토타입 빈과 싱글톤 빈을 같이 사용하면 생기는 문제점

프로토타입 스코프의 빈은 클라이언트가 요청하면 새로운 객체 인스턴스를 생성하여 반환해주는데, 싱글톤 스코프의 빈과 같이 사용할 경우 의도한 대로 동작하지 않는다는 문제가 있다.
먼저 스프링 컨테이너에 프로토타입 스코프의 빈을 직접 요청하는 과정을 정리해보았다.

프로토타입 빈 직접 요청


1. 클라이언트 A가 스프링 컨테이너에게 프로토타입 빈을 요청
2. 스프링 컨테이너는 프로토타입 빈(x01)을 새로 생성하여 반환, 해당 빈의 변수 count는 0
3. 클라이언트 A는 조회한 프로토타입 빈에 addCount()를 호출해서 count+1
4. 결과, 프로토타입 빈(x01)의 count는 1

1. 클라이언트 B가 스프링 컨테이너에게 프로토타입 빈 요청
2. 스프링 컨테이너는 프로토타입 빈(x02)을 새로 생성하여 반환, 해당 빈의 변수 count는 0
3. 클라이언트 A는 조회한 프로토타입 빈에 addCount()를 호출해서 count+1
4. 결과, 프로토타입 빈(x02)의 count는 1

싱글톤 빈에서 프로토타입 빈 사용

clientBean 내부에 프로토타입 빈을 의존 관계 주입으로 사용할 경우,

static class ClientBean{
    // 생성 시점에 주입됨
    private final PrototypeBean prototypeBean;
...
}

  • 싱글톤 스코프인 clientBean은 스프링 컨테이너 생성 시점에 함께 생성되고 의존 관계 주입도 발생한다.
  1. clientBean은 의존 관계가 자동으로 주입되는데 주입 시점에 스프링 컨테이너에 프로토타입 빈을 요청
  2. 스프링 컨테이너는 프로토타입 빈을 생성해 clientBean에게 반환, 프로토타입 빈의 count는 0
  3. clientBean은 프로토타입 빈을 내부 필드에 보관(참조값 보관)

  • 클라이언트 A는 싱글톤 스코프인 clientBean을 스프링 컨테이너에서 요청받음
  1. 클라이언트 A는 clientBean.logic()을 호출
  2. clientBean은 PrototypeBean의 addCount()를 호출해 프로토타입 빈의 필드인 count 값을 1 증가시킴

  • 클라이언트 B는 clientBean을 스프링 컨테이너에 요청받음
    이 clientBean이 갖고 있는 프로토타입 빈은 이미 전에 주입이 끝난 빈이며, 주입 시점에 스프링 컨테이너에 요청해서 프로토타입 빈이 새로 생성된 것일 뿐, 사용할 때마다 새로 생성되는 것이 아니다.
  1. 클라이언트 B는 clientBean.logic() 호출
  2. clientBean은 prototypeBean의 addCount()를 호출해 count의 값을 증가시킴

참고
여러 빈에서 같은 프로토타입 빈을 주입 받는 경우, 주입 받는 시점에 각각 새로운 프로토타입 빈이 생성된다.

  • Ex) clientA, clientB가 각각 의존관계 주입을 받으면 각각 다른 인스턴스의 프로토타입 빈을 주입 받는다.
    clientA -> prototypeBean@x01
    clientB -> prototypeBean@x02
    그리고 사용할 때마다 새로 생성되지 않는다.

0개의 댓글