티스토리 뷰

다음과 같은 과정을 생각해보자.

싱글톤 빈에 프로토타입 빈이 주입된 것을 가정한다. 

 

1. 클라이언트 A가 컨테이너에 프로토타입 빈을 요청

2. 컨테이너는 새로운 빈을 생성하고 반환. 프로토타입 빈에는 count 라는 필드가 있고 초기값은 0

3. 클라이언트는 addCount() 를 호출하여 count의 값을 1로 증가시킴

4. 클라이언트 B가 컨테이너에 프로토타입 빈을 요청

5. 컨테이너는 새로운 빈을 생성하고 반환. 

6. 클라이언트는 addCount() 를 호출하여 count의 값을 증가시킴 (count는 2가 됨)

 

여기에서, 이미 싱글톤 빈에 프로토타입 빈이 주입된 것이기에 새롭게 빈이 생성되지 않고 같은 빈이 계속해서 사용된다. 이렇게 될 경우, 프로토타입 스코프 빈의 의미가 사라지고 싱글톤 빈과 다를바가 없게 된다.

 

이를 해결할 수 있는 방법들은 다음과 같다.

 

1. ObjectProvider 의 사용

@Scope("singleton")
    static class ClientBean{

       // private final PrototypeBean prototypeBean;

        @Autowired
        private ObjectProvider<PrototypeBean> prototypeBeanProvider;

        public int logic(){
            PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
            prototypeBean.addCount();
            int count = prototypeBean.getCount();
            return count;
        }
        
    }

 

ObjectProvider 는 스프링 컨테이너를 통해서 해당 빈을 찾아 반환해주는 역할을 한다. 그러나, 프로토타입 스코프 빈의 경우에는 빈을 찾는다는 것은 곧 생성과도 같기에 매번 새로운 빈이 생성되는 것이다. 이를 통해서 프로토타입 스코프 문제를 해결할 수 있다.

 

그러나 이는 스프링에 의존적이라는 단점이 있다.

 

2. javax.inject 사용하기

 

build.gradle

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
	implementation 'javax.inject:javax.inject:1'
	
}

javax.inject 부분을 추가해주어야 한다.

 

@Scope("singleton")
    static class ClientBean{

        @Autowired
        private Provider<PrototypeBean> prototypeBeanProvider;
        //Provider javax.inject에서 import 하도록 주의!

        public int logic(){
            PrototypeBean prototypeBean = prototypeBeanProvider.get();
            prototypeBean.addCount();
            int count = prototypeBean.getCount();
            return count;
        }
        
    }

 

위의 방법에서 ObjectProvider 를 Provider 로 바꾸고 getObject 를 get으로만 바꿔주면 된다. 

 

이 방법은 딱 필요한 DL 정도의 기능만을 제공해서 간단하고 자바 표준이기에 스프링이 아닌 다른 컨테이너에서도 사용할 수 있다. 그러나 별도의 라이브러리가 필요하다는 번거로움이 있다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함