설정파일의 속성들을 POJO에 바인딩하여 JAVA에서 사용하기 용이하게 만든다.
설정 파일(application.yml 또는 application.properties)의 값을 특정 클래스에 매핑하여 쉽게 사용할 수 있도록 지원한다
@EnableConfigurationProperties를 통해서 @ConfigurationProperties로 정의된 클래스를 스프링 컨텍스트에 등록하고, 설정 파일의 속성을 type-safe한 방식으로 해당 클래스에 바인딩한다
아래의 코드에서 app으로 시작하는 설정 값들이 클래스에 바인딩 된다
스프링 컨텍스트에 등록되었으므로 다른 빈에 DI가 가능해진다
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String name;
private String version;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
}
app:
name: My Application
version: 1.0.0
Spring boot에서는 @SpringBootApplication가 적용된 메인 클래스에서 자동으로 @EnableConfigurationProperties가 활성화된다
따라서 대부분의 경우 @ConfigurationProperties만 선언하면 동작한다
특정 설정 클래스를 명시적으로 활성화하려는 경우 @EnableConfigurationProperties를 사용한다
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(AppProperties.class)
public class AppConfig {
}
Spring Boot 2.2 버전부터는 @ConstructorBinding을 사용하여 불변 객체 스타일의 설정 클래스를 만들 수 있다
@ConstructorBinding은 설정 값을 생성자를 통해 주입하는 방식으로 작동한다
@ConfigurationProperties(prefix = "app")
@ConstructorBinding
public class AppProperties {
private final String name;
private final String version;
public AppProperties(String name, String version) {
this.name = name;
this.version = version;
}
// Getter만 필요
}
유지보수성, 유연성, 그리고 재사용성이 크게 향상되기 때문이다
설정파일(yml, properties)는 많은 설정들을 그룹화하고 구조화된 방식으로 보기가 편하고 관리하기도 좋다
또한 타입안정성을 제공한다
설정 값을 자바 객체에 바인딩할 때 잘못된 타입일 경우 컴파일 오류를 발생시켜준다
반복 코드를 줄일 수 있다
복잡한 설정을 처리할 때, @Value를 사용하면 개별적으로 값을 주입받아야 하지만, @ConfigurationProperties는 한 번의 설정으로 그룹화된 값을 처리할 수 있다
@Value("${app.name}")
private String name;
@Value("${app.version}")
private String version;
@Value("${app.feature.enabled}")
private boolean enabled;
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String name;
private String version;
private boolean enabled;
// Getter와 Setter
}
@Validated같은 어노테이션과 함께 사용하여 설정 값에 대한 유효성 검사를 수행할 수 있다@ConfigurationProperties(prefix = "app")
@Validated
public class AppProperties {
@NotNull
private String name;
@Min(1)
private int maxUsers;
//...
}