Study/Spring

스프링 핵심기술 03. 스프링 IoC 컨테이너 - Bean의 Scope

going.yoon 2022. 2. 3. 22:46

Bean의 Scope는 기본적으로 싱글톤이다. 프로그램 구동시 Bean의 인스턴스는 오직 하나라는 뜻이다.

Bean이 가질수 있는 Scope 는 싱글톤 외에 매번 인스턴스를 새로 생성하는 ProtoType 도 있다.

 

만약, 프로토 타입 빈이 싱글톤 빈을 참조하면 어떻게 될까?

매번 프로토타입의 빈은 새로운 인스턴스로 생성되고, 그 인스턴스들이 바라보는 싱글톤 빈은 동일한 인스턴스일 것이다.

이럴 때는 아무런 문제가 되지 않는다.

 

그렇다면, 싱글톤 빈이 프로토 타입 빈을 참조하면 어떻게 될까?

싱글톤이 생성 된 이후에 프로토타입 빈이 변경이 되어도 해당 내용이 업데이트가 되지 않는다.

이를 업데이트하려면 

Scoped-proxy값을 설정해주거나, 참조시 참조 객체를 Object-Provider 리스트로 감싸주면 된다.

// #1. protoType의 Bean에 proxyMode를 클래스모드로 설정해준다.
@Component
@Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class Proto{

}


// #2. SingletonType의 Bean에서 Prototype의 객체를 ObjectProvider로 감싸준다.
@Component
public class Single{
	
    @Autowired
    private ObjectProvider<Proto> proto;
    
    public Proto getProto(){
    	return Proto.getIfAvailable();
    }

}