스프링 핵심 원리 정리 - 8
05 Oct 2020빈 생명주기 콜백
애플리케이션 시작 시점에 필요한 연결을 미리 하고 종료 시점에는 연결을 모두 종료하는 작업을 진행하려면 객체의 초기화와 종료 작업이 필요하다.
스프링 빈은 객체를 생성한 후에 의존관계를 주입하게 된다. 그러므로 초기화 작업은 의존관계 주입이 모두 완료된 후에 호출해야 한다. 스프링은 의존 관계 주입이 완료가 되면 콜백 메서드를 통해 초기화 시점을 알려준다. 또한, 스프링 컨테이너가 종료되기 전에 소멸 콜백도 준다.
스프링 빈의 이벤트 라이프 사이클
스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 빈 종료
- 초기화 콜백: 빈이 생성되고 빈의 의존관계 주입이 완료된 후 호출
- 소멸 전 콜백: 빈이 소멸되기 직전에 호출
인터페이스(InitializingBean, DisposableBean)
InitializingBean
:afterPropertiesSet
메서드를 제공하며 초기화를 지원한다.DisposableBean
:destroy
메서드를 제공하며 소멸을 지원한다.- 단점
- 스프링 전용 인터페이스로 코드가 스프링 전용 인터페이스에 의존한다.
- 초기화, 소멸 메서드의 이름을 변경할 수 없다.
- 외부 라이브러리에 적용할 수 없다.
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class SampleClient implements InitializingBean, DisposableBean{
@Override
public void afterPropertiesSet() throws Exception {
...
}
@Override
public void destroy() throws Exception {
...
}
}
빈 등록 시 초기화, 소멸 메서드 지정
- @Bean에
initMethod
와destroyMethod
에 초기화, 소멸 메서드를 지정할 수 있다. - 메서드 이름을 자유롭게 설정할 수 있으며 스프링 빈이 스프링 코드에 의존하지 않는다.
- 외부 라이브러리에도 적용할 수 있다.
- 종료 메서드 추론
- destroyMethod의 기본값은
(inferred)
로 지정하지 않아도close
,shutdown
이름의 메서드를 자동으로 호출하여 종료 메서드로 사용한다. - 추론 기능을 사용하고 싶지 않을 때는
destroyMethod=""
로 빈 공백을 지정한다.
- destroyMethod의 기본값은
@Configuration
public class SampleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public SampleClient sampleClient() {
return new SampleClient();
}
}
@PostConstruct, @PreDestroy
- 스프링에서 가장 권장하는 방법으로 초기화, 소멸 메서드에 애노테이션만 붙이면 되며 컴포넌트 스캔과도 잘 어울린다.
java.annotation
패키지에서 제공하며 스프링에 종속적인 기술이 아닌 자바 표준으로 스프링이 아닌 다른 컨테이너에서도 동작한다.- 외부 라이브러리에는 적용할 수 없으므로 외부 라이브러리를 초기화, 종료할 때는 @Bean을 이용하도록 한다.
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class SampleClient implements InitializingBean, DisposableBean{
@PostConstruct
public void init() throws Exception {
...
}
@PreDestroy
public void close() throws Exception {
...
}
}