서론
스프링 MVC를 공부하던 중 스프링 부트에서는 이 스프링 MVC에 대한 설정들을 어떻게 하는지 궁금했다.
열심히 의존 파일을 뒤지던 중 WebMvcAutoConfiguration을 찾았고 이 클래스를 통해서 스프링 부트가 자동 설정을 한다는 것을 알게 되었다.
그런데 과연 이 클래스의 설정은 어떻게 실행되는 것일까?
본론
일단 스프링의 AutoConfiguration은 다음의 어노테이션에서 시작한다.
@SpringBootApplication
public class ChanguiiApplication {
public static void main(String[] args) {
SpringApplication.run(ChanguiiApplication.class, args);
}
}
@SpringBootApplication
에서 모든 스프링의 설정들이 시작되고 다음의 세 가지 어노테이션을 포함한다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
@SpringBootConfiguration
, @EnableAutoConfiguration
, @ComponentScan
을 포함한다.
이 중에서 @EnableAutoConfiguration
은 스프링 부트의 자동 설정을 담당한다.
다음과 같다.
Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
여기서 AutoConfigurationImportSelector.class
는 ImportSelector
인터페이스를 구현하고 있다.
이 인터페이스는 selectImports
메소드를 제공하며 어떤 클래스를 Import할지를 정의하고 있다.
AutoConfigurationImportSelector
는 이 메소드를 사용하여 자동 구성 클래스들을 선택하여 설정한다.
과정은 다음과 같다.
AutoConfigurationImportSelector
는selectImports
메서드를 호출합니다.selectImports
메서드 내에서는getCandidateConfigurations
메서드를 호출하여 후보로 사용될 모든 자동 구성 클래스들을 찾습니다.getCandidateConfigurations
메서드는SpringFactoriesLoader.loadFactoryNames
를 사용하여META-INF/spring.factories
파일에서EnableAutoConfiguration
키에 해당하는 클래스들을 찾습니다.WebMvcAutoConfiguration
이META-INF/spring.factories
에 등록되어 있으므로, 이 클래스가 후보에 포함되게 됩니다.WebMvcAutoConfiguration
클래스는@ConditionalOnClass(WebMvcConfigurer.class)
어노테이션을 가지고 있어, 클래스패스에WebMvcConfigurer
가 존재할 때만 해당 자동 구성이 활성화됩니다.- 따라서,
WebMvcAutoConfiguration
은WebMvcConfigurer
가 클래스패스에 존재할 때만 자동으로 실행되어 Spring MVC의 기본 구성을 제공합니다.
결론
@SpringBootApplication
어노테이션 → @EnableAutoConfiguration
어노테이션을 통해 스프링 부트는 META-INF/spring.factories
파일에서 후보 클래스를 찾아 자동구성을 진행하게 된다.
Spring.factories
# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer
# Environment Post Processors
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.boot.autoconfigure.integration.IntegrationPropertiesEnvironmentPostProcessor
# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
org.springframework.boot.autoconfigure.condition.OnClassCondition,\
org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
# Failure analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
org.springframework.boot.autoconfigure.data.redis.RedisUrlSyntaxFailureAnalyzer,\
org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
org.springframework.boot.autoconfigure.flyway.FlywayMigrationScriptMissingFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer,\
org.springframework.boot.autoconfigure.jooq.NoDslContextBeanFailureAnalyzer,\
org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryBeanCreationFailureAnalyzer,\
org.springframework.boot.autoconfigure.r2dbc.MissingR2dbcPoolDependencyFailureAnalyzer,\
org.springframework.boot.autoconfigure.r2dbc.MultipleConnectionPoolConfigurationsFailureAnalyzer,\
org.springframework.boot.autoconfigure.r2dbc.NoConnectionFactoryBeanFailureAnalyzer,\
org.springframework.boot.autoconfigure.session.NonUniqueSessionRepositoryFailureAnalyzer
# Template availability providers
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.web.servlet.JspTemplateAvailabilityProvider
# DataSource initializer detectors
org.springframework.boot.sql.init.dependency.DatabaseInitializerDetector=\
org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializerDatabaseInitializerDetector
# Depends on database initialization detectors
org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitializationDetector=\
org.springframework.boot.autoconfigure.batch.JobRepositoryDependsOnDatabaseInitializationDetector,\
org.springframework.boot.autoconfigure.quartz.SchedulerDependsOnDatabaseInitializationDetector,\
org.springframework.boot.autoconfigure.session.JdbcIndexedSessionRepositoryDependsOnDatabaseInitializationDetector
'Spring' 카테고리의 다른 글
[Spring Test] Mockito when()과 given() 차이 (0) | 2024.01.29 |
---|---|
[Spring Boot] 스프링 부트 HTTPS 적용 방법 (1) | 2024.01.26 |
[Spring Boot] Interceptor 활용 (1) | 2024.01.25 |
[Spring Boot] application.yml profile 기능 (1) | 2024.01.25 |
[Spring Core] 관점 지향 프로그래밍 (0) | 2024.01.15 |