[SpringBoot] SpringApplication 에 대하여

2020. 5. 3. 22:03개발/Spring

📌 [SpringBoot] SpringApplication

SpringApplication document

📕 Debug log 출력하기

기본적으로 INFO레벨까지만 로그를 찍어주는데 Debug 모드로 설정하면 Debug 레벨까지 로그를 찍어준다. 어떤게 자동설정이 되고 왜 안되는지 까지 나온다.

  1. image
  2. image

이와같이 VM option에 -Ddebug라고 옵션을 입력하면 디버그 모드로 전환된다.


📕 FailureAnalyer 란?

Error 메세지를 좀 더 이쁘게 띄워줌. 위의 document에 가보면 설정법이 나와잇음. 각종 변수들로 application 정보들을 출력할 수도 있고 , 자신만의 배너를 만들어서 이쁘게 만들어 줄 수 있다.

배너는 resource폴더 안에 banner.txt 파일을 추가하면 내가 만든 로고를 띄워줄수 있다. (application.properties에서 banner 속성 및 경로를 변경할 수 있다. spring.banner에 있음)

image

이런식으로 Spring 로고 대신 내가 만든 로고가 출력된다.

가끔 MANIFEST.MF파일이 필요한 변수들이 있다. 해당 파일이 없으면 나오지 않는 경우가 있다. MANIFEST.MFmvn package 를 해서 .jar파일로 만들어 줄때 생성된다.

원래 Spring Boot를 사용해서 application을 띄울때 SpringApplication.run() 메서드를 많이 사용하는데 이렇게 하면 커스터마이징을 할 수 없기 때문에 SpringApplication객체를 생성한 후에 run을 해주는 방법으로 application을 띄울 수 있다.

    public static void main(String[] args) {
        //SpringApplication.run(DemoApplication.class, args);
        SpringApplication application = new SpringApplication(DemoApplication.class);
        application.run();
    }

이런식으로 실행이 가능하다.

예를들어 내가 배너를 띄우지 않고 싶다 라고 하면

    public static void main(String[] args) {
        //SpringApplication.run(DemoApplication.class, args);
        SpringApplication application = new SpringApplication(DemoApplication.class);
        application.setBanner(new Banner() {
            @Override
            public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
                out.println("===============");
                out.println("DDINGG on Spring Boot");
                out.println("===============");
            }
        });
        application.setBannerMode(Banner.Mode.OFF);
        application.run();
    } 

이런식으로 코드로 베너를 띄울 수도 있고 ON/OFF 할 수도 있다.

그렇다면 text 파일과 코딩을 동시에 설정했을때는 어떤게 우선순위로 출력이 될까?

🥕text파일이 먼저 출력된다!!

📕 Application EventListener 설정하기

// Application이 시작될 때 실행되는 리스너
@Component 
public class SampleListener implements ApplicationListener<ApplicationStartedEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartedEvent applicationStartedEvent) {
        System.out.println("==============================");
        System.out.println("Application Start from DDINGG");
        System.out.println("==============================");
    }
}
🥕 Bean 형식으로 만드는 EventLister들을 사용할때 주의할점!

이벤트가 언제 발생하는지가 중요한 기점인데, ApplicationContext가 만들어진 후에 실행되는 이벤트 들이 Bean으로 등록되어 있을때는 정상적으로 호출이 되지만, ApplicationContext가 만들어지기 전에 실행되는 이벤트 들은 Bean을 불러올 수 없다. ApplicationStartEvent이벤트가 그렇다! 따라서 위 코드에서 @Component는 의미가 없다!

🙏 잠깐! ApplicationContext 가 뭘까?

ApplicationContext는 IoC 컨테이너의 일종으로 BeanFactory(요친구도 IoC 컨테이너의 일종)는 lazy-loading(사용자가 필요할때 Bean을 생성) 인 반면 ApplicationContext는 pre-loading 으로 시작할때 Bean을 만들고 시작한다. 따라서 ApplicationContext 에 등록된 Bean은 바로 사용 할 수 있다.

Bean에 등록이 되지 않은 경우에는 Listener를 직접 등록을 해주어야 한다.

    // Listener 등록 예제 
    public static void main(String[] args) {
        //SpringApplication.run(DemoApplication.class, args);
        SpringApplication application = new SpringApplication(DemoApplication.class);
        application.addListeners(new SampleListener());
        application.run();
    }
🙄 그럼 Application이 실행된 이후의 EventListener들은 Bean에만 등록하면 정상적으로 동작할까?

🥕 정상적으로 동작한다. 위 코드 처럼 따로 Listener를 등록해줄 필요는 없다.


📕 WebApplicationType 수동으로 정해주기

    public static void main(String[] args) {
        //SpringApplication.run(DemoApplication.class, args);
        SpringApplication application = new SpringApplication(DemoApplication.class);
        application.setWebApplicationType(WebApplicationType.NONE);
        application.run();
    }

WebApplication이 없이 application이 올라감.

NONE 이외에 다른 옵션들도 있다. 자세한건 여기 spring Document 참고