[Spring Boot] SpringApplication이 제공하는 기능들

Junseo Kim·2020년 2월 4일
2

스프링부트 프로젝트 실행하는 법

  1. static 메서드를 쓰는 방법
    커스터마이징을 할 수 없다.

스크린샷 2020-02-05 오전 3.16.57.png

  1. SpringApplication
    위의 코드와 같지만, 분해하여 커스터마이징 가능하게 해준다.

스크린샷 2020-02-05 오전 3.19.02.png

  1. springApplicationBuilder
    커스터 마이징 가능하다.

스크린샷 2020-02-05 오전 3.20.09.png

Application Event

spring과 spring boot에서 기본적으로 제공해주는 이벤트들이 있다.

이 이벤트들에는 애플리케이션이 시작될 때, 에플리케이션 컨텍스트를 만들었을 때 등과 같은 다양한 시점이 있다.

Event 리스너를 만들때는 ApplicationListener<타입>를 implements 해서 만든다.

이때 타입을 ApplicationStartingEvent로 주면 이 이벤트가 발생하면(애플리케이션이 시작될 때) 해당 리스너가 실행된다.

스크린샷 2020-02-05 오전 3.33.54.png

이때 리스너가 Bean이면, 등록되어있는 Bean 중에 해당하는 이벤트에 대한 리스너는 알아서 실행을 해준다.

이때 주의할 것이 있다. 이 이벤트가 언제 발생하는 것인지가 중요한 기점이 된다.

application context가 만들어졌느냐 안 만들어졌느냐를 기준으로 application context가 만들어진 다음에 발생하는 이벤트들은 그 이벤트들의 리스너가 Bean이면 알아서 호출해줄 수 있는데, application context가 만들어지기 이전에 발생한 이벤트(ex. ApplicationStartingEvent같은 이벤트)는 Bean으로 등록한다 하더라도 리스너가 동작하지 않는다.

그래서, 이런경우는 직접 등록해줘야한다.

이 때, SpringApplication의 addListeners를 사용해서 에플리케이션에 리스너를 등록한다.

스크린샷 2020-02-05 오전 3.45.58.png

스크린샷 2020-02-05 오전 3.47.28.png

만약, 리스너의 타입이 ApplicationStartedEvent인 경우는 application context가 만들어진 이후이기 때문에 Bean으로만 등록해주면 리스너가 동작한다.

스크린샷 2020-02-05 오전 3.51.13.png

스크린샷 2020-02-05 오전 3.51.34.png

Application의 타입 지정

Application의 타입은 3가지가 있다.

NONE 타입 / REACTIVE 타입 / SERVLET 타입

만약, Spring MVC가 들어있으면, 기본적으로 SERVLET 타입으로 돈다.
만약, Spring WebFlux가 들어있으면, 기본적으로 REACTIVE 타입으로 돈다.(servlet이 있는 경우는 SERVLET 타입으로 돈다.)
만약, 둘 다 없는 경우는 NONE 타입으로 돈다.

Application Argument

Edit Configuration으로 들어간다.

-D로 시작하는 옵션은 JVM옵션이고,
--로 시작하는 옵션이 Application Argument이다.

스크린샷 2020-02-05 오전 4.02.59.png

JVM옵션에 -Dfoo Application argument에 --bar를 설정해준다.

스크린샷 2020-02-05 오전 4.03.35.png

그리고 Argument를 출력해 볼 컴포넌트를 만들어준다.

spring은 만약 어떤 Bean에 생성자가 하나고 그 생성자의 파라미터가 Bean일 경우에는 그 Bean을 spring이 알아서 주입해준다.

그래서, 그냥 에플리케이션을 실행해주면 Bean이 생성되므로, 생성자에 아까 설정한 foo와 bar를 찍어볼 수 있다.

스크린샷 2020-02-05 오전 4.15.00.png

bar만 들어있음을 볼 수 있다.

스크린샷 2020-02-05 오전 4.16.42.png

즉, --로 들어오는 옵션만 argument로 사용하는 것이다.(JVM옵션은 Application argument가 아니다.)

ApplicationRunner

Application을 실행하고 난 후, 뭔가를 실행하고 싶을 때 사용한다.

클래스를 만들어주고 ApplicationRunner를 implements 한다.

스크린샷 2020-02-05 오전 4.26.11.png

ApplicationRunner는 ApplicationArguments라는 타입으로 메서드를 만들어준다.

따라서 아까 사용한 containsOption같은 유용한 메서드들을 바로 사용해볼 수 있다.

스크린샷 2020-02-05 오전 4.30.25.png

스크린샷 2020-02-05 오전 4.30.32.png

만약 ApplicationRunner가 여러개인 경우, @Order 어노테이션을 붙여 순서를 지정해줄 수 있다.(숫자가 낮을수록 높은 우선순위)

스크린샷 2020-02-05 오전 4.32.23.png

0개의 댓글