본문 바로가기
Back-end

Spring AutoConfiguration

by 신재권 2024. 1. 20.

스프링 부트 Auto Configuration

스프링 부트는 자동 구성 기능을 제공

  • 일반적으로 자주 사용하는 수 많은 빈들을 자동으로 등록해주는 기능

@AutoConfiguration

자동 구성을 사용하려면 해당 어노테이션을 등록해야 한다.

  • 자동 구성 내부에도 @Configuration 이 존재
    • 빈을 등록하는 자바 설정 파일로 사용 가능
    • 자동 구성이 실행되는 순서를 지정 가능
      • after = DataSourceAutoConfiguration.class
        • JdbcTemplate는 DataSource가 필요하기 때문에 DataSourceAutoConfiguration 다음에 실행하도록 설정
  • @ConditionalOnClass
    • if 문과 유사한 기능 제공
      • 이런 클래스가 있는 경우에만 설정이 동작
      • 설정이 없다면 무효화되고, 빈도 등록되지 않음
@AutoConfiguration(after = DataSourceAutoConfiguration.class)
@ConditionalOnClass({ DataSource.class, JdbcTemplate.class })
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(JdbcProperties.class)
@Import({ DatabaseInitializationDependencyConfigurer.class, JdbcTemplateConfiguration.class,
		NamedParameterJdbcTemplateConfiguration.class })
public class JdbcTemplateAutoConfiguration {

}
  • @Configuration
    • 자바 설정 파일로 사용
  • @ConditioanlOnMissingBean
    • 해당 빈이 없을 때 동작

스프링 부트는 많은 자동 구성을 제공하고 spring-boot-autoconfigure에 자동 구성을 모아둔다.

@ConditionalOnXxx

  • @ConditionalOnClass, @ConditionalOnMissingClass
    • 클래스가 있는 경우 동작, 없는 경우 동작
  • @ConditionalOnBean, @ConditionalOnMissingBean
    • 빈이 등록되어 있는 경우 동작, 없는 경우 동작
  • @ConditionalOnProperty
    • 환경 정보가 있는 경우 동작
  • @ConditionalOnResource
    • 리소스가 있는 경우 동작
  • @ConditionalOnWebApplication, @ConditionalOnNotWebApplication
    • 웹 애플리케이션 인 경우 동작, 아닐 경우 동작
  • @ConditionalOnExpression
    • SpEL 표현식에 만족하는 경우 동작

스프링 부트 자동 구성 동작 순서

  1. @SpringBootApplication
  2. @EnableAutoConfiguration
  3. @Import(AutoConfigurationImportSelector.class)

ImportSelector

@Import에 설정 정보를 추가하는 방법은 2가지

  • 정적인 방법 : @Import(클래스) 정적인 방식, 코드에 대상이 박혀있다.
    • 설정으로 사용할 대상을 동적으로 변경 불가
  • 동적인 방법 : @Import(ImportSelector), 코드로 프로그래밍해서 설정으로 사용할 대상을 동적으로 선택 가능

ImportSelector 인터페이스를 통해 설정 정보 대상을 동적으로 선택 할 수 있음

@EnableAutoConfiguration

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

	Class<?>[] exclude() default {};

	String[] excludeName() default {};

}

AutoConfigurationImportSelector는 ImportSelector의 구현체

  • 설정 정보를 동적으로 선택할 수 있음
  • 해당 경로의 파일을 확인
  • META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
  • 자동 구성이 내부에서 컴포넌트 스캔을 사용하면 안됨

@AutoConfiguration

  • 스프링 부트에서 Auto Configuration으로 처리될 수 있는 후보를 명시하는 역할
  • before, after 속성을 통해 Auto Configuration 시 처리 순서를 제어할 수 있음

'Back-end' 카테고리의 다른 글

Spring HttpMessageConverter  (0) 2024.01.28
Query DSL 성능 개선  (0) 2024.01.20
Spring Validation in Kotlin  (0) 2024.01.14
Spring @Async + ThreadPoolTaskExecutor  (1) 2024.01.14
Spring Security Filter  (0) 2024.01.01