Open otakijae opened 1 year ago
@Scope("prototype")
static class PrototypeBean {...}
문제점
해결방안
ObjectFactory, ObjectProvider
지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스를 제공
ObjectFactory: 기능이 단순, 별도의 라이브러리 필요 없음, 스프링에 의존
ObjectProvider: ObjectFactory 상속. 옵션, 스트림 처리등 편의 기능이 많고, 별도의 라이브러리 필요 없음. 스프링에 의존
JSR-330 Provider
get() 메서드를 통해 DL 서비스를 제공
스프링에 의존하지 않음
javax.inject:javax.inject:1 을 gradle에 추가해줘야함
implementation 'javax.inject:javax.inject:1'
request 스코프 빈 생성
@Scope(value = "request")
public class MyLogger {...}
Provider 사용해서 request 요청이 들어왔을 때 주입된 각 reuqest 요청의 MyLogger 빈을 가져올 수 있음
private final ObjectProvider<MyLogger> myLoggerProvider;
...
MyLogger myLogger = myLoggerProvider.getObject();
myLogger.setRequestURL(requestURL);
request 스코프 빈 생성
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyLogger {...}
CGLIB라는 라이브러리로 내 클래스를 상속 받은 가짜 프록시 객체를 만들어서 주입한다.
이 가짜 프록시 객체는 실제 요청이 오면 그때 내부에서 실제 빈을 요청하는 위임 로직이 들어있다.
가짜 프록시 객체는 실제 rerquest scope와는 관계가 없다. 그냥 가짜이고, 내부에 단순한 위임 로직만 있고, 싱글톤처럼 동작한다.
프록시 객체 덕분에 클라이언트는 마치 싱글톤 빈을 사용하듯이 편리하게 request scope를 사용할 수 있다.
애노테이션 설정 변경만으로 원본 객체를 프록시 객체로 대체할 수 있다. 이것이 바로 다형성과 DI 컨테이너가 가진 큰 강저미앋.
꼭 웹 스코프가 아니어도 프록시는 사용할 수 있다.
Bean Scope
스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다.
싱글톤 스코프의 빈을 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 스프링 빈을 반환한다.
반면에 프로토타입 스코프를 스프링 컨테이너에 조회하면 스프링 컨테이너는 항상 새로운 인스턴스를 생성해서 반환한다.
프로토타입 빈의 특징 정리
프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점
싱글톤 빈에서 프로토타입 빈 사용
프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결
스프링 컨테이너에 요청
ObjectFactory, ObjectProvider
JSR-330 Provider