[springboot] 자동 설정(Auto-Configuration) 이해

2022. 8. 15. 12:50JAVA/Spring

1. 자동 설정 개요

  • 빈(Bean)의 두 단계 등록
    • 1단계 : @ComponentScan
    • 2단계 : @EnableAutoConfiguration
  • @ComponentScan
    • @Component
    • @Configuration, @Repository, @Service, @Controller, @RestController
  • @EnableAutoConfiguration
    • spring.factories
      • org.springframework.boot.autoconfigure.EnableAutoconfiguration
    • @Configuration
    • @ConditionalOnXxxYyyZzz

 

2. @ComponentScan

애플리케이션이 실행되면 @Component 어노테이션을 탐색합니다. 탐색 위치는 @ComponentScan 어노테이션이 적용된 현재 위치 및 하위 패키지입니다. @Component 어노테이션이 적용된 클래스를 빈으로 등록합니다.

 

@ComponentScan 어노테이션은 @Configuration, @Repository, @Service, @Controller, @RestController 어노테이션도 탐색하여 빈으로 등록합니다.

 

@ComponentScan 어노테이션이 정의되어 있는 대표적인 어노테이션이 @SpringBootApplication 어노테이션입니다.

다음은 @SpringBootApplication 어노테이션이 적용된 메인 애플리케이션 클래스와 @SpringBootApplication 어노테이션내부 정의 내용입니다.

@SpringBootApplication
public class BasicApplication {

	public static void main(String[] args) {
		SpringApplication.run(BasicApplication.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 {

...

SpringBootApplication 어노테이션의 정의된 어노테이션을 보면 @ComponentScan이 정의되어 있는 것을 볼 수 있습니다. 따라서 BasicApplication이 실행시 @ComponentScan이 실행되어 빈들을 IOC 컨테이너에 등록되는 것을 알 수 있습니다.

 

3. @EnableAutoConfiguration

@EnableAutoConfiguration 어노테이션은 프로젝트의 외부 라이브러리들의 빈들을 등록하는 어노테이션입니다. 외부 라이브러리들의 빈들을 등록하기 위한 대상은 @Configuration 어노테이션이 정의되거나 @Conditional로 시작하는 클래스를 대상으로 합니다.

 

자동 설정(Auto-configuration)이란 무엇인가?

스프링 부트 자동설정은 프로젝트에 추가한 jar 파일의 의존성들을 기반으로 프로젝트의 스프링 애플리케이션을 자동적으로 설정하기 위해 수행되는 과정입니다. 예를 들어, HSQLDB가 클래스 경로에 있고 데이터베이스 연결 빈을 수동으로 하지 않은 경우 Spring Boot은 메모리 내 데이터베이스를 자동 설정합니다.

 

@EnableAutoConfiguration 또는 @SpringBootApplication 어노테이션을 둘중 하나 추가함으로써 자동 설정을 선택해야 합니다.

 

4. @ConditionalOnXxxYyyZzz

@ConditionalOnXxxYyyZzz 어노테이션은 조건에 따라서 빈을 등록할지 말지 조건을 설정하는 어노테이션입니다.

  • @ConditionalOnBean : 빈이 등록되어 있으면 실행함
  • @ConditionalOnMissingBean : 빈이 등록되어 있지 않으면 실행함
@AutoConfiguration
public class MyAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public SomeService someService() {
        return new SomeService();
    }

}

위 예제에서 someService 메서드는 빈으로 등록되어 있지 않기 때문에 빈으로 등록될 것입니다.

 

 

References

Spring Boot Reference Documentation
[Spring] @Configuration 개념과 장점