스프링에서 이벤트 리스너를 사용해 보자
이벤트는 여러 가지 있다. 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);
}
}
해당 블로그는 백기선님의 인프런 강좌를 보고 작성하였습니다.
'Java & 스프링 > 스프링부트 톺아보기' 카테고리의 다른 글
[스프링 부트] 로깅 (0) | 2019.10.07 |
---|---|
[스프링 부트] 프로파일 (0) | 2019.10.03 |
[스프링 부트] 외부 설정 적용하기(2) (0) | 2019.09.25 |
[스프링 부트] 외부 설정 적용 하기 (0) | 2019.09.24 |
[스프링 부트] 스프링 인스턴스 사용해보기 (0) | 2019.09.23 |
댓글