자동 설정 이해하기
Spring boot main 클래스의 상위에 보면 @SpringBootApplication이라는 어노테이션을 볼 수 있다.
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args); // 이 class와 arguments를 넘겨준다.
}
}
이 어노테이션을 아래와 같이 설정이 되어 있는데, 여기서 @EnalbeAutoConfiguration이란 놈이 자동으로 설정을 해주는 녀석이다.
@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 {
.....
}
따라서 저 위에 있는 main 클래스는 아래와 같이 쓸 수 있다. (이 세개의 어노테이션이 핵심이다.)
@SpringBootConfiguration
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args); // 이 class와 arguments를 넘겨준다.
}
}
Spring Boot의 빈 등록 방식은 두 단계에 걸쳐서 진행된다.
첫 번째로 ComponentScan으로 bean을 등록하고, 두 번째로 EnableAutoConfiguration으로 추가적인 bean들을 읽어서 추가하게 된다.
- @ComponentScan
- @EnableAutoConfiguration
@CompoentScan은 스프링을 하면 알다시피 @Compoent라는 어노테이션이 붙어있는 class를 빈으로 등록한다.
(@Compoent, @Configuration, @Repository, @Service, @Controller, @RestController ..)
중요한 것은 @EnableAutoConfiguration인데 @EnableAutoConfiguration은 스프링부트의 meta 파일을 읽어서, 미리 정의되어 있는 자바 설정 파일(@Configuration)들을 빈으로 등록하는 역할을 수행한다.
- spring.factories 라는 스프링부트의 meta파일을 읽어들인다.
그렇다면 spring.factories라는 파일을 살펴보자.
spring.factories는 spring-boot-autoconfigure 프로젝트의 META-INF안에 들어있다.
// 그림
# 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,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
....
이렇게 spring.factories안에는 여러가지 autoConfiguration들이 정의되어 있다.
이 키값에 설정되어 있는 녀석들은 모두 autoConfiguration의 대상이되며 적용된다. (단, 조건에 따라서 등록이 안될 수도 있다.)
ex) classpath에 servlet이 있으면 bean 설정(configuration)을 사용해라
autoConfiguration클래스안으로 들어가면 @ConditionalOnXxxYyyZzz라는 어노테이션들이 바로 조건에 따라 사용할 것인지 않을 것인지에 대한 정보를 나타낸다.
그렇기 때문에 @EnableAutoConfiguration이라는 어노테이션은 스프링부트에서 미리정의해둔 bean 설정(configuration)들을 사용하게되어서 우리는 아무설정없이 SpringBoot를 이용하는 것 처럼 보이게 되는 것이다.
'프로그래밍 노트 > SPRING BOOT' 카테고리의 다른 글
[Spring Boot] Servlet, Servlet-filter 설정 (1) | 2019.11.05 |
---|---|
[Spring Boot] 자동 설정 이해하기2 (0) | 2019.11.05 |
[Spring Boot] 스프링부트 테스트하기 (0) | 2019.09.16 |
[Spring Boot] 의존성 관리 (0) | 2019.07.11 |
[Spring Boot] 스프링 부트 시작하기 (4) | 2019.07.03 |