[Spring Boot] Auto Configuration

Spring Boot에서 자동 설정을 구현하고 활용하는 방법에 대해 자세히 설명합니다.

 

때때로, 여러 프로젝트에서 공통된 설정을 사용하는 경우, 하나의 프로젝트로 설정을 빼서 사용하고 싶은 경우가 있다.
(특히 MSA 구조로 프로젝트가 설정되어 있을 때, Configuration 프로젝트가 있으면 좋을 것 같다. JPA Entity 설정 등,,)

설정 프로젝트를 수행하는 방법은 다음과 같다.

 


0. 프로젝트 Naming Convention 
XXX-Spring-Boot-Autoconfigure : 자동 모듈 설정
XXX-Spring-Boot-Starter : 필요한 의존성 정의

1. 구현 방법
-의존성 추가
 

<dependencies>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-autoconfigure</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-autoconfigure-processor</artifactId>
       <optional>true</optional>
   </dependency>
</dependencies>

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-dependencies</artifactId>
           <version>2.0.3.RELEASE</version>
           <type>pom</type>
           <scope>import</scope>
       </dependency>
   </dependencies>
</dependencyManagement>

 

2. Configuration Java 파일 생성

3. src/main/resource/META-INF에 spring.factories 파일 만들기

4. spring.factories 안에 자동 설정 파일 추가 (기본 Spring 의 기능이다.)
 

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.my.package.MyConfiguration

5. 실제 Application Project 에서 Configuration 프로젝트에서 생성한 Bean 및 Configuration 을 사용한다.


 

주의할 점

- Spring Boot 에서, Application 자체의 Bean 을 등록한 다음, 그 후에 @EnableAutoConfiguration 의 Bean 들을 등록하기 때문에, @EnableAutoConfiguration 의 Bean 들이 우선권을 지니고 Override 되게 된다. (이것은 대부분 우리가 원하는 결과가 아님!) 이러한 경우를 방지하기 위해, @ConditionalOnMissingBean 어노테이션을 사용하면, 프로젝트에 해당 이름의 Bean 이 있으면, AutoConfiguration 이 실행되지 않게 된다.
- application.properties 에서 Bean 속성 정의하기
 


@ConfigurationProperties("holoman")
@Getter @Setter
public class HolomanProperties {
    private String name;
    private int howLong;
}



@Configuration
@EnableConfigurationProperties(HolomanProperties.class)
public class HolomanConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public Holoman holoman(HolomanProperties properteis) {
        Holoman holoman = new Holoman();
        holoman.setHowLong(properties.getHowLong());
        holoman.setName(properties.getName());
        return holoman;
    }
}

// application.properties
holoman.how-long=5
holoman.name=heejae

 

 


이것도 읽어보세요