본문 바로가기

Spring Framework/Spring Boot

[Spring Boot] SpringApplication.run() 메서드 인자에 관해서

개요

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

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

}

위 예제는 실전 스프링부트라는 책의 웹 어플리케이션 타입을 리액티브로 지정하는 예제이다.

 

사실 필자가 잘못 실습한 부분이 있는데, 바로 run 메서드의 class 인자 부분이다.

저걸 줄 경우 Reactive로 제대로 설정되지 않는다.

 

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication springApplication = new SpringApplication(DemoApplication.class);
		springApplication.setWebApplicationType(WebApplicationType.REACTIVE);
		springApplication.run(args);
	}

}

위처럼 args만 인자로 줘야한다. 그에 대해 궁금증이 생겨 알아봤다.

 

 

본문

만약에 Spring Boot 이니셜라이저를 통해 생성할경우 아래와 같이 main 코드가 생성되어있다.

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

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

}

위의 run 코드가 실행될경우 아래의 메서드가 순차적으로 실행되는데

public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
        return run(new Class[]{primarySource}, args);
    }

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
    return (new SpringApplication(primarySources)).run(args);
}

 

결론적으로 새로운 SpringApplication이 생성된다.

 

즉, 리액티브 타입을 세팅하고 Class 인자를 줬을 때 전혀 다른 새로운 인스턴스가 생성되기에

셋팅한 값이 제대로 적용되지 않았던 것이다.

 

 

왜 이렇게 설정되어 있을까?

80-20 법칙

  • 80%의 애플리케이션은 기본 설정으로 충분
  • 20%의 특별한 요구사항이 있을 때만 커스터마이징

대부분의 경우 SpringApplication을 따로 설정하지 않기에 위의 방식을 기본으로 해둔 것으로 보인다!

 

 

배운 점

SpringApplication의 run() 메서드의 구동 방식에 대해 자세히 알 수 있었고,

스프링부트의 설계 철학을 다시 한 번 알 수 있었던 기회였다고 생각한다!