부트 개념과 활용-08.SpringApplication


SpringApplication 1부

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html#boot-features-spring-application

  • 기본 로그 레벨 INFO
    • 뒤에 로깅 수업때 자세히 살펴볼 예정
  • FailureAnalyzer

  • 배너
    • banner.txtgifjpgpng
    • classpath 또는 spring.banner.location
    • ${spring-boot.version} 등의 변수를 사용할 수 있음.
    • Banner 클래스 구현하고 SpringApplication.setBanner()로 설정 가능.
    • 배너 끄는 방법
  • SpringApplicationBuilder로 빌더 패턴 사용 가능
    • app.setBannerMode(Banner.Mode.OFF)

resource에 해당 파일(banner.txt) 만들어 놓으면 구동시 출력됨. banner.txt

==========================================
01. Jaeuk Spring Boot ${application.version}
==========================================

직접 설정 가능.

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(DemoApplication.class);
        app.setBanner((environment, sourceClass, out) -> {
            out.println("===============");
            out.println("02. jaeuk"); // txt 가 더 우선순위 높음 (동시면 banner.txt 출력)
            out.println("===============");
        });
        // app.setBannerMode(Banner.Mode.OFF); // 배너모드 끌 수 있다.(출력 x)
        app.run(args);
    }
}

SpringApplicationBuilder 로 실행 가능

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder()
                .sources(DemoApplication.class)
                .bannerMode(Banner.Mode.OFF)
                .run(args);
    }
}

SpringApplication 2부

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html#boot-features-application-events-and-listeners

  • ApplicationEvent 등록
    • ApplicationContext를 만들기 전에 사용하는 리스너는 @Bean으로 등록할 수 없다.
  • SpringApplication.addListners()
    • WebApplicationType 설정
    • 애플리케이션 아규먼트 사용하기

      ApplicationArguments를 빈으로 등록해 주니까 가져다 쓰면 됨.

    • 애플리케이션 실행한 뒤 뭔가 실행하고 싶을 때

      ApplicationRunner (추천) 또는 CommandLineRunner
      순서 지정 가능 @Order

@Component
public class SampleListener implements ApplicationListener<ApplicationStartingEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartingEvent applicationStartingEvent) {
        System.out.println("====================");
        System.out.println("starting application");
        System.out.println("====================");
    }
}

아무것도 뜨지 않음..
(ApplicationContext를 만들기 전에 사용하는 리스너는 @Bean으로 등록할 수 없다.)
이런 경우에는 addListeners 메서드로 직접 등록을 해 주어야 한다.

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(DemoApplication.class);
        app.addListeners(new SampleListener()); // 리스너 추가 (SampleListener)
        app.run(args);
    }
}
====================
starting application
====================
==========================================
01. Jaeuk Spring Boot 
==========================================
2019-12-15 00:40:02.073  INFO 29531 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication on JUui-MacBook-Pro15.local with PID 29531 (/Users/jaeuk/Desktop/demo/target/classes started by jaeuk in /Users/jaeuk/Desktop/demo)
2019-12-15 00:40:02.075  INFO 29531 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default

출력되는 것을 확인할 수 있다.

또한 웹 어플리케이션의 타입 설정하는 부분도 있다.
app.setWebApplicationType(WebApplicationType.NONE);
// 서블릿, 웹플럭스가 있더라도 서블릿이 가장 우선순위
// 근데 웹플럭스만 있는 경우 쓰겠다. (WebApplicationType.REACTIVE)

애플리케이션 아규먼트 사용

설정
VM option : -Dfoo
program arguments : –bar

@Component
public class SampleListener {
    public SampleListener(ApplicationArguments arguments) {
        System.out.println("foo : " + arguments.containsOption("foo"));
        System.out.println("bar : " + arguments.containsOption("bar"));
    }
}
2019-12-15 00:52:31.489  INFO 29555 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default 
: default
foo : false
bar : true
2019-12-15 00:52:32.143  INFO 29555 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 0.942 seconds (JVM running for 1.412)

JVM은 애플리케이션 아규먼츠가 아닌 것을 볼 수 있습니다.

애플리케이션 뜬 다음에 뭔가를 추가적으로 실행을 하고 싶다.

2가지가 있긴 한데 ApplicationRunner가 더 좋다.(추천) 기능은 같다.

ApplicationRunner

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





© 2019. by jaeuk