빈 스코프
- 빈이 존재할 수 있는 범위
- 스코프 종류
- 싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지
- 프로토타입
- 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입, 초기화까지만 관여함(관리,소멸 X)
- 요청 시마다 항상 새로운 인스턴스를 생성하여 반환
- 많이 사용하지는 않음
- 웹 관련 스코프
- request: 웹 요청이 들어오고 나갈 때까지만 유지
- session: 웹 세션이 생성되고 종료될 때까지 유지
- application: 웹 서블릿 컨텍스트와 같은 범위로 유지
- 컴포넌트 스캔 자동 등록: @Scope("singleton / prototype")
싱글톤 빈과 프로토타입 동시 사용
@Autowired
private ObjectProvider<PrototypeBean> prototypeBeanProvider;
public void logic() {
PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
...
}
- ObjectFactory, ObjectProvider
- logic() 메서드 호출 시마다 provider를 사용해 새로운 프로토타입 빈을 생성함
- 단위 테스트나 Mock 코드를 만들기 쉬움
@Autowired
private Provider<PrototypeBean> provider;
public void logic() {
PrototypeBean prototypeBean = provider.get();
...
}
- Provider (JSR-330)
- 자바 표준 기능, 단위 테스트나 Mock 코드를 만들기 쉬움
- 스프링에 의존하지 않음
- 스프링을 사용하는 경우 ObjectProvider 사용, 다른 프레임워크에서도 사용해야 한다면 JSR-330 Provider 권장
웹 스코프
- request: HTTP request 요청 시마다 할당되는 스코프
- ObjectProvider.getObject()를 사용하여 request scope 빈의 생성을 지연할 수 있음

- 프록시 @Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
- CGLIB 라이브러리를 통해 임시 프록시 객체를 미리 주입함
- 프록시 객체에는 실제 빈을 요청하는 위임 로직을 가지고 있음
- 실제 요청 시 위 로직을 호출
- 실제 원본 객체를 상속 받아 만들어졌기 때문에 원본으로 바로 대체 가능 -> 다형성
[출처] 스프링 핵심 원리 - 기본편, 김영한