[Spring Boot #8] 이벤트 리스너 및 웹 어플리케이션 타입 지정, 커맨드 인수 처리( Event Listener, Application Type, Command Arguments )

2021. 3. 15. 02:58 Spring Framework/Spring boot #2

| 이벤트 리스너( 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

 

 

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



출처: https://engkimbs.tistory.com/763?category=767865 [새로비]