본문 바로가기

프로그래밍/Spring

스프링부트의 자동설정

스프링부트의 자동설정

스프링 부트에서는 어떻게 스프링에서 오래 걸렸던 초반 환경설정 없이 바로 동작이 가능한 것일까?
spring initializr를 통해 프로젝트를 생성하면 main 클래스에 @SpringBootApplication 어노테이션을 볼 수 있다.

@SpringBootApplication
public class SpringbootDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootDemoApplication.class, args);
    }

}

이 어노테이션을 살펴보면 다양한 어노테이션들이 붙어있다.

@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 {
    ...

@Target, @Retention, @Documented, @Inherited는 메타 어노테이션이라고 하여 이를 이용하여 커스텀한 어노테이션을 만들 수 있다.
@SpringBootConfiguration는 spring boot에서 사용되는 설정파일임을 알려준다.
@ComponentScan은 Component를 가진 하위 패키지 클래스들을 빈으로 등록해준다.
@EnableAutoConfiguration은 auto configuration을 사용하겠다는 뜻으로 spring-boot-autoconfigure 프로젝트의 meta 파일을 읽어서 정의되어있는 Configuration들을 빈으로 등록해준다.

  • META-INF/spring.factories에 다양한 설정들이 정의되어있다.
# 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

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
... 

그리고 이 AutoConfiguration 클래스들을 가보면 @ConditionalOnMissingBean이나 @ConditionalOnProperty처럼 언제 등록될지에 대한 정보를 가지고 있어 조건에 맞게 빈을 등록하게 된다.

이처럼 spring boot는 @ComponentScan으로 패키지를 스캔하여 빈을 등록한 다음 @EnableAutoConfiguration으로 사전에 정의한 AutoConfiguration들을 빈으로 등록한다.