[스프링 부트] chapter 4. 자동 설정 이해

자동 설정 이해

@SpringBootApplication에는 크게 세가지 중요한 설정들이 들어가 있다.

  1. @SpringBootConfiguration : 스프링 부트에 관련된 설정 등록

  2. @ComponentScan : 빈 파일 검색 후 등록

  3. @EnableAutoConfiguration : 설정파일들 읽어 처리

웹어플리케이션으로 기동하지 않으려면?

public static void main(String[] args) {
    SpringApplication application = new SpringApplication(Application.class);
    application.setWebApplicationType(WebApplicationType.NONE);
    application.run(args);
}

@ComponentScan

@Component가 붙은 클래스들을 찾아 빈 팩토리에 등록

이 밖에도 @Configuration, @Repository, @Service, @Contorller, @RestContorller도 마찬가지로 처리

빈은 두단계로 읽힘

1단계 : @ComponentScan

2단계 : @EnableAutoConfiguration

위의 순서대로 처리하여 중복된 빈 이름이 있을 경우 나중에 명시한 빈이 등록된다.

(단, @Conditional과 같은 설정을 이용하면 먼저 읽은 빈을 등록할 수도 있음)

@EnableAutoConfiguration

spring-boot-autoconfigure의 META-INF/spring.factories에

해당 어노테이션이 붙은 기본 설정 파일들을 명시

해당 파일을 읽어 설정들을 읽어 들인다.

나만의 스프링 부트 의존성 라이브러리를 만들고 싶은 경우

xxx-spring-boot-autoconfigure : 자동 설정

xxx-spring-boot-starter : 의존성 정의

다음과 같은 네이밍 규칙으로 생성하면 됨.

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>juho-spring-boot-autoconfigure</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>juho-spring-boot-starter</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</denpendencies>

@EnableAutoConfigure로 자동 설정 클래스 파일 생성 방법

@Configure를 붙인 설정 자바 파일 생성 후 META-INF/spring.factories 에 다음 설정 파일 정보 등록

(ex: org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.juho.XxxConfiguration)

일반적인 getter/setter 자바 파일에 @ConfigurationProperties(“이름”)을 붙이면

application.properties에 정의한 프로퍼티와 매핑 가능

@EnableConfigurationProperties(해당프로퍼티파일.class)를 붙여 프로퍼티로 사용

@Configuration
@EnableConfigurationProperties(JuhoProperties.class)
public class JuhoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public Juho juho(JuhoProperties properties) {
        Juho juho = new Juho();
        juho.setAge(properties.getAge());
        juho.setName(properties.getName());
    }
}