spring과 spring boot에서 기본적으로 제공해주는 이벤트들이 있다.
이 이벤트들에는 애플리케이션이 시작될 때, 에플리케이션 컨텍스트를 만들었을 때 등과 같은 다양한 시점이 있다.
Event 리스너를 만들때는 ApplicationListener<타입>를 implements 해서 만든다.
이때 타입을 ApplicationStartingEvent로 주면 이 이벤트가 발생하면(애플리케이션이 시작될 때) 해당 리스너가 실행된다.
이때 리스너가 Bean이면, 등록되어있는 Bean 중에 해당하는 이벤트에 대한 리스너는 알아서 실행을 해준다.
이때 주의할 것이 있다. 이 이벤트가 언제 발생하는 것인지가 중요한 기점이 된다.
application context가 만들어졌느냐 안 만들어졌느냐를 기준으로 application context가 만들어진 다음에 발생하는 이벤트들은 그 이벤트들의 리스너가 Bean이면 알아서 호출해줄 수 있는데, application context가 만들어지기 이전에 발생한 이벤트(ex. ApplicationStartingEvent같은 이벤트)는 Bean으로 등록한다 하더라도 리스너가 동작하지 않는다.
그래서, 이런경우는 직접 등록해줘야한다.
이 때, SpringApplication의 addListeners를 사용해서 에플리케이션에 리스너를 등록한다.
만약, 리스너의 타입이 ApplicationStartedEvent인 경우는 application context가 만들어진 이후이기 때문에 Bean으로만 등록해주면 리스너가 동작한다.
Application의 타입은 3가지가 있다.
NONE 타입 / REACTIVE 타입 / SERVLET 타입
만약, Spring MVC가 들어있으면, 기본적으로 SERVLET 타입으로 돈다.
만약, Spring WebFlux가 들어있으면, 기본적으로 REACTIVE 타입으로 돈다.(servlet이 있는 경우는 SERVLET 타입으로 돈다.)
만약, 둘 다 없는 경우는 NONE 타입으로 돈다.
Edit Configuration으로 들어간다.
-D로 시작하는 옵션은 JVM옵션이고,
--로 시작하는 옵션이 Application Argument이다.
JVM옵션에 -Dfoo
Application argument에 --bar
를 설정해준다.
그리고 Argument를 출력해 볼 컴포넌트를 만들어준다.
spring은 만약 어떤 Bean에 생성자가 하나고 그 생성자의 파라미터가 Bean일 경우에는 그 Bean을 spring이 알아서 주입해준다.
그래서, 그냥 에플리케이션을 실행해주면 Bean이 생성되므로, 생성자에 아까 설정한 foo와 bar를 찍어볼 수 있다.
bar만 들어있음을 볼 수 있다.
즉, --로 들어오는 옵션만 argument로 사용하는 것이다.(JVM옵션은 Application argument가 아니다.)
Application을 실행하고 난 후, 뭔가를 실행하고 싶을 때 사용한다.
클래스를 만들어주고 ApplicationRunner를 implements 한다.
ApplicationRunner는 ApplicationArguments라는 타입으로 메서드를 만들어준다.
따라서 아까 사용한 containsOption같은 유용한 메서드들을 바로 사용해볼 수 있다.
만약 ApplicationRunner가 여러개인 경우, @Order 어노테이션을 붙여 순서를 지정해줄 수 있다.(숫자가 낮을수록 높은 우선순위)