개요
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() 메서드의 구동 방식에 대해 자세히 알 수 있었고,
스프링부트의 설계 철학을 다시 한 번 알 수 있었던 기회였다고 생각한다!
'Spring Framework > Spring Boot' 카테고리의 다른 글
| [Spring Boot] 환경별 설정 어떻게 해야할까? (2) | 2025.07.28 |
|---|---|
| [Spring Boot] 스프링 부트 이벤트 리스너 구현과 등록 (2) | 2025.07.17 |
| [Spring Boot] 리액티브 프로그래밍이란? (0) | 2025.07.17 |
| [Spring Boot] 스프링 부트 애플리케이션 종료 (1) | 2025.07.02 |
| [Spring Boot] SpringApplication.run()을 호출하면 일어나는 일들 (0) | 2025.07.02 |