애플리케이션의 종료 시점에는 데이터베이스 커넥션 풀 혹은 네트워크 소켓과 같이 애플리케이션 시작 시점에 필요한 연결을 종료하기 위해, 객체의 초기화와 종료 작업이 필요하다.
스프링 빈은 객체 생성 ➔ 의존관계 주입의 라이프사이클을 가지고 있어 초기화 작업은 의존관계 주입이 완료된 뒤에 호출해야 한다. 그럼 개발자는 의존관계 주입이 완료된 시점을 어떻게 파악할까?
바로 ! 스프링이 제공하는 콜백 메서드(초기화 콜백 / 소멸 전 콜백) 기능을 활용하는 것이다.
❗ 스프링 빈의 이벤트 라이프사이클
: 컨테이너 생성 ➔ 빈 생성 ➔ 의존관계 주입 ➔ 초기화 콜백 ➔ 사용 ➔ 소멸전 콜백 ➔ 스프링 종료
스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 지원한다.
첫 번째로, InitializingBean
, DisposableBean
인터페이스를 상속받아 사용한다.
public class xxxxxx implements InitializingBean, DisposableBean {
··· 중략 ···
@Override
public void afterPropertiesSet() throws Exception {
··· 생략 ···
}
@Override
public void destroy() throws Exception {
··· 생략 ···
}
}
InitializingBean
: afterPropertiesSet()
메서드로 초기화를 지원한다.
DisposableBean
: destroy()
메서드로 소멸을 지원한다.
인터페이스(InitializingBean, DisposableBean) 단점
초기화, 소멸 메서드의 이름을 변경 ❌
외부 라이브러리 적용 ❌
이 인터페이스는 스프링 인터페이스로, 스프링 인터페이에 의존
인터페이스(InitializingBean, DisposableBean)와 달리 설정 정보에 @Bean(initMethod = "init", destroyMethod = "close")
같이 초기화, 소멸 메서드를 지정할 수 있다.
@Configuration
static class AppConfig {
··· 중략 ···
@Bean(initMethod = "init", destroyMethod = "close")
public Velog velog() {
··· 생략 ···
}
}
설정정보 초기화/소멸 메서드 사용의 특징
메서드 이름을 자유롭게 설정 가능
외부 라이브러리에도 초기화, 종료 메서드를 적용 가능
스프링 빈이 스프링 코드에 의존 ❌
@Bean
의 destroyMethod
속성에는 기본값이 (inferred)
(추론)으로 등록되어 있어, close, shutdown이라는 이름을 자동으로 종료메서드로 호출한다.
⇒ 종료 메소드를 따로 부여하지 않더라도 잘 작동한다.
❗추론 기능을 사용하기 싫다면
destroyMethod=""
처럼 빈 공백을 지정하면 된다.
최신 스프링에서 가장 권장하는 방법으로 매우 편리하다.
@PostConstruct
public void init() {
··· 생략 ···
}
@PreDestroy
public void close() {
··· 생략 ···
}
@PostConstruct
, @PreDestroy
애노테이션 특징
외부 라이브러리 사용 ❌
스프링에 종속적인 기술이 아닌 자바 표준으로, 다른 컨테이너에서도 동작한다.
❗ 외부 라이브러리를 초기화, 종료시
@Bean
-initMethod
,destroyMethod
사용하자.
📌 본 포스트는 스프링 핵심 원리 - 기본편 통해 학습한 내용을 요약 및 정리한 것입니다.