[Spring] 싱글톤 빈과 프로토타입 빈을 함께 사용할 때 생기는 문제점에 대한 해결책에 대한 나름의 이해

2023. 11. 2. 12:37Spring

크게 두 가지 방법이 있다.
하나는 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


https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8&unitId=55390

학습 페이지

www.inflearn.com