본문 바로가기

더 나은 엔지니어가 되기 위해/지금은 안쓰는 자바

[스프링 부트 개념과 활용] SpringApplication

이 글은 인프런에서 백기선님의 스프링부트 개념과 활용 강의를 듣고, 개인적으로 공부하며 핵심만 정리한 글입니다.

SpringApplication 실행

어플리케이션 실행 방법은 다음과 같은 방법이 있다.

먼저 가장 간단한 방법

@SpringBootApplication
public class SpringinitApplication {

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

조금 더 커스터마이징 할 수 있는 방법

@SpringBootApplication
public class SpringinitApplication {

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

배너 변경 하는 법

Spring 어플케이션 실행 시, 처음에 콘솔에 뜨는 배너를 변경 하는 법은 다음과 같이 있다.
공식 도큐먼트 참고.

  • resources/banner.text 를 만들어 배너로 쓸 텍스트 입력
    • 텍스트에 ${application.version} 을 넣어주면 버전 명시도 가능.
  • SpringApplication app 객체에 app.setBannerMode(Banner.Mode.OFF) 를 주면 배너를 끌 수 있음.
  • 이 외에도 SpringApplicationBuilder() 로 빌더 패턴으로 배너와 어플리케이션 실행 설정을 커스터마이징 할 수 있다.

SpringApplication 실행 전후 리스너

SpringApplication app 의 실행 전후로 다음과 같이 리스너를 달아둘 수 있다.
먼저 ApplicationListener<T> 를 인터페이스 구현하는 클래스를 다음과 같이 정의한다.

class SampleListener1 implements ApplicationListener<ApplicationStartingEvent> {
  @Override
  public void onApplicationEvent(ApplicationStartingEvent applicationStartingEvent) {
    System.out.println("=====================");
    System.out.println("Applcation is starting");
    System.out.println("=====================");
  }
}

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

이렇게 만든 클래스들을 Bean 으로 등록하기 위해 @Component 를 클래스 위에 붙여줘야 하는데, ApplicationStartingEvent 의 경우, Bean 등록을하는 ApplicationContext 객체가 생성 되기 전에 만들어져 버린다.
따라서, ApplicationStartingEvent 는 따로 SpringApplication.addListner(..) 로 추가해줘야 한다.

@SpringBootApplication
public class SpringinitApplication {

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

WebApplicationType 설정하기

WebApplicationType 은 다음과 같은 종류가 있다.

  • WebApplicationType.SERVLET
  • WebApplicationType.REACITVE
  • WebApplicationType.NONE

이 중 기본설정은 WebApplicationType.SERVLET 이다.

Application argument 받기

argument 는 크게 다음으로 나뉜다.

  • Jvm argument : -D 로 시작. jvm 설정에 관련된 argument
    • ex. java -jar -Dfoo heumsi-springboot.jar
  • Application argument : -- 로 시작. 어플리케이션 설정에 관련된 argument
    • ex. java -jar --bar ... heumsi-sprinboot.jar

여기서 Application arguments 는 다음과 같이 ApplicationArguments 객체를 주입받아 사용할 수 있음.

@Component
@Order(1) // 숫자 낮은게 먼저 실행
public class SampleListener implements ApplicationRunner {

  @Override
  public void run(ApplicationArguments arguments) throws Exception{
    System.out.println("foo:" + arguments.containsOption("foo"));
    System.out.println("bar:" + arguments.containsOption("bar"));
  }
}
  • ApplicationRunner 로 클래스를 구현하면, 해당 클래스는 어플리케이션 실행 후 run 메쏘드가 자동으로 실행 됨.
  • 여러 개 있을 경우 @Order(우선순위) 의 순서에 따라 작동. 우선순위가 낮을수록 먼저 싦행된다.

위 어플리케이션을 java -jar -Dfoo --bar heumsi-springboot.jar 로 실행하면 다음과 같은 결과를 내놓는다.

foo: false
bar: true

-DfooApplicationArguments arguments 에 들어오지 않은 것을 알 수 있음.