[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 MVCSpring 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


참고자료 : https://www.inflearn.com/course/스프링부트

이 글을 공유하기

댓글(0)

Designed by JB FACTORY