boot-2.2.6(spring-5.2.5) 기준으로 작성하였다.
spring boot 에서는 아래와 같이 어플리케이션을 실행한다. 웹 어플리케이션 혹은 배치 어플리케이션이던 간에 실행 방법은 비슷하다.
궁금증
- 어플리케이션 타입에 따라 ApplicationContext 의 구현체도 달라지는데 스프링부트에서는 어떤 방식으로 타입을 구별하고 구현체를 선택할지가 궁금하다.
컨텍스트 생성 부분 찾기
- 스프링부트가 어플리케이션 컨텍스트를 생성하는 부분은 main 함수의 SpringApplication.run 스태틱 함수부터 따라가 보면 쉽게 찾을 수 있다.
- run 함수에서
createApplicationContext()
함수를 통해 context 를 생성한다는 걸 알 수 있다.
타입에 따른 구현체 결정
createApplicationContext()
메서드에서는 switch 문을 통해 webApplicationType 에 따라 각각 기본값으로 선언된 클래스 로드하고 인스턴스를 만든다.
각 타입에 따른 구현체 타입은 아래와 같이 String 상수로 선언되어 있다.(패키지명 생략)
SERVLET: AnnotationConfigServletWebServerApplicationContext
REACTIVE: AnnotationConfigReactiveWebServerApplicationContext
default: AnnotationConfigApplicationContext
어플리케이션 타입 결정
그렇다면 webApplicationType 은 어떻게 결정 되는 것인가?
WebApplicationType
은 enum 으로 3가지 타입을 갖는다.(NONE
,SERVLET
,REACTIVE
)
WebApplicationType
의 static 함수인deduceFromClasspath()
를 통해 타입을 어플리케이션 타입을 결정한다."클래스 경로로 타입을 추론하다" 라는 함수명처럼 상수로 선언되어 있는 INDICATOR CLASS 의 존재 여부로 어플리케이션의 타입을 추론한다.