Spring - bean 생성 방식 이해하기

 

bean의 생성 방식과 Scope에 대해

  • 기본적으로 스프링의 모든 bean은 싱글턴이다.
  • 즉, ApplicationContext.getBean() 함수는 항상 동일한 인스턴스를 반환한다.
  • 하지만 ApplicationContext.getBean()을 호출할 때마다 새로운 인스턴스를 생성하도록 변경할 수도 있다.
  • 싱글턴과 비싱글턴의 변환은 간단하고 자유롭게 수행할 수 있다.
  • 구성 파일에서 bean의 scope 속성을 prototype으로 설정하면 비싱글턴 bean이 된다.
<beans...>
	<bean id="nonSingleton" class="com.apress...Singer"
		scope="prototype" c:_0="John Mayer" />
</beans>
...
// 구성파일에 컴포넌트 스캔이 없으면 애노테이션은 무시된다.
@Component(nonSingleton)
@Scope(prototype)
public class Singer {

	private String name = "unknown";

	public Singer(@Value("John Mayer") String name) {
		this.name = name;
	}
}

싱글턴을 사용해야 하는 시나리오

  • 상태가 없는 공유 객체인 경우
  • 읽기 전용 상태를 갖는 공유 객체인 경우
  • 공유 상태를 갖는 공유 객체인 경우
  • 쓰기 가능 상태를 갖는 대용량 처리 객체

비싱글턴을 고려해야 하는 시나리오

  • 쓰기 가능한 상태를 갖는 객체
  • private 상태를 갖는 오브젝트

bean 스코프 종류 (스프링 4 이상에서 지원)

  • 싱글턴(Singleton) : 스프링의 디폴트 스코프. 스프링 IoC 컨테이너당 하나의 객체만 생성됨
  • 프로토타입(Prototype) : 애플리케이션에서 요청할 때마다 새 인스턴스가 생성됨
  • 요청(Request) : 웹 애플리케이션에서 스프링 MVC 사용 시 모든 HTTP 요청이 있을 때 생성되고 요청 처리가 완료되면 소멸됨
  • 세션(Session) : 웹 애플리케이션에서 스프링 MVC 사용 시 모든 HTTP 세션이 시작되면 생성되고 세션이 끝나면 소멸됨
  • 글로벌 세션(Global Session) : 동일한 스프링 MVC 기반 포털 애플리케이션 내의 모든 포틀릿 간에 공유됨
  • 스레드(Thread) : 새로운 스레드에 의해 요청될 때 새로운 인스턴스가 생성되며 동일한 스레드 내에서는 같은 인스턴스가 사용됨
  • 사용자 정의(Custom) : org.springframework.beans.factory.config.Scope 인터페이스를 구현하고 스프링 구성에서 사용자 정의 스코프를 등록하여 사용함