Don't give up!

[Spring Boot] SpringApplication의 실행과정 본문

Spring Boot

[Spring Boot] SpringApplication의 실행과정

Heang Lee 2021. 8. 2. 22:22

Spring 프로젝트의 main함수는 @SpringApplication이라는 애너테이션과 SpringApplication클래스의 run 함수를 실행하고 있습니다.

SpringApplication 클래스의 run함수는 ConfigurableApplicationContext를 반환으로 하고 있고 SpringApplication을 생성, 해당 인스턴스의 run함수를 실행합니다.

SpringApplication의 생성자는 위의 함수를 resourceLoader를 null, primarySources를 첫번째 인수로 지정한 클래스(여기서는 WebCommunityBatchApplication)을 호출하였는데, ApplicationContextInitializer를 Initializer로, ApplicationListener를 Listener로 설정하고 있었습니다.

SpringApplication의 run함수. ConfigurableApplicationContext 인스턴스 context를 createApplicationContext 메소드로부터 할당받고, setApplicationStartup을 호출, 결과적으로 context를 리턴합니다.

createApplicationContext 메소드는 applicationContextFactory의 create메소드를 호출합니다.

ApplicationContextFactory는 함수형 인터페이스입니다.

webApplicationType 값에 따라 ConfigurableApplicationContext를 상속받는 AnnotationConfigApplicationContext 인스턴스가 생성되어 반환하며 해당 프로젝트는 SERVLET도, REACTIVE도 아니므로 AnnotationConfigApplicationContext를 생성한다는 것을 알 수 있습니다.

AnnotationConfigApplicationConext는 GenericApplicationConext를 상속받고 BeanDefinitionReader, BeanDefinitionScanner를 갖고 있습니다.

결과적으로 SpringApplication 클래스의 context는 AnnotationConfigApplicationContext 인스턴스를 받습니다.

prepareContext에서는 context로부터 beanFactory를 받아 registerSingleton을 호출하여 springApplicationArguments라는 이름의 Bean을 싱글톤으로 등록하고, load함수를 호출합니다.

createBeanDefinitionLoader를 호출하여 loader를 할당하고, load를 호출합니다.

createBeanDefinitionLoader는 BeanDefinitionLoader를 생성합니다.

BeanDefinitionLoader에서 xmlReader, groovyReader, 그리고 scanner를 초기화하고 있습니다.

loader의 load 메소드는 instanceof에 따라 맞는 인수로 load함수를 호출하고 있습니다.

Resource 타입의 인수를 받는 load 메소드는 xmlReader, groovyReader의 loadBeanDefinitions를, Package 타입의 인수를 받는 load 메소드는 scanner의 scan 메소드를 호출하여 정의된 Bean들을 읽어들입니다.

scan 메소드는 doScan을 호출하여 bean을 등록하고, includeAnnotationConfig값이 참이라면 registerAnnotationConfigProcessors 메소드를 호출하고 있습니다.

 

결과적으로 SpringApplication의 run 메소드로부터 XML파일에서 정의, Annotation Scan을 통한 정의 등 빈을 정의하는 행위가 이루어지고 있음을 알 수 있었습니다.