본문 바로가기
Dev/Spring Boot

[스프링 부트 개념과 활용] SpringApplication 2부

by dev_jsk 2020. 8. 20.
728x90
반응형

ApplicationEvent

  • 다양한 시점의 ApplicationEvent 존재
  • ApplicationContext를 만들기 전에 사용하는 리스너는 @Bean으로 등록할 수 없다. 왜냐하면 SpringApplication.addListeners()를 통해 해당 리스너를 생성하기 때문이다.

예제

1. ApplicationContext 생성 이전

// SampleListener.java
// ApplicationStartingEvent 사용

public class SampleListener implements ApplicationListener<ApplicationStartingEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartingEvent event) {
        System.out.println("==============");
        System.out.println("App Starting");
        System.out.println("==============");
    }
}

 

// Application.java
// SpringApplication.addListeners() 사용

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		SpringApplication app = new SpringApplication(Application.class);
		app.addListeners(new SampleListener());
		app.run(args);
	}
}

2. ApplicationContext 생성 이후

// SampleListener.java
// ApplicationStartedEvent 사용
// SampleListener Bean 등록

@Component
public class SampleListener implements ApplicationListener<ApplicationStartedEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        System.out.println("===========");
        System.out.println("App Started");
        System.out.println("===========");
    }
}

 

// Application.java
// SpringApplication.addListeners() 미사용
// 왜냐하면 SampleListener를 Bean으로 등록했기 때문에

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		SpringApplication app = new SpringApplication(Application.class);
		app.run(args);
	}
}

 

WebApplicationType

  • WebApplicationType.NONE : 웹 응용 프로그램으로 실행되지 않아야 하며 내장된 웹 서버를 시작하지 않아야 한다.
  • WebApplicationType.REACTIVE : 반응형 웹 응용 프로그램으로 실행. 내장된 반응형 웹 서버를 시작해야 한다.
  • WebApplicationType.SERVLET : 서블릿 기반 웹 응용 프로그램으로 실행. 내장된 서블릿 웹 서버를 시작해야 한다.
  • Spring Web MVC가 들어있으면 SERVLET으로 동작, Spring Web Flux가 들어있다면 REACTIVE로 동작. 둘 다 들어있을 경우 SERVLET으로 동작

Application Arguments

예제

1. SampleListener.java 생성

// SampleListener.java

@Component
public class SampleListener {
    public SampleListener(ApplicationArguments arguments) {
        System.out.println("foo : " + arguments.containsOption("foo"));
        System.out.println("bar : " + arguments.containsOption("bar"));
    }
}

* 어떤 Bean에 생성자가 1개이고, 그 생성자의 파라미터가 Bean일 경우 스프링이 알아서 그 Bean을 주입한다.

2. Application.java 수정

// Application.java

@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		SpringApplication app = new SpringApplication(Application.class);
		app.setWebApplicationType(WebApplicationType.NONE);
		app.run(args);	// run 함수에 arg 넘겨주어야 결과 확인 가능
	}
}

동작 확인

JVM Option, Command Args 동시 입력
결과

ApplicationRunner

// SampleListener.java

@Component
public class SampleListener implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("foo : " + args.containsOption("foo"));
        System.out.println("bar : " + args.containsOption("bar"));
    }
}

Command Argstrue 출력

CommandLineRunner

// SampleListener.java

@Component
public class SampleListener implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        Arrays.stream(args).forEach(System.out::println);
    }
}

JVM Option은 출력되지 않는다.

 

@Order

  • ApplicationRunner가 여러개 일 경우(Bean 이 여러개 일 경우) @Order를 이용해 순서를 정할 수 있다.
  • 숫자가 낮을수록 먼저 실행된다.
// SampleListener.java

@Component
@Order(1)
public class SampleListener implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("foo : " + args.containsOption("foo"));
        System.out.println("bar : " + args.containsOption("bar"));
    }
}
728x90
반응형

댓글