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