본문 바로가기
학습/Spring

[spring] 스프링부트의 SpringApplication 객체 활용하기

by KKambi 2020. 4. 10.

기존 방식

  • SpringApplicaiton.run(Applicaiton.class, args);
  • 스프링 커스터이징이 어려움

 

인스턴스를 만들어서 이용하는 방식

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

 

배너 설정하기

  • 배너 끄기
  • 배너 클래스 구현 후 설정하기
SpringApplication app = new SpringApplicaiton(Application.class);
app.setBannerMode(Banner.Mode.OFF);		//배너 끄기
app.setBanner(CustomerBaner);			//직접 구현한 배너 클래스의 인스턴스를 배너로 설정

 

빌더 패턴 이용하여 인스턴스 생성하고 실행하기

new SpringApplicationBuilder()
	.sources(Application.class)
    	.banner(new Banner(){...})		//java anonymous class
    	.run(args);

 

스프링과 스프링부트는 이벤트를 제공

  • 다양한 시점의 이벤트 존재
  • 어플리케이션이 구동될 때
  • 컨텍스트가 생성될 때
  • 리프레쉬될 때
  • 어플리케이션 구동이 성공했을 때
  • 어플리케이션 구동이 실패했을 때 등등....

 

이벤트 리스너를 생성해서 등록하자

  1. ApplicationListener<특정이벤트> 를 구현한 리스너 클래스 생성
  2. @Component로 해당 클래스가 빈으로 등록된 후, 특정이벤트에 대해 리스닝
  3. 이벤트 발생 시, 리스너 클래스에서 오버라이딩한 onApplicationEvent()가 호출

 

빈으로 등록될 수 없는 이벤트 리스너

  • 이벤트 리스너가 빈으로 등록되는 시점 = ApplicationContext가 생성된 후, 컴포넌트 스캔할 때
  • ApplicationContext가 만들어지기 이전에도 이벤트가 발생
    1. 해당 이벤트는 빈으로 등록되는 이벤트 리스너가 핸들링할 수 없음
    2. 따라서 컨텍스트 이전의 이벤트에 대한 리스너는, 빈으로 등록해도 작동하지 않음
  • 해결 = SpringApplication 클래스의 addListeners() 사용하여 메인 메소드 내에서 직접 등록

 

웹 어플리케이션 타입 설정하기

  • SpringApplication 클래스의 setWebApplication() 사용
    1. WebApplicationType.SERVLET (default type)
    2. WebApplicationType.REACTIVE
    3. WebApplicationType.NONE
  • SERVLET 타입이 자동설정되는 조건
    1. 서블릿 컨테이너 의존성이 있으면 무조건!
    2. Spring Web Flux 의존성이 있어도, 서블릿이 있으면 무조건!
  • REACTIVE 타입이 자동설정되는 조건
    1. 서블릿 컨테이너 의존성을 참조하지 않고
    2. Spring Web Flux 의존성을 참조하고 있을 때

 

Application Arguments 사용하기

  • 설정 방법
    • Intellij run configuration을 통해 Program Arguments 설정가능
      (JVM option은 ApplicationArguments 아님)
    • java -jar JAR파일 --key=value 로 설정 가능
  • ApplicationArguments를 파라미터로 받아 생성되는 컴포넌트 클래스 구현
    • 빈 등록 (@Component)
    • ApplicationArguments의 containsOption() 으로 확인가능

 

cf) 복습: 어떤 빈의 생성자가 1개이고, 생성자의 파라미터가 빈일 때, 파라미터 빈은 자동 주입됨

 

 

어플리케이션 실행 뒤 작동하는 hook을 걸고 싶을 때

방법1. ApplicationRunner를 구현하는 컴포넌트 클래스 생성 (추천)

  • ApplicationArguments를 이용하기 위해 low level까지 코딩할 필요 없음
  • 추상화된 API를 사용하여 구현가능
  • @Order(순서값)으로 runner의 순서를 조정
  • 낮은 순서가 높은 우선순위를 가짐

방법2. CommandLineRunner를 구현하는 컴포넌트 클래스 생성

 

 

로그 레벨 변경하기 (SpringApplicaiton 이용X)

  • 기본 로그 레벨 = INFO
  • DEBUG LEVEL = 어떤 AutoConfiguration이 적용되고, 적용되지 않는지 확인 가능
  • IDE에서 디버그 모드 설정하기
    1. Run Configuration Edit 들어가기
    2. VM Options을 -Ddebug 설정
    3. 또는 Program arguments를 --debug로 설정
  • java명령어를 통해 jar 실행 시, 옵션을 통해 디버그 모드 설정하기
    • java -jar JAR파일 -Ddebug
    • java -jar JAR파일 --debug

 

FailureAnalyzer로 에러 메세지 예쁘게 출력하기 (SpringApplicaiton 이용X)

  • FailureAnalyer 인터페이스를 구현하고 analyze()를 오버라이딩하는 CustomeFailedAnalyer 클래스 구현
  • resources/META-INF/ 안의 spring.factories에 org.springframework.boot.diagnostics.FailureAnalyzer listener를 등록한다.
org.springframework.boot.diagnostics.FailureAnalyzer=com.kkambi.CustomFailedAnalyzer

 

banner.txt로 배너 로고 예쁘게 출력하기 (SpringApplicaiton 이용X)

  • resources/banner.txt 수정
  • txt파일 안에서 ${spring-boot.version} 와 같은 변수 사용 가능
  • 일부 변수는 매니페스트 파일이 존재해야 사용 가능
  • txt파일뿐만 아니라, banner.gif | banner.jpg | banner.png와 같은 이미지 파일도 사용가능
    spring.banner.image.location property를 설정하면 된다
  • 기본 인코딩 = UTF-8

 

 

댓글