빈은 스프링 IoC/DI 컨테이너의 핵심 관리 대상이며, 주로 의존성 주입 (DI) 을 통해 빈을 프레임워크로부터 주입받아 사용하는 것이 일반적이다.
스프링 빈은 생성과 관리의 범위를 지정할 수 있는 스코프가 있다. 스코프에 따라 빈이 생성되고 유지되는 방식이 달라지며, 이를 통해 애플리케이션 요구사항에 맞는 객체 관리를 수행할 수 있다.
@Scope("request")
)
/submitForm
요청을 보냄 → 새로운 RequestScopedBean
인스턴스 생성됨.@Scope("session")
)
Spring 컨테이너가 @Autowired나 @Inject 등을 이용해 의존성 주입을 수행할 때, 싱글톤 스코프의 Bean들이 먼저 초기화됨. 하지만 request나 session 스코프의 Bean들은 사용자의 HTTP 요청이 발생할 때 생성되므로, 싱글톤 Bean이 이러한 스코프 Bean을 주입받으려고 할 때 아직 생성되지 않은 Bean을 참조하려는 문제가 발생할 수 있다.
예시 코드)
@Component
@Scope("request") // 요청(Request)마다 새로 생성되는 Bean
public class RequestScopedBean {
public RequestScopedBean() {
System.out.println("RequestScopedBean 생성됨! " + this);
}
}
@Service
public class SingletonService {
private final RequestScopedBean requestScopedBean;
@Autowired
public SingletonService(RequestScopedBean requestScopedBean) {
this.requestScopedBean = requestScopedBean;
}
public void process() {
System.out.println("사용 중인 RequestScopedBean: " + requestScopedBean);
}
}
문제 발생!
SingletonService
는 @Service
이므로 기본적으로 싱글톤(Singleton) 스코프이다.