빈이 존재할 수 있는 범위(Scope)를 의미한다.
- 스프링은 기본적(default)으로 빈(Bean)의 스코프를
싱글톤(Singleton)
으로 제공- 그 외에도 다양한 스코프가 존재
싱글톤(Singleton)
: 기본 스코프, 스프링 컨테이너 시작 ~ 종료 까지 유지되는 가장 넓은 범위프로토타입(Prototype)
: 스프링 컨테이너가 빈 생성 / 의존관계 주입 까지만 관여하고 관리하지 않는 짧은 범위- 웹 관련 스코프 (
request
/session
/application
)
[ 프로토타입 스코프 ]
요청을 할 때 마다 새로운 객체를 반환한다
빈을 생성하고 , 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
가 사용된다