[Spring] 빈 라이프사이클
빈 객체의 라이프사이클
스프링 컨테이너는 다음의 두 가지 방식을 이용해서 빈의 라이프사이클을 관리할 수 있다.
- 스프링이 제공하는 특정 인터페이스를 상속받아 구현
- 스프링 설정에서 특정 메서드를 호출하라고 지정
스프링 컨테이너는 빈 객체를 생성하고 초기화하고 소멸할 때 다음과 같은 순서대로 빈 객체의 메서드를 실행한다.

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