[Spring Boot #8] 이벤트 리스너 및 웹 어플리케이션 타입 지정, 커맨드 인수 처리( Event Listener, Application Type, Command Arguments )
| 이벤트 리스너( Event Listener )
스프링 부트를 실행할 시 구동되는 단계마다 여러 이벤트들이 발생하게 됩니다. 스프링부트에서는 프로그래머가 이 이벤트들을 나타내는 객체를 인자로 받아 각 단계마다 원하는 처리를 할 수 있습니다.
스프링 부트가 구동될 때 여러 이벤트들이 있지만 그 중에서 ApplicationStartingEvent 와 ApplicationStartedEvent를 예로들어 알아보겠습니다.
ApplicationStartingEvent는 다음 코드를 통해 처리할 수 있습니다.
@Component
public class AppStartedSampleListener implements ApplicationListener<ApplicationStartingEvent> {
@Override
public void onApplicationEvent(ApplicationStartingEvent event) {
System.out.println("=====================");
System.out.println("Application starting");
System.out.println("=====================");
}
}
주의 할 것은 ApplicationStartingEvent는 스프링 컨테이너가 만들어지기 전에 생성되는 이벤트이기 때문에 이 이벤트를 처리하려면 다음과 같이 SpringApplication 객체에 해당 리스너를 추가해야합니다.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.addListeners(new SampleListener());
application.run(args);
}
}
ApplicationStartedEvent를 포함한 스프링 컨테이너가 만들어진 이후에 생성되는 이벤트들은 아래와 같이 스프링 빈 등록을 통해 이벤트를 처리할 수 있습니다.
@Component
public class AppStartedSampleListener implements ApplicationListener<ApplicationStartedEvent> {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println("=====================");
System.out.println("Application started");
System.out.println("=====================");
}
}
=======================
Application is starting
=======================
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.1.RELEASE)
(...)
=====================
Application started
=====================
| 스프링 부트 웹 어플리케이션 타입 지정
스프링 부트는 SpringApplication 객체를 통해 어플리케이션 타입을 지정할 수 있습니다. SpringApplication 객체는 스프링 컨테이너의 인터페이스인 ApplicationContext의 구현체를 프로그래머 대신 만들어줍니다. 프로그래머는 ApplicationContext의 구현체를 다음과 같은 방법으로 지정할 수 있습니다.
만약 Spring MVC와 Spring WebFlux가 둘 다 설정되있으면 Spring MVC가 우선 적용됩니다.
@SpringBootApplication
public class Application {
// 1. Servlet으로 설정 되있으면 AnnotationConfigServletWebServerApplicationContext (Spring MVC)
// 2. Servlet이 없으면 WebFlux로 되있으면 AnnotationConfigReactiveWebServerApplicationContext (Spring WebFlux)
// 3. 전부 없을 시 AnnotationConfigApplicationContext로 설정
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.addListeners(new SampleListener());
application.setWebApplicationType(WebApplicationType.SERVLET); // 웹 어플리케이션 타입 지정
application.run(args);
}
}
| 스프링 부트 커맨드 인수 처리
스프링 부트는 스프링 부트 어플리케이션이 실행될 때 준 커맨드 인수 옵션을 수월하게 처리할 수 있습니다. 여기서 주목해야 할 것은 VM 옵션은 처리하지 않고 오직 커맨드 인수 옵션만 처리한다는 것입니다.
아래와 같이 옵션을 주게될 경우 스프링 부트는 아래 코드를 실행할 때 -Dfoo VM 옵션은 무시한 채 --bar을 처리하게 됩니다.
java -jar target\springboot-tutorial-1.0-SNAPSHOT.jar -Dfoo --bar
@Component
public class AppRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("foo: " + args.containsOption("foo")); // VM 옵션은 arguments가 아님
System.out.println("bar: " + args.containsOption("bar"));
}
}
foo: false
bar: true
'Spring Framework > Spring boot #2' 카테고리의 다른 글
[Spring Boot #12] 스프링부트에서 테스트 작성하기( Spring Boot Test ) (0) | 2021.03.15 |
---|---|
[Spring Boot #11] 스프링 부트 로깅( Spring Boot Logging ) (0) | 2021.03.15 |
[Spring Boot #10] 스프링 부트 프로파일(Spring Boot Profile) (0) | 2021.03.15 |
[Spring Boot #9] 스프링 부트 외부 설정, 설정값 검증 (0) | 2021.03.15 |
[Spring Boot #7] 스프링부트(Spring Boot) HTTPS 구축, HTTP2, 다중 커넥터 설정 (0) | 2021.03.15 |
[Spring Boot #6] 스프링 부트 내장 웹 서버 톰캣(tomcat) 설정 (0) | 2021.03.15 |
[Spring Boot #5] 스프링 부트 자동 설정 만들기 : @ConditionalOnMissingBean, @ConfigurationProperties (0) | 2021.03.15 |
[Spring Boot #4] 스프링 부트 자동 설정 만들기 : Starter, AutoConfigure (0) | 2021.03.15 |