버전은 스프링 부트 3.0.8이며, Spring MVC를 사용했습니다.
@SpringBootApplication이 명시된 클래스는 위와 같습니다.
스프링 부트 애플리케이션의 핵심인 ApplicationContext를 초기화하는 과정을 분석하고자 합니다.
SpringApplication.run()에서 ApplicationContext와 관련된 로직을 수행하는 코드는 다음과 같습니다.
해당 글에서는 createApplicationContext(), setApplicationStartup()을 살펴보겠습니다.
가장 첫 번째로 수행하며, 스프링 부트 애플리케이션에서 사용할 ApplicationContext를 생성합니다.
DefaultApplicationContextFactory.create()를 호출합니다.
내부적으로 getFromSpringFactories()를 호출합니다.
이 때, SpringFactoriesLoader에서 조회하는 ApplicationContextFactory의 create()를 호출하는 BiFunction과 WebApplicationType.SERVLET을 전달합니다.
getFromSpringFactories() 내부에서 SpringFactoriesLoader에서 모든 AppplicationContextFactory를 조회합니다.
환경은 Spring MVC, WebApplicationType.SERVLET이므로 ServletWebServerApplicationContextFactory가 동작합니다.
BiFunction으로 인해 ServletWebServerApplicationContextFactory.create()가 호출되며, WebApplicationType는 SERVLET이므로 내부 메서드인 createContext()가 호출됩니다.
AotDetector의 경우 AOT 옵티마이저를 사용하는지 여부를 체크합니다.
AOT 옵티마이저의 경우 성능을 위해 리플렉션을 거의 사용하지 않습니다.
애노테이션 기반은 주로 리플렉션을 사용해 메타데이터를 조회해 ComponentScan을 수행하기 때문에, AOT 옵티마이저는 애노테이션 기반이 아니라 XML 구성에 동작합니다.
현재 실행 환경은 애노테이션 기반의 MVC를 사용하고 있으므로 AOT 옵티마이저를 사용하고 있지 않습니다.
그러므로 AnnotationConfigServletWebServerApplicationContext를 생성해 반환합니다.
createApplicationContext()는 AnnotationConfigServletWebServerApplicationContext를 생성해 반환합니다.
생성한 ApplicationContext에 ApplicationStartup을 세팅합니다.
ApplicationStartup은 스프링 부트 애플리케이션이 필요한 설정(환경 설정, 빈 등록 등)을 수행할 때 실행 단계를 추적할 수 있는 기능을 제공합니다.
SpringApplication.setApplicationStartup()을 통해 지정하면 적용될 수 있으며, 현재는 아무 값도 적용하지 않았기 때문에 이후 ApplicationStartup을 가져올 때 DEFAULT로 가져오게 됩니다.
개발자가 SpringApplication.setApplicationStartup()를 별도로 설정한 경우, 해당 ApplicationStartup을 초기화합니다.
별도로 설정하지 않은 경우 DefaultApplicationStartup로 초기화합니다.