빈이 존재할 수 있는 범위
싱글톤 : 기본 스코프, 스프링 컨테이너의 시작~종료
프로토타입 : 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여
웹 관련 스코프
싱글톤 스코프의 빈을 조회하면, 항상 같은 인스턴스의 스프링 빈을 반환
반대로 프로토타입 스코프를 조회하면, 항상 새로운 인스턴스를 생성해서 반환
생성예제
@Scope("prototype")
@Component
싱글톤 빈 요청
항상 같은 인스턴스의 스프링 빈 반환
프로토타입 빈 요청
1.스프링 컨테이너가 빈 생성, 의존관계 주입
2.반환하고 끝 (@PreDestroy
호출 ❌)
프로토타입 빈은 사용할 때마다 새로 생성되는것이 아니고, 요청시마다 새로 생성된다.
프로토타입 빈을 주입받는 클라이언트 빈(싱글톤)이 있다고 가정하자
클라이언트 빈이 주입 시점에 프로토타입빈을 받으면, 프로토타입 빈을 주입받고 내부 필드에 보관한다.
프로토타입 빈은 과거에 주입이 끝났으므로, 항상 같은 참조값을 가지게 된다.
결과적으로, 싱글톤 빈과 함께 프로토타입 빈이 계속 유지되게 된다. 문제점
프로토타입이 필요할때마다 컨테이너에 새로 요청
프로토타입 빈을 주입받는게 아니라, 의존관계를 조회
지정한 빈을 컨테이너에서 찾아주는 DL 서비스 제공
javax.inject.Provider
을 통해서도 가능 (자바표준)
프로토타입 빈은 거의 사용할 일이 없다
특징
종류
request
: HTTP 요청 하나가 들어오고 나갈 때 까지 유지, 각각의 요청마다 별도의 빈 인스턴스가 생성됨session
: HttpSession과 동일한 생명주기application
: 서블릿 컨텍스트 (ServletContext
)와 동일한 생명주기websocket
: 웹 소켓과 동일한 생명주기예제
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyLogger {....
껍데기를 집어넣어 놓고, 기능을 실제 호출하는 시점에 진짜를 찾아서 동작
ObjectProvider
처럼 동작함
Provider
이던 프록시던, 진짜 객체 조회를 필요한 시점까지 지연처리
클라이언트는 싱글톤 빈을 쓰는 것처럼, 편리하게 request.scope를 사용 가능
무분별하게 사용하면, 유지보수가 크게 어려워진다