Scope
Spring에서는 Spring Bean의 범위는 Singleton이 기본이다.
때로는 Springton 범위가 아닌 Prototype을 가져야할 때가 있다.(아주 가끔)
Scope
- Singleton
- Prototype
- Request
- Session
- WebSocket
- …
스코프를 설정하는 방법은 Singleton은 기본이니 따로 설정 방법이 필요 없고 Prototype만 있다.
@Component
@Scope("prototype")
public Class Proto{
}
위와 같이 하면 Scope가 prototype으로 정해진다.
Prototype과 Singleton을 생각할때 주의해야할점이있다. Prototype Bean안에 Singleton이 있는건 큰문제가 없지만 Singleton Bean안에 Prototype이 있는건 원래 의도가 Singleton안에 있는 Prototype Bean이 Prototype범위이길 기대한 것이지만 Singleton Bean안에 있기 때문에 1개의 reference이다.
이런 문제를 해결하는 방법은 3가지가 있다
- ScopeProxyMode
- ObjectProvider
- Provider
ScopeProxyMode는 Prototype Bean에 Annotation으로 해결한다
@Component
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Proto{
}
이렇게 하면 Proto class를 Proxy패턴으로 감싸서(Proxy가 Proto를 상속받음) 직접 접근을 막아서 Prototype으로 만들어서 준다.
ObjectProvider는 Singleton Bean에서 프로퍼티를 Proto로 하지 않고 Spring code를 이용해서 받는 방식이다
@Component
public class Single {
@Autowired
private ObjectProvider<Proto> objectProvider;
public Proto getProto2(){
return objectProvider.getIfAvailable();
}
}
이렇게 하면 Spring code인 ObjectProvider를 이용해서 Prototype으로 받을 수 있다
그다음으로는 Provider이다.
@Component
public class Single {
@Autowired
private Provider<Proto> objectProvider;
public Proto getProto2(){
return Provider.get();
}
}
ObjectProvider와 유사한 방법이다
3가지 방식중 1번째 방식을 추천한다 간편하기때문에
Singleton을 사용할때는 항상 Property가 공유된다는 점을 유의해야한다(Thread에서 safe하지 않다)
그리고 ApplicationContext가 만들어질때 다 같이 만들어지기 때문에 초기 구동시 속도가 느리다.
'Spring' 카테고리의 다른 글
스프링 HttpMessageConverters (0) | 2021.01.27 |
---|---|
Autowired (0) | 2020.05.11 |
Environment (0) | 2020.05.11 |
Component (0) | 2020.05.11 |
IOC 컨테이너 (0) | 2020.05.11 |