Spring

[Spring] 빈 라이프사이클

재담 2022. 2. 13. 23:52

빈 객체의 라이프사이클

스프링 컨테이너는 다음의 두 가지 방식을 이용해서 빈의 라이프사이클을 관리할 수 있다.

  • 스프링이 제공하는 특정 인터페이스를 상속받아 구현
  • 스프링 설정에서 특정 메서드를 호출하라고 지정

 

스프링 컨테이너는 빈 객체를 생성하고 초기화하고 소멸할 때 다음과 같은 순서대로 빈 객체의 메서드를 실행한다.

이미지 출처 : https://www.cxmstore.com/index.php?route=product/category&cid=175&cname=spring+initialization

위의 그림을 보면 전체 흐름은 객체 [생성/프로퍼티 설정 -> 초기화 -> 사용 -> 소멸]의 네 단계를 거치는 것을 알 수 있다. 컨테이너는 빈 객체를 생성하고 프로퍼티를 설정한 뒤에 빈의 초기화를 진행하며, 컨테이너를 종료(close())하는 과정에서 생성한 빈 객체의 소멸 과정을 진행한다.

 

@PostConstruct, @PreDestroy 어노테이션

각각 초기화를 실행하는 메서드와 소멸을 실행하는 메서드에 적용한다.

public class ConnPool {

    @PostConstruct
    public void initPool() {
        // 커넥션 풀 초기화
    }

    @PreDestroy
    public void destroyPool() {
        // 커넥션 풀 종료
    }
}

이 두 어노테이션이 적용된 메서드를 초기화/소멸 과정에서 실행하려면 CommonAnnotationBeanPostProcessor 전처리기를 스프링 빈으로 등록해주어야 하는데 <context:annotation-config> 태그를 사용하면 CommonAnnotationBeanPostProcessor가 빈으로 자동으로 등록된다.

AnnotationConfigApplicationContext를 사용할 경우 어노테이션과 관련된 기능을 모두 활성화시키므로 별도의 설정을 추가할 필요는 없다. 그리고 초기화와 소멸 과정에서 사용될 메서드는 파라미터를 가져서는 안 된다.

 

InitializingBean, DisposableBean 인터페이스

객체의 초기화 및 소멸 과정을 위해서 두 인터페이스를 구현하면 된다.

  • InitializingBean - afterPropertiesSet : 빈의 초기화
  • DisposableBean - destroy : 빈의 소멸
public class ConnPool implements InitializingBean, DisposableBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        // 커넥션 풀 초기화
    }

    @Override
    public void destroy() throws Exception {
        // 커넥션 풀 종료
    }
}

이 두 인터페이스를 모두 구현해야 하는 것은 아니며, 필요한 인터페이스만 구현하면 된다.

 

커스텀 init 메서드와 커스텀 destroy 메서드

XML 설정을 사용한다면 다음과 같이 init-method 속성과 destroy-method 속성을 사용해서 초기화 및 소멸 과정에서 사용할 메서드의 이름을 지정하면 된다.

<bean class="[패키지경로].ConnPool" init-method="init" destroy-method="destroy" />

자바 설정을 사용한다면, @Bean 어노테이션의 initMethod 속성과 destroyMethod 속성을 사용하면 된다.

@Bean(initMethod = "init", destroyMethod = "destroy")
public ConnPool connPool() {
    return new ConnPool();
}

커스텀 메서드도 초기화와 소멸 과정에서 사용될 메서드는 파라미터를 가져서는 안 된다.


Reference

  • 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)