어흥

[Spring] Spring Container 본문

Spring

[Spring] Spring Container

라이언납시오 2023. 7. 20. 09:05
728x90
반응형

1. 스프링 컨테이너란?

스프링 빈을 관리하는 컨테이너로, 기본적으로 스프링 빈을 싱글톤 스코프로 관리한다.

스프링 빈을 저장하는 방식은 아래와 같다

<Bean 이름, Bean 객체>

그렇다면 Singleton이 아닌 매 요청마다 새로운 객체를 생성해서 반환해주는 Prototype Bean Scope는 어떻게 생성되고 관리될까?

 

2. Prototype Scope

프로토타입 빈의 생성 과정

#1. 빈 등록: 프로토타입 스코프의 빈은 스프링 컨테이너에 미리 등록된다.
빈의 등록은 스프링의 XML 설정 파일이나 Java Config를 통해 이뤄진다

#2. 빈 요청: 다른 빈이 프로토타입 빈을 필요로 할 때, 해당 빈을 얻기 위해 스프링 컨테이너에 요청한다

#3. 빈 생성: 프로토타입 빈의 요청이 들어오면 스프링 컨테이너는 새로운 빈 인스턴스를 생성한다

#4. 의존성 주입: 생성된 빈 인스턴스에 필요한 의존성을 주입. 이 때, 프로토타입 빈이 다른 싱글톤
빈을 참조하면 싱글톤 빈은 새로 생성하지 않고 기존의 인스턴스를 주입

#5. 빈 반환: 생성된 빈 인스턴스를 요청한 빈으로 반환\

#6. 선택적 라이프사이클 콜백: 빈의 관리는 클라이언트에게 있으므로 @PreDestroy와 같은 기능이 자동으로
호출되지 않아서 종료 메서드도 클라이언트가 직접 처리해야 한다

 

프로토타입 스코프 빈은 생성되고 주입된 후에 컨테이너에서의 관리가 끝나며, 더 이상 해당 빈에 대한 추적이 이뤄지지 않는다

 

3. @Configuration

Bean 설정 파일에서 @Configuration을 사용하지 않고 @Bean만을 사용한다면 어떻게 될까?

    @Test
    void configurationDeep(){
        ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
        AppConfig bean = ac.getBean(AppConfig.class);

        System.out.println("bean = " + bean.getClass());

    }

 

@Configuration이 있는 경우: class (패키지경로).AppConfig$$SpringCGLIB$$0

@Configuration이 없는 경우: class (패키지경로).AppConfig

즉, AppConfig 내에서 설정한 @Bean들은 스피링 빈으로 등록이 되지만, 싱글톤임이 보장되지 않고 매번 새로운 인스턴스를 반환한다

 

 

728x90
반응형
Comments