23.5 어플리케이션 이벤트와 리스너들

SpringApplicationContextRefreshedEvent와 같은 스프링 프레임워크가 발생시키는 이벤트들과 더불어 몇몇 추가적인 어플리케이션 이벤트들을 발생시킨다.

몇몇 이벤트들은 ApplicationContext가 생성되기 전에 발생하기 때문에 리스너를 @Bean으로 등록할 수없다. 그런 리스너들은 SpringApplication.addListeners(..)SpringApplicationBuilder.listeners(...) 메소드들을 사용해 등록할 수있다. 어플리케이션이 생성되는 방식과 관계없이 이 리스너들이 자동적으로 등록되도록 하길 원하면, META-INF/spring.factories 파일을 프로젝트에 추가하고 거기에 리스너(들) org.springframework.context.ApplicationListener 키값을 사용해 다음과 같이 참조시킨다.

org.springframework.context.ApplicationListener=com.example.project.MyListener

Application 이벤트들은 실행시 다음과 같은 순서대로 발생한다.

  1. ApplicationStartingEvent은 실행은 시작했지만 등록된 리스너들과 Initializer들의 등록을 제외한 어떤 것도 진행 되기 전에 전송된다.

  2. ApplicationEnvironmentPreparedEvent은 Context에서 사용될 Environment을 찾았지만 아직 Context가 생성되기 전에 전송된다.

  3. ApplicationPreparedEvent은 정의된 빈들이 로딩되고 refresh가 시작되기 바로전에 전송된다.

  4. ApplicationReadyEvent 는 refresh되고 관련 callback 들이 진행 된 이후에 전송된다. 이 시점은 어플리케이션이 요청에 대해서 서비스할 준비 되었음을 가리킨다.

  5. ApplicationFailedEvent은 시작 도중 예외가 발생하면 전송된다.

어플리케이션 이벤트들을 사용할 필요가 없는 경우가 자주있다. 그러나 이벤트들을 알고 있으면 훨씬 편리할 수있다. 내부적으로 스프링 부트는 많은 일들을 처리하기 위해 이벤트들을 사용한다.

어플리케이션 이벤트들은 스프링 프레임워크의 이벤트 발생 메카니즘을 사용해 전송된다. 이 메카니즘에서는 자식 컨텍스트의 리스너들에게 발생한 이벤트는 조상 컨텍스트들의 리스너에게도 발생되도록 한다. 이 결과로 만약 어플리케이션이 SpringApplication 객체의 계층관계를 사용한다면 리스너는 같은 타입의 어플리케이션 이벤트 객체들을 여러개 받게 된다.

리스너가 자신의 컨텍스트에서 발생한 이벤트인지 자식 컨텍스트에서 발생한 이벤트인지를 구별하게 하기 위해, 그것의 어플리케이션 컨텍스트를 주입받아서 이벤트가 발생한 Context와 비교해야 한다. 컨텍스트는 ApplicationContextAware를 구현하거나 리스너가 빈일 경우 @Autowired를 사용해서 주입받을 수있다.

Last updated