Spring Basic 08 - Bean Scope 02

싱글톤과 프로토타입 빈

  • clientBean은 싱글톤이다. → 스프링 컨테이너 생성 시점에 함께 생성되고, 의존관계 주입도 발생한다.
  • clientBean은 의존관계 자동 주입을 사용한다. 주입 시점에 스프링 컨테이너에 프로토타입 빈을 요청한다.
  • 스프링 컨테이너는 프로토타입 빈을 생성해서 clientBean에 반환한다. 프로토타입 빈의 count필드 값은 0이다.
  • clentBean은 프로토타입 빈의 참조값을 보관한다(내부 필드를 말한다.)

image image

  • 클라이언트가 clientBean을 컨테이너에게 요청해서 반환받는다. 싱글톤이므로 항상 같은 clientBean을 반환받게 된다.
  • 클라이언트 A는 clientBean.logic() 을 호출한다.
  • clientBean은 prototypeBean의addCount()` 를 호출해서 프로토타입 빈의 count를 증가한다. count값이 1이 된다.
  • 여기서 중요한 점이 있는데, clientBean이 내부에 가지고 있는 프로토타입 빈은 이미 과거에 주입이 끝난 빈이다. 주입 시점에 스프링 컨테이너에 요청해서 프로토타입 빈이 새로 생성이 된 것이지, 사용 할 때마다 새로 생성되는 것이 아니다!
  • clientBean 은 prototypeBean의 addCount() 를 호출해서 프로토타입 빈의 count를 증가한다. 원래 count 값이 1이었으므로 2가 된다.

싱글톤 빈이 프로토타입 빈을 주입받을 경우

image image

  • Scope에 singleton이라고 명시를 해줬는데 사실 아무것도 쓰지 않은 값이어도 default로 싱글톤이 유지된다.
  • 여기서 중요한 점은 싱글톤 빈인 ClientBean이 프로토타입 빈을 주입받을 경우, ClientBean이 생성될 때만 PrototypeBean의 인스턴스가 주입된다.
  • ClientBean이 생성될 때 주입된 하나의 프로토타입 빈 인스턴스를 계속 사용하게 된다. 이후에 logic() 메서드를 호출할 때마다 새로운 PrototypeBean이 생성되지 않고, 처음 주입된 동일한 인스턴스를 사용하게 되는 것이다. → 그 이유는 이미 생성시점에 빈을 만들어 두었기 때문이다.
  • 사실 프로토타입빈은 요청할 때 마다 계속 다른 인스턴스를 보내주는 개념인데 싱글톤과 같이 사용하게 된다면 싱글톤이 더 우선이 되는 거 같은 개념인 것 같다.

Reference

김영한님의 스프링 강의 정리



© 2022. by taewoo

Powered by taewoo