스프링 내부에서는 스프링의 라이프 사이클과 관련하여 이벤트가 있는데 순서는 다음과 같다.
스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백(EVENT) → 앱 본연의 동작 수행 → 소멸전 콜백(EVENT) → 스프링 종료
즉, 스프링 컨테이너가 가동되고 본격적으로 앱이 동작하기 전에 한 번, 스프링이 종료되기 전에 한 번 특정한 동작을 수행할 수 있는 이벤트가 존재한다.
이러한 이벤트에서 우리는 초기화 콜백을 이용하여 테스트로 사용할 데이터를 앱의 사전 동작 전에 미리 저장한다던지, 또는 소명전 콜백을 이용하여 사고에 가깝게 스프링이 종료되는 상황에서 데이터를 백업하는 등의 동작을 수행할 수 있다.
위의 기능을 사용하는 방법은 크게 3가지가 있지만, 2가지는 간단히 언급만하고 가장 일반적으로 사용하는 방식인 @PostConstruct, @Predestroy 방식을 살펴보자.
1. 클래스가 InitializingBean과 DisposalBean을 상속받고 각각 afterPropertiesSet과 destroy 메서드를 구현하는 방식이다. 이때 초기화 콜백시 afterPropertiesSet이, 소멸전 콜백색 destroy가 호출된다.
2. @Bean 애노테이션에 내장된 설정방식으로 각각 initMethod 필드와 destroyMethod필드의 생성과 소멸시 적용될 메서드명을 정해주면 된다.
→ @Bean(initMethod="start", destroyMethod="end")
3. @PostConstruct, @Predestroy 가 일반적으로 가장많이 사용하는 방식이다.
@Component
public class VipClient {
//...
@PostContstruct
public void start() {
VipClient testMock = new VipClient("name", identityNumber);
USER_REPOSITORY.save(testMock);
}
@PreDestroy
public void end() {
USER_REPOSITORY.removeOneById("identityNumber");
}
}