1️⃣ Been 객체

빈은 스프링 IoC/DI 컨테이너의 핵심 관리 대상이며, 주로 의존성 주입 (DI) 을 통해 빈을 프레임워크로부터 주입받아 사용하는 것이 일반적이다.

사용 이유

  1. 객체 관리의 효율성 : 스프링 컨테이너가 빈의 생성, 소멸, 의존성 관리를 자동으로 처리해주므로 개발자는 객체 관리에 대한 부담을 덜고 비즈니스 로직에 집중할 수 있다.
  2. 컴포넌트 재사용성 및 유지보수성 향상: 빈은 독립적인 단위로 설계되어 재사용성이 높고, 설정과 코드가 분리되어 유지보수가 용이하다.

빈의 스코프(Scope)

스프링 빈은 생성과 관리의 범위를 지정할 수 있는 스코프가 있다. 스코프에 따라 빈이 생성되고 유지되는 방식이 달라지며, 이를 통해 애플리케이션 요구사항에 맞는 객체 관리를 수행할 수 있다.

  1. Singleton (기본 스코프)
  2. Prototype
  3. Request (@Scope("request"))
  4. Session (@Scope("session"))
  5. GlobalSession

Request 스코프와 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);
    }
}

문제 발생!