[Spring] 싱글톤 빈과 프로토타입 빈을 함께 사용할 때 생기는 문제점에 대한 해결책에 대한 나름의 이해
2023. 11. 2. 12:37ㆍSpring
크게 두 가지 방법이 있다.
하나는 Spring에서 제공하는 ObjectProvider를 이용하는 것이다.
다른 하나는 JSR-330에서 제공하는 Provider를 이용하는 것이다.
각각 다음과 같이 사용한다.
ObjectProvider
@Autowired
private ObjectProvider<PrototypeBean> prototypeBeanProvider;
public int logic() {
PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
prototypeBean.addCount();
int count = prototypeBean.getCount();
return count;
}
Provider
@Autowired
private Provider<PrototypeBean> prototypeBeanProvider;
public int logic() {
PrototypeBean prototypeBean = prototypeBeanProvider.get();
prototypeBean.addCount();
int count = prototypeBean.getCount();
return count;
}
ObjectProvider는 ObjetFactory를 상속받는데 ObjectFactory도 이 기능을 제공한다. 하지만 ObjectProvider는 다양한 편의 기능을 제공한다.
Provider는 build.gradle의 dependency에 spring 3.x를 기준으로 다음을 넣어주어야 한다.
implementation 'jakarta.inject:jakarta.inject-api:2.0.1'
두 방법 모두 의존관계를 주입해주는 게 아닌 필요할 때마다 의존관계를 본다라고 해서 붙여진 기법 Dependency Lookup(DL)에 기반한다.
각 방법의 장단점은 다음과 같다.
ObjectProvider
장점
- DL 외에 옵션, 스트림 처리 등 다양한 편의기능을 제공한다.
- 기능이 단순하므로 테스트 코드나 mock 코드(?)를 만들기 쉬워진다.
단점
- 스프링에 의존한다.
Provider
장점
- 자바 표준이기 때문에 다른 컨테이너에서도 사용 가능하다
- 단순해서 테스트 코드나 mock 코드를 만들기 쉬워진다.
단점
- DL 기능만 제공한다.
Reference
'Spring' 카테고리의 다른 글
[Spring] request scope bean과 provider에 대한 나름의 이해 (1) | 2023.11.02 |
---|---|
[Spring] Web Scope에 대한 나름의 이해 (0) | 2023.11.02 |
[Spring] 싱글톤 빈과 프로토타입 빈을 함께 사용할 때 생기는 문제점에 대한 나름의 이해 (0) | 2023.11.02 |
[Spring] 프로토타입 스코프에 대한 나름의 이해 (0) | 2023.11.02 |
[Spring] 빈 스코프에 대한 나름의 이해 (0) | 2023.10.28 |