[Spring] 빈 생명주기(Bean LifeCycle) 콜백 개념 및 방식
애플리케이션 시작시점 및 종료시점에 작업이 필요한 경우가 있습니다.
ex) 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결
ex) 종료 시점에 연결 종료
스프링을 통해 초기화 작업 및 종료작업을 어떻게 진행하는지 알아보겠습니다.
스프링 빈의 생명주기
스프링 빈은 다음과 같은 생명주기를 가집니다.
객체생성 -> 의존관계 주입
스프링 빈은 객체를 생성하고 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료 되는데
개발자가 의존관계 주입이 끝난 시점을 어떻게 알 수 있을까요?
스프링 빈의 이벤트 라이프 사이클
스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료
스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메소드를 통해 초기화 시점을 알려주고
스프링 컨테이너가 종료되기 직전에 소멸 콜백 메소드를 통해 종료 시점을 알려주는 기능을 제공합니다.
그렇다면 스프링은 어떤 방법으로 빈 생명주기 콜백을 지원할까요?
크게 세가지 방법이 있습니다.
- 인터페이스(InitializingBean, DisposableBean)
- 설정 정보에 초기화 메서드, 종료 메서드 지정
- @PostConstruct, @PreDestroy 애노테이션
1. 인터페이스(InitialzingBean, DisposableBean)
빈 클래스가 InitializingBean, DisposableBean인터페이스를 구현하는 방식입니다.
의존관계 주입이 끝난후 호출되는 InitializingBean의 afterPropertiesSet()
소멸직전 호출되는 DisposableBean의 destory() 를 재정의합니다.
public class Example implements InitialzingBean, DisposableBean{
@Override
public void afterPropertiesSet() throws Exception{
//초기화 작업
}
@Override
public void destroy() throws Exception{
//소멸직전 작업
}
}
인터페이스(InitializingBean, DisposableBean) 방식의 특징
- 이 인터페이스는 스프링 전용 인터페이스라 코드가 스프링 전용 인터페이스에 의존한다.
- 초기화, 소멸 메서드의 이름을 변경할 수 없다. ( afterPropertiesSet(), destroy() )
- 코드를 수정할 수 없는 외부 라이브러리에 적용할 수 없다.
2. 설정 정보에 초기화 메서드, 종료 메서드 지정
설정 정보에 초기화, 소멸 메서드를 지정하는 방법입니다.
class Example{
public void init(){
//초기화 작업
}
public void close(){
//소멸직전 작업
}
}
빈 클래스에 초기화, 소멸직전 메소드를 구현하고
@Bean을 등록할때 초기화, 소멸 메서드를 지정합니다.
@Configuration
public class AppConfig{
@Bean(initMethod = "init", destroyMethod = "close")
public Example example(){
return new Example();
}
}
설정 정보 사용의 특징
- 메소들 이름을 자유롭게 지을 수 있다.
- 스프링 빈이 스프링 코드에 의존하지 않는다.
- 코드가 아닌 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.
3. @PostConstruct, @PreDestroy 애노테이션
빈 클래스에 초기화, 종료 메서드를 구현하고 각각 @PostContruct, @PreDestroy 애노테이션을 붙이는 방식이다.
class Example{
@PostConstruct
public void init(){
//초기화 작업
}
@PreDestroy
public void close(){
//소멸직전 작업
}
}
@PostConstruct, @PreDestroy 애노테이션 방식의 특징
- 스프링에서 가장 권장하는 방법
- 편리하다
- 스프링 종속적인 기술이 아니라 자바 표준이다. 스프링이 아닌 다른 컨테이너에서도 동작한다.
- 컴포넌트 스캔과 잘 어울린다.
- 외부 라이브러리에는 적용하지 못한다.
정리
지금까지 빈 생명주기 콜백의 세가지 방식을 알아보았습니다.
최신 스프링에서는 @PostContruct, @PreDestroy 애노테이션 사용을 권장하고
코드를 고칠 수 없는 외부 라이브러리를 초기화, 종료해야 하면 설정 정보에 초기화, 종료 메서드를 지정하는 방식을 사용
하는것을 권장하고 있다고합니다.