Java/Spring Boot
스프링 어플리케이션(+컨텍스트) 이벤트
ParkCheolu
2022. 8. 8. 10:14
자꾸 헷갈려서 정리
어플리케이션 시작 시 호출되는 순서
1. ApplicationStartingEvent
2. ApplicationEnvironmentPreparedEvent
3. ApplicationContextInitializedEvent
4. ApplicationPreparedEvent
5. ContextRefreshedEvent
6. ApplicationStartedEvent
7. ApplicationReadyEvent
여기서, 1-3 번 까지는 ApplicationContext 초기화 전에 시작된다. 때문에, 이 이벤트들은 @EventListener 를 통한 이벤트 등록으로 처리할 수 없다. 왜냐하면 @EventListener 는 해당 리스너 메서드를 가진 클래스가 스프링 빈으로 먼저 스캔되어야 작동하는데, 1-3번 이벤트들은 ApplicationContext 시작 전이기 때문에 이벤트 등록보다 실제 이벤트가 더 먼저 발생한다.
때문에 1-3 번 이벤트들이 작동하기 위해서는 아래와 같이 스프링 어플리케이션 시작 전에 리스너를 선등록해야 한다.
class MyApplicationStartingEventListener : ApplicationListener<ApplicationStaringEvent> {
override fun onApplicationEvent(event: ApplicationStartingEvent) {
...
}
}
...
fun main(args: Array<String>) {
SpringApplicationBuilder(MyApplication::class.java)
.listeners(
MyApplicationStartingEventListener(),
MyApplicationContextInitializedEventListener(),
MyApplicationEnvironmentPreparedEventListener(),
MyApplicationPreparedEventListener(),
)
.run(*args)
}
또, 이벤트는 등록한 순서대로 호출된다. 위의 방법으로 등록되는 이벤트는 ApplicationContext 초기화 시 스캐닝에 의해 등록된 이벤트보다 먼저 등록되기 때문에, 동일한 이벤트가 호출될 때, @EventListener 리스너보다 무조건 먼저 호출된다.