spring boot는 spring의 설정을 편리하게 하고 실행가능한 어플리케이션을 만들어주는 프레임웍이다. spring 사용을 간단하게 한 일등공신이다.
필자도 처음 spring을 접할 때 복잡한 설정 때문에 힘들다는 이야기를 많이 들었는데, spring boot가 나온 뒤로 너무 간편하게 어플리케이션이 실행되서 그 동작 방식에 궁금해 했었다. 그 동작방식을 분석한 글을 보았는데 이 블로그은 해당 내용을 정리하였다.
spring boot 설정의 비밀은 @EnableAutoConfiguration에 있다. @EnableAutoConfiguration 어노테이션은 spring boot가 클래스 경로에서 찾은 바에 따라 애플리케이션이 필요로 하는 모든 bean을 자동으로 로드한다.
@Enable* 어노테이션
@Enable* 어노테이션은 새로운 것이 아니다. spring 3에서 xml의 설정을 java 어노테이션 방식으로 변환하도록 소개되었다. spring 사용자들이 많이 알고 있는 @EnableTransactionManagement, @EnableWebMvc, @EnableScheduling 등이 대표적이다. 사실 이들 어노테이션들은 @Import 어노테이션을 통해서 설정을 가져오게 오도록 되어 있다.
그러면 spring boot에서 설정값들을 가져오는 @EnableAutoConfiguration 어노테이션을 살펴보자.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration”;
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
EnableAutoConfiguration에서 Import 하고 있는 EnableAutoConfigurationImportSelector를 살펴보면 Spring Core의 SpringFactoriesLoader#loadFactoryNames을 사용하고 있다. SpringFactoriesLoader는 META-INF/spring.factories에 포함되어 있는 jar파일들을 찾는다. 파일을 찾으면 SpringFactoriesLoader는 설정 파일의 이름을 따서 명명된 속성들을 찾을 것이다.
spring.factories의 내용을 간략히 보면 아래와 같다.
# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,\
자동으로 설정되는 파일 중에 하나를 살펴보자.
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@ConditionalOnWebApplication
@ConditionalOnClass(DispatcherServlet.class)
@AutoConfigureAfter(EmbeddedServletContainerAutoConfiguration.class)
public class DispatcherServletAutoConfiguration {
...
}
위 클래스에서 spring boot의 @Conditional 어노테이션들을 사용하고 있다. 몇가지만 예로 살펴보자.
- @ConditionalOnClass : 하나 이상의 클래스가 classpath에 존재할 경우 설정을 활성화 한다.
- @ConditionalOnWebApplication : 웹 어플리케이션 컨텍스트일 경우 활성화 한다.
@Conditional 어노테이션
@Conditional 어노테이션을 통해 특정 조건이 충족될 때만 일부 구성을 가능하게 한 기능은 spring 4의 큰 특징 중 하나이다.
org.springframework.boot.autoconfigure.condition 패키지를 살펴보면 아래와 같은 어노테이션들이 존재한다.
- @ConditionalOnBean
- @ConditionalOnClass
- @ConditionalOnExpression
- @ConditionalOnMissingBean
- @ConditionalOnMissingClass
- @ConditionalOnNotWebApplication
- @ConditionalOnResource
- @ConditionalOnWebApplication
spring boot debug
spring boot를 실행 시 debug 모드를 활용하면 어떤 설정들을 로드했는지 정보를 받아볼 수 있다.
Positive matches:
-----------------
MessageSourceAutoConfiguration
- @ConditionalOnMissingBean (types: org.springframework.context.MessageSource; SearchStrategy: all) found no beans (OnBeanCondition)
JmxAutoConfiguration
- @ConditionalOnClass classes found: org.springframework.jmx.export.MBeanExporter (OnClassCondition)
- SpEL expression on org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration: ${spring.jmx.enabled:true} (OnExpressionCondition)
- @ConditionalOnMissingBean (types: org.springframework.jmx.export.MBeanExporter; SearchStrategy: all) found no beans (OnBeanCondition)
DispatcherServletAutoConfiguration
- found web application StandardServletEnvironment (OnWebApplicationCondition)
- @ConditionalOnClass classes found: org.springframework.web.servlet.DispatcherServlet (OnClassCondition)
Negative matches:
-----------------
DataSourceAutoConfiguration
- required @ConditionalOnClass classes not found: org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType (OnClassCondition)
DataSourceTransactionManagerAutoConfiguration
- required @ConditionalOnClass classes not found: org.springframework.jdbc.core.JdbcTemplate,org.springframework.transaction.PlatformTransactionManager (OnClassCondition)
MongoAutoConfiguration
- required @ConditionalOnClass classes not found: com.mongodb.Mongo (OnClassCondition)
[참고]
반응형
'Framework > spring' 카테고리의 다른 글
[spring] lifecycle mechanisms (0) | 2017.08.29 |
---|---|
[spring] cache (0) | 2017.08.29 |
스프링 팁: *Utils 클래스 활용 (0) | 2017.04.03 |
[spring security] Controller에서 Principal 가져오기 (0) | 2016.03.24 |