본문 바로가기

Back-end/Spring

빈 라이프 사이클과 범위

본문 내용은 초보 웹 개발자를 위한 스프링5 프로그래밍 입문(최범균)을 참고하고 있습니다.


스프링 컨테이너는 초기화와 종료라는 라이프 사이클을 갖는다.


ex)

// 1. 컨테이너 초기화

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);

 

// 2. 컨테이너에서 빈 객체를 구해서 사용

Greeter g = ctx.getBean("greeter", Greeter.class);

String msg = g.greet("스프링");

System.out.println(msg);

 

// 3. 컨테이너 종료

ctx.close();


1. 컨테이너 초기화

위 코드에서 AnnotationConfigApplicationContext의 생성자를 이용하여 컨텍스트 객체를 생성하는데 이 시점에 스프링 컨테이너를 초기화한다.

스프링 컨테이너는 설정 클래스에서 정보를 읽어와 알맞은 빈 객체를 생성하고 각 빈을 연결(의존 주입)하는 작업을 수행한다.

 

2. 컨테이너에서 빈 객체를 구해서 사용

컨테이너 초기화가 완료되면 컨테이너를 사용할 수 있다. 컨테이너를 사용한다는 것은 getBean()과 같은 메소드를 이용해 컨테이너에 보관된 빈 객체를 구한다는 것을 뜻한다.

 

3. 컨테이너 종료

컨테이너 사용이 끝나면 close()메소드를 사용하여 컨테이너를 종료한다.


스프링에서 빈 객체의 라이프 사이클은 스프링 컨테이너가 관리한다. 다음은 빈 객체의 라이프 사이클이다.

https://tmxhsk99.tistory.com/161

스프링 컨테이너를 초기화할 때 1)스프링 컨테이너는 가장 먼저 빈 객체를 생성하고, 2)의존을 설정한다. 의존 자동 주입을 통한 의존 설정이 이 시점에 수행된다.

3)모든 의존 설정이 완료되면 빈 객체의 초기화를 수행한다. 빈 객체를 초기화하기 위해 스프링은 빈 객체의 지정된 메소드를 호출한다.

4)스프링 컨테이너를 종료하면 스프링 컨테이너는 빈 객체의 소멸을 처리한다. 이때에도 지정한 메소드를 호출한다.


빈 객체의 라이프 사이클 중 초기화와 소멸에서 지정한 메소드를 호출한다고 했다. 스프링은 다음의 두 인터페이스에 이 메소드를 정의하고 있다.

 

     - org.springframework.beans.factory.InitalizingBean

     - org.springframework.beans.factory.DisposableBean

 

두 인터페이스는 다음과 같다.


ex)

// 생성

public interface InitializingBean {

    void afterPropertiesSet() throws Exception;

}

 

// 소멸

public interface DisposableBean {

    void destroy() throws Exception;

}


InitializingBean 인터페이스와 DisposableBean 인터페이스를 구현할 수 없거나 두 인터페이스를 사용하고 싶지 않은 경우에는 스프링 설정에서 직접 메소드를 지정할 수 있다.

 

@Bean 태그의 initMethod 속성

빈 객체 초기화를 위한 속성으로 @Bean(initMethod = "초기화메소드이름") 이렇게 사용된다.

 

@Bean 태그의 destroyMethod 속성

빈 객체 소멸을 위한 속성을 @Bean(destroyMethod = "소멸메소드이름") 이렇게 사용된다.


빈 객체의 생성과 관리 범위

빈은 별도 설정을 하지 않는다면 싱글톤 범위를 갖는다.

@Scope("prototype")을 사용하면 해당 빈이 프로토타입 범위를 갖게 된다.

싱글톤 범위를 명시적으로 지정하고 싶다면 @Scope("singleton")을 사용해주면 된다.

프로토타입 범위를 갖는 빈은 객체의 소멸 메소드를 실행하지 않아 소멸 처리를 코드에서 직접 해줘야 한다.

'Back-end > Spring' 카테고리의 다른 글

MVC 핵심 구성 요소  (0) 2021.10.01
AOP 프로그래밍 (학습필요)  (0) 2021.10.01
컴포넌트 스캔(@Component, @ComponentScan) - 학습필요  (0) 2021.10.01
의존 자동 주입  (0) 2021.10.01
스프링 DI  (0) 2021.10.01