본죽이
195
2019-01-12 01:09:01 작성 2019-01-12 01:12:54 수정됨
1
142

spring bean 스코프 설정시 prototype은 언제 쓰이나요?


bean 스코프에는 singleton과 prototype이 있죠.

그런데 prototype 은 .getBean()을 할때 생성되는데, 이게 어디에 쓰이는지 잘 모르겠습니다.


아래 코드로 질문드립니다.

@Service
public class SingletonService {
    @Autowired
    private ProtoService protoService;
}
@Service
@Scope("prototype")
public class ProtoService {

}

코드를 설명하자면..

1. SingletonService, ProtoService 2개의 @Service를 등록했고 각각 지 이름처럼 스코프를 설정했습니다.

2. SingletonService 안에 ProtoService를 주입 받을수 있게 하였습니다.


이때 빈의 생성은 다음과 같이 이루어 집니다.

1. 앱 구동시 스캔되어 BeanFactory에 빈으로 등록 되는데, 위 2개 클래스중 스코프가 singleton인 SingletonService만 먼저 등록 됩니다. 

2. prototype 스코프인 ProtoService 빈은 .getBean() 할때 생성 되는데, 마침 SingletonService의 멤버변수  @Autowired Prototype 로 주입을 받고 있고,  ApplicationContext.getBean(ProtoService.class)으로 가져올 것입니다. 이렇게 주입 시점에 ProtoService 빈이 새로 하나가 생성 됩니다.

여기까지가 제가 알고있는 개념입니다.


그런데 이 개념만으로는 당췌 prototype을 어떻게 써먹을지 모르겠습니다.

이미 SingletonService 가 싱글톤이라 더이상 생성되지도 않고, ApplicationContext 가 close 되지 않는 이상 소멸되지도 않습니다.

SingletonService 가 의존하고 있는 PrototypeService 처음 주입후 새로 생성될 기회가 없기에 영원히 싱글톤으로 동작하는거죠. 


대체 어떨때 prototype 스코프를 쓰게되는지 잘 모르겠습니다.

설마 ApplicaitonContext.getBean() 을 그냥 쓰는건가요 ?? 별로 나이스해 보이진 않는데 어떻게들 사용하시는지 모르겠습니다.

사용한 사례가 있으시다면 알려주시면 감사하겠습니다.

0
0
  • 답변 1

  • LichKing
    12k
    2019-01-12 08:32:56

    음...그러게요. 5년정도 스프링이용해서 개발하고있지만 써본적이없네요.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.