나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

Framework/spring

[spring boot] spring boot configuration 이해

devidea 2017. 8. 30. 18:02
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