본문 바로가기

스프링/스프링 핵심 기술

4. IoC 컨테이너: 빈의 스코프

빈의 스코프

스프링에서는 빈의 스코프를 싱글톤, 프로토 타입 등으로 설정이 가능하며 그에 따라 속해있는 빈들이 상태가 변경될 수 있다.

싱글톤

  • 빈을 등록하면 기본값이 싱글톤이므로 싱글톤으로 등록이 된다.
  • Single, Proto를 우선 @Component를 통해 빈으로 등록하였다.

  • 아무 설정을 하지 않았으므로 Proto는 현제 싱글톤 객체이다.
  • 출력을 확인해보면 Single에서 가져온 Proto와 일반 Proto와 같은 인스턴스인 것을 알 수 있다.
  • 싱글톤 객체를 사용할 때는 프로퍼티가 공유되므로 Multi Thread 환경에서 Thread-safe 하지 않다.

프로토타입

  • Proto를 @Scope를 통해 prototype으로 지정한다.
  • Bean을 여러 개 출력해보면 싱글톤은 같은 인스턴스가 출력되나 프로토타입은 다른 인스턴스가 출력되는 것을 알 수 있다.

프로토타입 사용 시 주의할 점

싱글톤 빈이 프로토타입 빈을 가지고 있을 때

  • 현재 Single은 싱글톤이고 Proto는 프로토타입이다.
  • 그렇다면 Single이 가지고 있는 Proto는 어떻게 될까?

  • 출력을 확인해보면 프로토타입임에도 불구하고 같은 인스턴스가 출력된다.
  • 즉 프로토타입의 빈이 변경되지 않게 된 것이다.

해결 방법

  • proxyMode를 TARGET_CLASS로 설정하면 제대로 동작한다.
  • Single이 Proto를 직접 참조하는 게 아닌 프락시를 통해 참조하게 되기 때문이다.
  • 그러므로 프로토타입의 빈은 제 역할을 할 수 있게 된다.

원래 JAVA 기반의 프락시는 인터페이스 기반의 프락시만 만들 수 있다.
스프링이 제공하는 TARGET_CLASS를 통해 클래스 기반의 프락시를 만들어 준 것이다


참고 자료