티스토리 뷰

Spring

스프링 부트 활용(1) - application class

도라지보다더덕 2020. 5. 21. 01:48

스프링 부트 핵심 기능

다음 스프링 부트의 여러 핵심 기술 중 application을 시작하는 SpringApplication class에 대해 살펴보겠습니다.

 

SpringApplication class는 패키지 최상단에서 aplication을 실행하는 메인이 존재하는 클래스입니다.

 

 

디렉토리 구조

이 SpringApplication 클래스에서는 스프링 부트 실행에 있어 다양한 기능을 가지고 있습니다.

 

log level 변경, 배너 변경, 애플리케이션 이벤트, 웹 어플리케이션 타입 변경 ... 등

 

하나씩 살펴보도록 하겠습니다.

 

우선 아마 처음 스프링 부트를 하시는 거면 다음과 같은 메인 메소드와 스프링 부트를 실행하는 메소드가 있는 클래스를 만들고 사용하게 될 텐데요.

 

        
   public static void main(String[] args) {
        SpringBootApplication.run(Application.class,args);
    }

 

이렇게 할 경우 실행은 간단하지만 여러 커스터마이징은 어렵다는 단점이 있습니다. 따라서 저는 아래와 같이 인스턴스를 만들어 사용하려고 합니다!

 

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

 

잘 실행되나 한번 확인해볼까요?

 

실행화면

아주 잘 실행되는군요!

 

log level

실행화면을 보면 Info level의 로그들만 찍혀있는 것을 볼 수 있습니다.

 

info level의 로그들만 보고서는 자동 설정들이 잘 적용됐는 지 아니면 왜 적용이 안됐는지 확인 할 수가 없어 개발할 시 불편함이 있을 수 있습니다.

 

그렇다면 이 log level을 debug level로 바꾸려면 어떻게 해야할까요?

 

intellij 기준 우측 상단에 Edit configurations를 클릭해 VM options에 -Ddebug를 줘서 로그 레벨을 바꿀 수 있습니다.

 

 

 

log level을 변경하고 다시 실행하면 다음과 같이 debug level까지 로그가 찍히는 것을 볼 수 있습니다.

 

 

 

Event 

스프링 부트가 애플리케이션을 실행할 시 이벤트의 발생 시점은 매우 다양합니다. (애플리케이션이 실행될 때, 실행되고 나서 .. 등)

 

원하는 시점에 이벤트를 발생 시키기 위해서는 ApplicationListener 인터페이스를 implements하여 구현하고 뒤에 타입으로 실행 시점을 넣어줍니다. 그리고 Bean으로 만들어 등록해주면 될 것 같지만 위 상황은 application context가 만들어진 다음에 가능한 상황입니다.

 

왜냐하면 application context가 만들어진 뒤 Bean들을 실행해주기 때문입니다. 그렇다면 context가 만들어지기 전 이벤트들은 어떻게 실행할까요?

 

다음과 같이 직접 등록해서 사용합니다.

 

application class

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

 

아래는 ApplicationStartingEvent 시점에 실행되는 이벤트입니다. ApplicationStartingEvent 시점은 애플리케이션이 시작되는 시점으로 context가 만들어지기 전입니다. 따라서 위 main 메소드에 직접 이벤트를 등록하여 사용합니다.

 

EventListener class

public class EventListener implements ApplicationListener<ApplicationStartingEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartingEvent applicationStartingEvent) {
        System.out.println("--------------------------");
        System.out.println("starting");
        System.out.println("--------------------------");

    }
}

 

다른 예시로 아래는 application context가 만들어진 다음 이벤트 실행하는 클래스입니다. 해당 클래스를 spring boot가 Bean으로 등록할 수 있도록 @Component 어노테이션을 달아줍니다.

 

@Component
public class StartListener implements ApplicationListener<ApplicationStartedEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartedEvent applicationStartedEvent) {
        System.out.println("__________________________________");
        System.out.println("started");
        System.out.println("__________________________________");
    }
}

 

별 다른 등록없이 @Component 어노테이션을 달아주기만 하면 스프링 부트가 알아서 빈으로 만들고 해당 이벤트를 

ApplicationStartedEvent 시점에 실행시켜줍니다.

 

 

실행 첫 줄

 

실행 마지막 줄

 

이벤트를 등록할 시에는 context가 만들어졌는지 아닌지를 잘 생각한 뒤 이벤트를 등록하면 됩니다.

 

 

 

WebApplicationType

스프링 부트는 WebApplicationType을 변경할 수 있습니다. 보통의 경우의 servlet으로 실행되지만 경우에 따라 

reactive, none 등 으로 설정하여 사용할 수도 있습니다.

 

 

메인 메서드에 app.setWebApplicationType(...) 한 줄만 넣으면 손쉽게 변경가능합니다.

 

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

 

 

 

 

 

 

reference


inflearn - 백기선 스프링 부트 개념과 활용

'Spring' 카테고리의 다른 글

스프링 부트 활용(2) - 외부 설정  (0) 2020.06.01
1. 스프링 부트 특징  (0) 2020.05.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함