본문 바로가기

Java

Java - Srping 시작할 때 동작하는 코드 작성하는 법

Spring Framework는 Event 와 Event가 발행되었을때 이를 처리하는 EventHandler(Listener)기능을 지원한다. Event 와  Listener 모두 사용자가 직접 정의하고 발행 할 수 있다. 사용자 정의 Event 외에도 기본적으로 제공하는 Event 가 존재하며, Spring Application 의 동작과 관련해서는 ApplicationEvent 가 존재한다.

따라서 Spring 이 시작할때 어떤 코드를 실행하고 싶다면 ApplicationEvent 클래스 중 시작과 관련된 Event인  ContextRefreshedEvent를 수신하는 Listener를 정의 하면 된다.

@Component
@Slf4j
public class ApplicationEventListener {

    @EventListener({ContextRefreshedEvent.class})
    public void handleRefreshEvent() {
        log.info("ApplicationContext is ready!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    }
    
    // Spring 시작시 ApplicationContext is ready!!!!!!!!!!!!!!!!!!!!!!!!!!! 로그가 보인다.
}


ContextRefreshedEvent 외에도 몇가지 Event 들이 존재 한다.

  • ContextRefreshedEvent
    ApplicationContext가 초기화 또는 새로 고침(ConfigurableApplicationContext.refresh()) 될 때 발행된다.
    여기서 초기화 란 모든 빈이 로드되고, 후 처리기(post-processor) 빈이 감지되고 활성화되고, 싱글톤이 사전 인스턴스화되고, ApplicationContext 객체가 사용할 준비가된 것을 의미 한다.

  • ContextStartedEvent
    ApplicationContext가 ConfigurableApplicationContext.start () 메소드를 사용하여 시작될 때 발행된다. 
    일반적으로이 명시적으로 중지 한 후에 빈을 다시 시작하거나 초기화 시에 시작되지 않은 콤포넌트를 시작하는경우에도 발행된다.

  • ContextStoppedEvent
    ApplicationContext가 ConfigurableApplicationContext.stop() 메소드를 사용하여 중지 될 때 발행된다.

  • ContextClosedEvent
    Application 이 ConfigurableApplicationContext.close() 메소드를 사용하거나 JVM 종료 후크를 통해 닫힐 때 발행된다.

  • RequestHandledEvent
    HTTP 요청이 서비스되었음을 모든 빈에 알리는 이벤트. 이 이벤트는 요청이 완료된 후에 발행되며, DispatcherServlet을 사용하는 웹 애플리케이션에만 적용된다.

  • ServletRequestHandledEvent
    RequesHandledEvent의 하위 클래스로 RequestHandler의 내용에 Servlet 과 관련된 내용들(URL, method, servletName, statusCode 등) 이 추가로 포함 되어 있다.

 

참고

https://docs.spring.io/spring-framework/reference/core/beans/context-introduction.html#context-functionality-events

반응형