스프링 부트 원리 (2)

자동 설정 구현

  • 보통 configure와 starter는 패키지를 나누어서 만듦
    • xxx-spring-boot-autoconfigure 모듈: 자동 설정
    • xxx-spring-boot-starter 모듈: 필요 의존성 정의
  • 그러나, 그냥 하나로 만들고자 할 때는 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>
  1. @Configuration 파일 작성
  2. src/main/resource/META-INF 폴더에 spring.factories 파일 만들기
  3. spring.factories 안에 자동 설정 파일 추가
    #groupID + Configuration 파일명
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.devfon.HolomanConfiguration
  1. mvn install
  • 다른 maven project에서도 사용이 가능해지도록 local maven 저장소에 jar 파일 설치하게 됨
  • 다른 프로젝트에서는 아래와 같이 다른 프로젝트에서 의존성 추가하여 사용
<dependency>
    <groupId>com.devfon</groupId>
    <artifactId>devfon-spring-boot-starter</artifactId>
    <version>1.0-SNAP</version>
</dependency>
  • 아래와 같이 의존성이 추가된 것을 확인할 수 있음

  • but, 한 가지 문제가 발생!
    • Component Scan으로 새로운 Bean을 등록한다 하더라도, 이후에 AutoConfiguration의 Bean을 다시 등록하기 때문에 AutoConfiguration의 Bean이 이전 Bean을 무조건 덮어쓰는 문제
    • 이를 해결하기 위해서는 @ComponentScan으로 읽힌 Bean들이 항상 우선 시 되어야 함
    • 해결 방법: @ConditionalOnMissingBean
      • AutoConfiguration에서 설정한 Bean에 @ConditionalOnMissingBean 애노테이션을 달아줌
  • 위 해결 방안을 통해 기정의된 convention이 아닌 내가 정의한 Bean의 사용이 가능해짐! -> "Customizing"
  • 더 나아가...
    • 다른 프로젝트에서 해당 Bean을 사용할 때, 매 번 Bean을 등록해주기가 번거롭다.
    • 다른 편리한 방법이 없을까?
    • ConfigurationProperties의 사용!
  1. jar 파일로 만들고자 하는 프로젝트에 ConfigurationProperties 파일 추가
@ConfigurationProperties("holoman")
public class HolomanProperties {

    private String name;
    private int howLong;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getHowLong() {
        return howLong;
    }

    public void setHowLong(int howLong) {
        this.howLong = howLong;
    }
}
  1. Configuration 파일에 EnableConfigurationProperties 옵션 추가
@Configuration
@EnableConfigurationProperties(HolomanProperties.class)
public class HolomanConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public Holoman holoman(HolomanProperties properties){
        Holoman holoman = new Holoman();
        // properties 파일로부터 값을 읽어와 생성하는 방식!
        holoman.setHowLong(properties.getHowLong());
        holoman.setName(properties.getName());

        return holoman;
    }
}
  1. jar 파일 사용하는 프로젝트의 application.properties에서 설정값 적용
holoman.name = sang
holoman.howLong = 365


+ Recent posts