나만보는페이지

[Spring boot] ApplicationContext 와 WebApplicationType 본문

spring

[Spring boot] ApplicationContext 와 WebApplicationType

pplenty 2019. 9. 1. 18:49

boot-2.2.6(spring-5.2.5) 기준으로 작성하였다.
spring boot 에서는 아래와 같이 어플리케이션을 실행한다. 웹 어플리케이션 혹은 배치 어플리케이션이던 간에 실행 방법은 비슷하다.
메인함수

궁금증

  • 어플리케이션 타입에 따라 ApplicationContext 의 구현체도 달라지는데 스프링부트에서는 어떤 방식으로 타입을 구별하고 구현체를 선택할지가 궁금하다.

컨텍스트 생성 부분 찾기

  • 스프링부트가 어플리케이션 컨텍스트를 생성하는 부분은 main 함수의 SpringApplication.run 스태틱 함수부터 따라가 보면 쉽게 찾을 수 있다.
  • run 함수에서 createApplicationContext() 함수를 통해 context 를 생성한다는 걸 알 수 있다.
    컨텍스트 생성

타입에 따른 구현체 결정

  • createApplicationContext() 메서드에서는 switch 문을 통해 webApplicationType 에 따라 각각 기본값으로 선언된 클래스 로드하고 인스턴스를 만든다.
    타입에 따른 switch 문

  • 각 타입에 따른 구현체 타입은 아래와 같이 String 상수로 선언되어 있다.(패키지명 생략)

SERVLET: AnnotationConfigServletWebServerApplicationContext

REACTIVE: AnnotationConfigReactiveWebServerApplicationContext

default: AnnotationConfigApplicationContext

어플리케이션 타입 결정

  • 그렇다면 webApplicationType 은 어떻게 결정 되는 것인가?

  • WebApplicationType 은 enum 으로 3가지 타입을 갖는다.(NONE, SERVLET, REACTIVE)
    3가지 타입

  • WebApplicationType의 static 함수인 deduceFromClasspath() 를 통해 타입을 어플리케이션 타입을 결정한다.

  • "클래스 경로로 타입을 추론하다" 라는 함수명처럼 상수로 선언되어 있는 INDICATOR CLASS 의 존재 여부로 어플리케이션의 타입을 추론한다.
    타입추론함수

Comments