스프링 부트 원리 (2)
자동 설정 구현
- 보통 configure와 starter는 패키지를 나누어서 만듦
- xxx-spring-boot-autoconfigure 모듈: 자동 설정
- xxx-spring-boot-starter 모듈: 필요 의존성 정의
- 그러나, 그냥 하나로 만들고자 할 때는 xxx-spring-boot-starter에 함께 집어 넣음
- 구현 방법
- 의존성 추가
<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>
- @Configuration 파일 작성
- src/main/resource/META-INF 폴더에 spring.factories 파일 만들기
- spring.factories 안에 자동 설정 파일 추가
#groupID + Configuration 파일명
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.devfon.HolomanConfiguration
- 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의 사용!
- 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;
}
}
- 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;
}
}
- jar 파일 사용하는 프로젝트의 application.properties에서 설정값 적용
holoman.name = sang
holoman.howLong = 365