1. 빈 스코프
지금까지 공부한 스프링 빈은,
스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때까지 유지된다고 학습했다.
이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다.
(scope : 빈이 존재할 수 있는 범위)
싱글톤 : 기본 스코프
프로토타입 : 스프링 컨테이너가 빈의 생성과 의존관계 주입까지만 관여하고, 더는 관리하지 않는 것
웹 관련 스코프
- request : 웹 요청이 들어오고 나갈 때까지 유지되는 스코프
- session : 웹 세션이 생성되고 종료될 때까지 유지되는 스코프
- application : 웹 서블릿 컨텍스트와 같은 범위로 유지되는 스코프
2. 프로토타입 스코프
- 프로토타입 스코프의 빈을 조회하면, 스프링 컨테이너는 항상 새로운 인스턴스를 생성해서 반환한다.
1. 프로토타입 스코프의 빈을 스프링 컨테이너에 요청한다.
2. 스프링 컨테이너는 이 시점에 프로토타입 빈을 새로 생성하고, 필요한 의존관계를 주입한다.
3. 스프링 컨테이너는 생성한 프로토타입 빈을 클라이언트에 반환한다.
4. 이후에 스프링 컨테이너에 같은 요청이 오면, 항상 새로운 프로토타입 빈을생성해서 반환한다.
정리.
여기서 핵심은 스프링 컨테이너는 프로토타입 빈을 생성, 의존관계 주입, 초기화까지만 처리한다는 것!
이후 프로토타입 빈을 관리할 책임은, 프로토타입 빈을 받을 클라이언트에 있다.
따라서 @PreDestroy 같은 빈 종료 메서드가 호출되지 않는다.
프로토타입 스코프 빈 - 싱글톤 스코프 빈 함께 사용 시 문제점
싱글톤 빈은 생성 시점에만 의존관계 주입을 받기 때문에,
프로토타입 빈이 새로 생성되기는 하지만, 싱글톤 빈과 함께 계속 유지된다.
(주입 시점에만 새로 생성이 된 것, 사용할 때마다 새로 생성하는 것이 아님)
해결책
1) ObjectFactory, ObjectProvider
- 지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스 제공
의존관계 탐색 (Dependency Lookup)
: 의존성 주입과 관련된 객체를, 스프링 컨테이너에서 직접 찾아서 가져오는 것
3. 웹 스코프
특징
- 웹 환경에서만 동작한다.
- 프로토타입과 다르게, 스프링이 해당 스코프의 종료시점까지 관리한다. (종료 메서드 호출)
종류
request : HTTP 요청 하나가 들어오고 나갈 때까지 유지되는 스코프
각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고, 관리된다.
session : HTTP Session과 동일한 생명주기를 가지는 스코프
application : 서블릿 컨텍스트와 동일한 생명주기를 가지는 스코프
websocket : 웹 소켓과 동일한 생명주기를 가지는 스코프
request 스코프 예제 만들기
: 동시에 여러 HTTP 요청이 올 때, 정확한 어떤 요청이 남긴 로그인지 구분하기
만나는 오류
- 스프링 애플리케이션을 실행하는 시점에 싱글톤 빈은 생성해서 주입이 가능하지만,
request 스코프 빈은 아직 생성되지 않는다. (실제 고객의 요청이 와야 생성된다.)
해결책
1) 스코프와 Provider
ObjectProvider를 사용해,
ObjectProvider.getObject()를 호출하는 시점까지 스프링 컨테이너한테 request 빈 객체 요청을 지연한다
(=request 스코프 빈의 생성을 지연)
2) 스코프와 프록시
- 적용 대상이 인터페이스가 아닌 클래스면, TARGET_CLASS 선택
- 적용 대상이 인터페이스이면, INTERFACES 선택
- MyLogger의 가짜 프록시 클래스를 만들어두고,
HTTP request와 상관 없이, 가짜 프록시 클래스를 다른 빈에 미리 주입해 둘 수 있다.
- 가짜 프록시 객체는 요청이 오면, 그 때 내부에서 진짜 빈을 요청하는 위임 로직이 들어있다.
중요!. Provider / Proxy 의 핵심 아이디어는 "진짜 객체 조회를 꼭 필요한 시점까지 지연 처리한다." 이다.
plus.
프로토타입 스코프 - 싱글톤 스코프 빈 해결책으로
ObjectFactory, ObjectProvider를 쓰지 않고 프록시 객체를 사용해 해결할 수 있다.
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
ScopedProxyMode
NO :
DEFAULT :
TARGET_CLASS :
INTERFACES :
'Spring > 기본' 카테고리의 다른 글
8. 빈 생명주기 콜백 (0) | 2023.08.10 |
---|---|
7. 의존관계 자동 주입 (0) | 2023.08.10 |
6. 컴포넌트 스캔 (0) | 2023.08.04 |
5. 싱글톤 컨테이너 (0) | 2023.08.04 |
4. 스프링 컨테이너와 스프링 빈 (0) | 2023.08.03 |