[Spring boot]#1 SpringApplication

2020년 01월 21일 by Xion

    [Spring boot]#1 SpringApplication 목차

SpringApplication.run(SpringName.class,args);

->이렇게하면 스프링 애플리케이션에 제공하는 다양한 커스터마이징 기능을 사용하기 어렵다

 

따라서

인스턴스를 만들고  run하는 방법을 사용하면 위 코드와 결과는 같지만 커스터마이징 기능을 사용할 수 있다.

SpringApplication app = new SpringApplication(SpringintitApplication.class);

app.run(args);

->기본적으로 info level이 low레벨이다

 

| 이벤트 리스너( Event Listener )

 

스프링 부트를 실행할 시 구동되는 단계마다 여러 이벤트들이 발생하게 됩니다.

스프링부트에서는 프로그래머가 이 이벤트들을 나타내는 객체를 인자로 받아 각 단계마다 원하는 처리를 할 수 있습니다.

 

스프링 부트가 구동될 때 여러 이벤트들이 있지만 그 중에서 ApplicationStartingEvent  ApplicationStartedEvent를 예로들어 알아보겠습니다.

 

ApplicationStartingEvent는 다음 코드를 통해 처리할 수 있습니다.

@Component
public class AppStartedSampleListener implements ApplicationListener<ApplicationStartingEvent> {

	@Override
	public void onApplicationEvent(ApplicationStartingEvent event) {
	System.out.println("=====================");
	System.out.println("Application starting");
	System.out.println("=====================");
	}
}


주의 할 것은 ApplicationStartingEvent스프링 컨테이너가 만들어지기 전에 생성되는 이벤트입니다.

이 이벤트를 처리하려면 다음과 같이 SpringApplication 객체에 해당 리스너를 추가해야합니다.

@SpringBootApplication
public class Application {

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

->addListeners로 생성해줘야합니다  !!!

 

ApplicationStartedEvent를 포함한 스프링 컨테이너가 만들어진 이후에 생성되는 이벤트들은 아래와 같이 스프링 빈 등록을 통해 이벤트를 처리할 수 있습니다.

@Component
public class AppStartedSampleListener implements ApplicationListener<ApplicationStartedEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        System.out.println("=====================");
        System.out.println("Application started");
        System.out.println("=====================");
    }
}

=======================
Application is starting
=======================

.   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/  ___)| |_)| | | | | || (_| |  ) ) ) )
'  |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::        (v2.1.1.RELEASE)
(...)
=====================
Application started
=====================

| 스프링 부트 웹 어플리케이션 타입 지정

 

스프링 부트는 SpringApplication 객체를 통해 어플리케이션 타입을 지정할 수 있습니다. SpringApplication 객체는 스프링 컨테이너의 인터페이스인 ApplicationContext의 구현체를 프로그래머 대신 만들어줍니다. 프로그래머는 ApplicationContext의 구현체를 다음과 같은 방법으로 지정할 수 있습니다.

 

만약 Spring MVC Spring WebFlux가 둘 다 설정되있으면 Spring MVC가 우선 적용됩니다.

 

@SpringBootApplication
public class Application {
	// 1. Servlet으로 설정 되있으면 AnnotationConfigServletWebServerApplicationContext (Spring MVC)
	// 2. Servlet이 없으면 WebFlux로 되있으면 AnnotationConfigReactiveWebServerApplicationContext (Spring WebFlux)
	// 3. 전부 없을 시 AnnotationConfigApplicationContext로 설정
	public static void main(String[] args) {
	SpringApplication application = new SpringApplication(Application.class);
	application.addListeners(new SampleListener());
	application.setWebApplicationType(WebApplicationType.SERVLET); // 웹 어플리케이션 타입 지정
	application.run(args);
	}
}

| 스프링 부트 커맨드 인수 처리

 

스프링 부트는 스프링 부트 어플리케이션이 실행될 때 준 커맨드 인수 옵션을 수월하게 처리할 수 있습니다. 여기서 주목해야 할 것은 VM 옵션은 처리하지 않고 오직 커맨드 인수 옵션만 처리한다는 것입니다.

아래와 같이 옵션을 주게될 경우 스프링 부트는 아래 코드를 실행할 때  -Dfoo VM 옵션은 무시한 채 --bar을 처리하게 됩니다. 

 

java -jar target\springboot-tutorial-1.0-SNAPSHOT.jar -Dfoo --bar
@Component
public class AppRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("foo: " + args.containsOption("foo"));  // VM 옵션은 arguments가 아님
        System.out.println("bar: " + args.containsOption("bar"));
    }
}

//결과
foo : false
bar : true