Develop/Spring Boot

10. SpringApplication 기본

자라선 2020. 7. 27. 16:04

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

 

 

Spring Boot의 기본 로그 레벨은 INFO 이며 로그 레벨 수정 시 3가지 방법이 있다.

 

1.    application.properties 에서 [ logging.level.root=debug ] 설정

2.    run configuration -> VM option -> -Ddebug

3.    run configuration -> Program arguments -> --debug

 

 

Spring Boot의 배너도 수정할 수 있다.

기본 경로는 resources 폴더 하위에 banner.txt 로 넣으면 적용이 됨

경로 수정시 application.properties 에서 [ spring.banner.location=classpath:/ ] 로 수정 가능

${spring-boot.version} 문구를 넣으면 해당 spirng boot의 버전이 출력된다.

${application.version} 문구는 패키징 후 서버를 실행해야지만 출력됨

 

아래 경로에서 이쁘게 만들 수 있음

http://patorjk.com/software/taag/#p=display&f=Graffiti&t=type%20something

 

 

일반적으로 Spring Boot main 메소드에는 SpringApplication.run(MyClass.class, args); 처럼 static으로 시작 할 수 있지만 커스텀 수정을 할 수 없다.

아래 코드 처럼 인스턴스를 생성 후 시작하고 중간에 set 를 사용하여 설정을 변경할 수 있다.

        SpringApplication application = new SpringApplication(Application.class);
        application.run(args);

 

SpringApplicationBuilder를 사용하여 간편하게 설정도 가능하다.

new SpringApplicationBuilder()
    .sources(Application.class)
    .run(args);

ApplicationListener

SpringBoot 는 기본적으로 제공해주는 이벤트가 있다.

 

ApplicationListener 인터페이스를 상속받아 제네릭으로 구분하여 이벤트의 구간을 설정한다.

Spirng BootApplicationLinstener가 상속된 객체를 찾는다.

@Component
public class SampleListener implements ApplicationListener<ApplicationStartedEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartedEvent applicationStartedEvent) {
        System.out.println("어플리케이션이 실행되고 실행");
    }
}

 

그러나 위의 코드는 실행되지 않는데 그 이유는 실행 순서 때문이다.

Spring Boot ApplicationContext가 실행 되고 난 뒤에 bean이 생성 되는데 ApplicationContext 실행 전에는 이벤트를 위 코드 처럼 사용 할 수 없다. (위 코드가 출력되는 이유는 ApplicationContext가 실행되고 난 뒤에 발생하는 이벤트)

그러므로
ApplicationStartingEvent 이벤트를 사용하기 위해서는 bean 정의를 제외하고 SpringApplication 인스턴스에서 addListener 를 사용해 정의한 이벤트의 인스턴스를 넣어줘야한다.

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

WebApplicationType

Spring Boot의 웹 어플리케이션은 Spring MVC 가 있다면 setWebApplicationType(WebApplicationType.SERVLET) 이다.

반대로 webflux로 설정되어 있다면 WebApplicationType.REACTIVE 로 동작한다.

둘다 없게 된다면 WebApplicationType.None 으로 동작

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        application.setWebApplicationType(WebApplicationType.SERVLET);
        application.run(args);
    }

 

기존의 Spring MVCJava EEServlet Spec에 기반하여 만들어졌고 Blocking + 동기방식으로 동작하지만 webflux는 반대로 Reactive Programming 방식으로 동작한다.

보다 유연하며 비동기방식으로 동작한다.

사용용도로는 다음과 같다.

·        비동기 - Non Blocking Reactive Develop에 필요할때

·        효율적으로 동작하는 고성능 웹 어플리케이션 개발 시

·        서비스간 호출이 많은 MSA(마이크로 서비스 아키텍쳐)에 적합

 


Arguments

 

main 메소드에서 받게된 매개변수를 SpirngApplication.run(args) 에서 받게되는데 이렇게 받게 된 아큐먼트는 bean으로 생성 되게 된다.

Intellij 기준으로 VM options -D<변수>, Program arguments 에는 --<변수> 로 사용 된다.

@Component
public class SampleListener{
    public SampleListener(ApplicationArguments arguments) {
        System.out.println(arguments.getOptionNames());
    }
}

 

🐕‍🦺 Bean 으로 등록된 클래스 생성자 타입이 이미 생성된 bean에 주입된다.

 


ApplicationRunner

애플리케이션이 실행한 뒤 무언가 실행을 하고 싶다면 ApplicationRunner(주로 사용)CommandLineRunner 인터페이스 중 하나를 상속 받아 사용한다. 실행 순서 조정시 @Order(0) 를 사용 숫자가 작을수록 우선순위가 높다.

    @Order(0)
    @Component
    public class SampleListener implements ApplicationRunner {
        @Override
        public void run(ApplicationArguments args) throws Exception {
            System.out.println(args.getOptionNames());
        }
    }