Spring 핵심 원리 기본편 (11) - 빈 스코프(Scope) [1] / 프로토타입(Prototype)

김정욱·2021년 2월 23일
0
post-thumbnail

빈 스코프(Scope)?

빈이 존재할 수 있는 범위(Scope)를 의미한다.


  • 스프링은 기본적(default)으로 빈(Bean)의 스코프를 싱글톤(Singleton)으로 제공
  • 그 외에도 다양한 스코프가 존재
    • 싱글톤(Singleton)
      : 기본 스코프, 스프링 컨테이너 시작 ~ 종료 까지 유지되는 가장 넓은 범위
    • 프로토타입(Prototype)
      : 스프링 컨테이너가 빈 생성 / 의존관계 주입 까지만 관여하고 관리하지 않는 짧은 범위
    • 웹 관련 스코프 (request / session / application)

프로토 타입(Prototype) 스코프(Scope)

[ 프로토타입 스코프 ]

  • 요청을 할 때 마다 새로운 객체를 반환한다

  • 빈을 생성하고 , DI하고, 초기화 까지만 하고 클라이언트에게 넘긴다


    [ Example ]

  • @Scope("prototype")으로 프로토타입 스코프 지정

  • 소멸자 수행을 원하면 직접 호출해야 한다!

  • 스프링 컨테이너가 관리하는 범위가 매우 짧다
    • 스프링 빈(Bean) 생성
    • 의존관계 주입(DI)
    • 초기화 작업
    • ----END---- : 즉, 더이상 관리하지 않기 때문에 소멸자 실행 X

싱글톤 안에 프로토타입이 있다면 ?

[ 프로토타입이지만, 같은 값 참조 ? ]

  • Singleton Bean내부에 Prototype Bean이 있는 해당 Test는 오류가 발생
  • 오류가 나는 이유
    : Singleton Bean이 생성되는 최초의 시점에만 Prototype Bean이 생성되므로 호출하는 모든 객체는 같은 Bean을 참조하므로 계속 누적해서 count 값이 더해지게 된다 (기대 값이 1이 아니라 2여야 함)

[ 프로토타입이니까 다른 값 할당 ! ]

  • DL ?
    : Dependency Lookup의 약자로, 특정 Bean에 접근하는 것을 말함
  • 싱글톤 내부에 프로토타입 빈(bean)이 있을 때 만약 사용자가 호출 할 때마다 프로토타입 빈(bean)이 새로운 값을 할당하려면 ?
     --> 그 때 마다 bean을 찾아서 만들어 주면 된다
             (우리가 원하는 프로토타입 빈만 가져오기 위해 DL이 필요함)
        --> Provider를 사용해야 한다.
  • 스프링에서 지원하는 Provider는 2가지 종류가 있다
    • ObjectProvider (구 ObjectFactory)
      : 과거에 ObjectFactory였으나, 편의 기능을 추가하여 ObjectProvider가 만들어 졌다.
      (Provider를 사용해서 DL을 구현함)
    • JSR-330 Provider
      : 자바 표준에서 제공하는 Provider
      (사용하려면 build.gradle에 의존성 추가하고 가져와서 사용)

정리

  • 프로토타입 스코프를 가지는 빈(bean)은 생성, 의존관계주입, 초기화 까지만 관리
  • 싱글톤 내부에 프로토타입 스코프 빈이 있을 때, 호출 시 마다 다른 값을 원한다면 생성자에서 최초 1회 생성이아니라, Provider를 사용해 특정 Bean에 접근하는 DL을 통해 그때 마다 생성해서 반환
  • DL(Dependency Lookup)을 하기 위해 Provider가 사용된다
profile
Developer & PhotoGrapher

0개의 댓글