스프링 부트의 로딩 시점을 조작하기 - WebApplicationType, ApplicationListener, ApplicationRunner
WebApplicationType
- 스프링어플리케이션의 시작 단계 전후에서 여러가지 조작이 가능하다.
setWebApplicationType(WebApplicationType.NONE);
은 무척 쓸모가 많다. NONE 으로 할 경우 web을 의존성으로 받았더라도 웹 어플리케이션이 유지되지 않고 컨텍스트를 생성 후 종료한다. 컨텍스트 생성 여부나 DB 커넥션 등을 간편하게 테스트 가능하다.- 기본 값은 SERVLET 이며 REACTIVE 등 설정 가능하다.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.setWebApplicationType(WebApplicationType.NONE);
app.addListeners(new ApplicationListenerBefore());
app.run(args);
}
}
ApplicationListener
- 스프링 컨텍스트가 동작하기 전에 수행한다.
- 컨텍스트가 동작하기 전이므로 빈으로 동작할 수 없다. 리스너를 등록해야 하며 main 메서드의 SpringApplication를 통해 등록 가능하다.
app.addListeners(new ApplicationListenerBefore());
public class ApplicationListenerBefore implements ApplicationListener<ApplicationStartingEvent> {
@Override
public void onApplicationEvent(ApplicationStartingEvent event) {
System.out.println("=============================================");
System.out.println("ApplicationListener<ApplicationStartingEvent>");
System.out.println("=============================================");
}
}
ApplicationListener
- 스프링 컨텍스트가 동작하고 나서 수행한다.
- bean으로 등록하여 사용 가능하다.
@Component
public class ApplicationListenerAfter implements ApplicationListener<ApplicationStartedEvent> {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println("============================================");
System.out.println("ApplicationListener<ApplicationStartedEvent>");
System.out.println("============================================");
}
}
ApplicationRunner
- ApplicationStartedEvent 와 유사하게 동작한다. 빈 등록 및 컨텍스트 생성 완료 후 동작한다.
- program argument 를 받을 수 있다. jar 파일을 동작할 때
--foo
형태로 작성한다.-Dfoo
는 JVM 인자이다.
@Component
public class ApplicationRunnerAndArgs implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("=================");
System.out.println("ApplicationRunner");
System.out.println("Application Argument : contain foo? " + args.containsOption("foo"));
System.out.println("Application Argument : contain bar? " + args.containsOption("bar"));
System.out.println("==================");
}
}
- CommandLineRunner와 유사하나 ApplicationRunner 의 확장성이 더 높다.