본문 바로가기
Java & 스프링/스프링부트 톺아보기

[스프링부트] 이벤트 리스너

by hjhello423 2019. 9. 24.

스프링에서 이벤트 리스너를 사용해 보자

이벤트는 여러 가지 있다. ApplicationContext를 만들었을 때, 구동됐을 때, 시작됐을 때... 등등 여러 가지 이벤트가 있다.

 

3가지의 리스너를 사용해보도록 하겠다

1. ServletWebServerInitializedEvent

  - ( ? 요건 조금 찾아봐야겠다 )

2. ApplicationStartingEvent

  - 환경 또는 ApplicationContext가 사용 가능하기 전이나 ApplicationListener가 등록된 후 SpringApplication이 시작되자마자 발생하는 이벤트

3. ApplicationStartedEvent

  - 응용 프로그램 컨텍스트가 새로 고쳐지지만 응용 프로그램 및 명령 줄 러너가 호출되기 전에 게시된 이벤트

 

 

ApplicationListener를 이용하면 간단하게 이벤트를 핸들링할 수 있다.

일단 기본적인 형태는 아래와 같다.

public class SampleListener implements ApplicationListener<E> {

    @Override
    public void onApplicationEvent(E) {
		       
    }
}

 

이제 순서대로 이벤트를 등록해 보자

 

먼저 ServletWebServerInitializedEvent를 이용해서 스프링 부트 시작 시에 포트 정보를 출력해 보자

@Component
public class PortListener implements ApplicationListener<ServletWebServerInitializedEvent> {

    @Override
    public void onApplicationEvent(ServletWebServerInitializedEvent servletWebServerInitializedEvent) {
        ServletWebServerApplicationContext applicationContext = servletWebServerInitializedEvent.getApplicationContext();
        System.out.println("포트 정보 : " + applicationContext.getWebServer().getPort());
    }
}

서블릿의 초기화 시점에 발생하는 이벤트를 핸들링하여 ApplicationContext 객체에서 port정보를 출력했다.

@Component를 이용하여 bean으로 등록하였다. bean으로 등록하면 등록한 bean 중에 해당하는 이벤트 발생 시 자동으로 실행해 준다.

 

ApplicationStartingEvent와 ApplicationStartedEvent도 같은 방식으로 등록하면 된다.

주의할 점은 ApplicationStartingEvent는 ApplicationContext가 생성되기 이전에 발생하는 이벤트 이기 때문에 bean으로 등록해도 동작하지 않는다.

 

먼저 ApplicationStartedEvent의 사용 예이다.

간단하게 구현할 수 있다.

@Component
public class StartedListener implements ApplicationListener<ApplicationStartedEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartedEvent applicationStartedEvent) {
        System.out.println("===================");
        System.out.println("Started !!!!");
        System.out.println("===================");
    }
}

 

이제 ApplicationStartingEvent를 등록하여 보자.

ApplicationContext가 생성되기 전에 이벤트가 발생하므로 main에서 이벤트를 핸들링할 수 없다.

따라서 SpringApplication에 해당 리스너를 등록해주어야 한다. 또한 ApplicationStartingEvent리스너에는 @Component를 등록하여도 의미가 없다.

2번째 코드에서 볼 수 있듯이 addListeners()를 이용하여 

 

public class SampleListener implements ApplicationListener<ApplicationStartingEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartingEvent applicationStartingEvent) {
        System.out.println("========================");
        System.out.println("Application is Starting");
        System.out.println("========================");
    }
}
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Application.class);
        app.addListeners(new SampleListener());
        app.run(args);
    }
}

 

 

 

 

 

해당 블로그는 백기선님의 인프런 강좌를 보고 작성하였습니다.
반응형

댓글