스프링 부트의 로딩 시점을 조작하기 - 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 의 확장성이 더 높다.