본문 바로가기

Spring

Spring Boot @EnableAutoConfiguration

728x90
반응형

@SpringBootApplication


@SpringBootApplication
public class Application {

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

}

스프링부트에서 시작점은 @SpringBootApplicaion 어노테이션이다.

run을 실행하면 서버를 시작할 수 있다. 

 

@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(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
..
}

@SpringBootConfiguration은 @Configuration이 적용된 빈이다. 

 

@ComponentScan은 @SpringBootApplication이 적용된 클래스 하위 패키지에서 빈을 찾아서 IoC컨테이너 빈으로 등록해주는 역할을 한다. 

 

@EnableAutoConfiguration은 스프링부트에서 필요한 자동설정을 해주는데 ComponentScan이후에 진행한다. 

 

@EnableAutoConfiguration


META-INF/spring.factories

# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

# Environment Post Processors
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.boot.autoconfigure.integration.IntegrationPropertiesEnvironmentPostProcessor

# 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
....

자동 설정 타깃 클래스 목록이다. 이 곳에 선언되어있는 클래스들이  @EnableAutoConfiguration사용시 자동 설정 타깃이 된다.

 

META-INF/spring-configuration-metadata.json

{
  "groups": [
    {
      "name": "server",
      "type": "org.springframework.boot.autoconfigure.web.ServerProperties",
      "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
    },
    {
      "name": "server.compression",
      "type": "org.springframework.boot.web.server.Compression",
      "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties",
      "sourceMethod": "getCompression()"
    },
    {
      "name": "server.error",
      "type": "org.springframework.boot.autoconfigure.web.ErrorProperties",
      "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties",
      "sourceMethod": "getError()"
    },
    {
      "name": "server.error.whitelabel",
      "type": "org.springframework.boot.autoconfigure.web.ErrorProperties$Whitelabel",
      "sourceType": "org.springframework.boot.autoconfigure.web.ErrorProperties",
      "sourceMethod": "getWhitelabel()"
    },
    ...
    }

자동설정에 사용할 프로퍼티 정의 파일이다. 미리 구현된 자동 설정에 프로퍼티만 주입시켜주면 된다.

(따로 환경 설정이 필요없음)

 

org/springframework/boot/autoconfigure 

미리 구현해놓은 설정 리스트로 '{특정설정의 이름}AutoConfiguration' 형식으로 지정되어 있다. 


예를 들어 H2 자동설정 한다고 할 때 먼저 spring.factories에서 대상이 되는지 확인한다. 

 

spring-configuration-metadata.json파일에서 해당데이터의 프로퍼티 default값을 확인한다.

{
  "name": "spring.h2.console.path",
  "type": "java.lang.String",
  "description": "Path at which the console is available.",
  "sourceType": "org.springframework.boot.autoconfigure.h2.H2ConsoleProperties",
  "defaultValue": "\/h2-console"
},

여기에서 주요 프로퍼티값을 어떤 타입으로 설정할 수 있는지 확인이 가능하다.

spring:
  h2:
    console:
      path: /console

application.yml에 프로퍼티를 설정하면 해당 설정으로 사용할 수 있다. 

 

 

문서를 이용하면 더 쉽게 프로퍼티를 확인할 수 있다. 

https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html

 

Common Application Properties

 

docs.spring.io

 

728x90
반응형