[Spring] @ConfigurationProperties 사용법 (설정 값 바인딩)

@ConfigurationProperties

*.properties , *.yml 파일에 있는 property를 자바 클래스에 값을 가져와서(바인딩) 사용할 수 있게 해주는 어노테이션이다.

 

ConfigurationProperties 장점
  • 외부 설정을 객체로 편리하게 변환해서 사용할 수 있다.
  • 외부 설정의 계층을 객체로 편리하게 표현할 수 있다.
  • 외부 설정을 타입 안전하게 사용할 수 있다. (타입 오류시 컴파일 오류로 확인할 수 있음)
  • (Bean Validation) 검증기를 적용할 수 있다. 

 

사용법

*.properties, *.yml 파일의 설정 값을 @Value 을 사용하여 바인딩할 수 있다.

 

만약 application.properties의 설정 값이 다음과 같다면

my.test.url=test.db.com
my.test.username=hyunlog
my.test.password=12341234
my.test.maxConnection=1

 

이를 @Value를 사용하여 바인딩하면 다음과 같이 할 수 있다. (여기서는 빈 검증기와 함께 사용하였다.)

(빈 검증기에 대한 부분은 우측 링크 클릭 => 2023.04.06 - [JAVA/Spring] - [Spring] Bean Validation - 유효성 검증 )

@Getter
@ConfigurationProperties("my.test")
@Validated
public class MyTestProperties {
    @NotNull // 필수 값
    private String url;

    @NotNull
    private String username;

    @NotEmpty
    private String password;

    @Min(1)
    @Max(999)
    private int maxConnection; // 최소 1부터 최대 999까지 허용

    public MyTestProperties(String url, String username, String password, int maxConnection) {
        this.url = url;
        this.username = username;
        this.password = password;
        this.maxConnection = maxConnection;
    }
}
  1. properties 파일의 key값에서 동일하게 시작하는 부분(여기서는 my.datasource)을 @ConfigurationProperties 값에 넣어준다.
  2. 값을 꺼내 사용하기 위해 Getter를 만들어 준다.

여기 까지가 설정 파일의 값을 바인딩하는 방법이다.

 

@EnableConfigurationProperties

이제 이것을 사용하기 위해서는 

@EnableConfigurationProperties 어노테이션을 사용하여 스프링에게 사용할 @ConfigurationProperties를 값으로 넘겨어야 한다.

넘겨진 해당 클래스는 스프링 Bean 등록되고, 필요한 곳에 주입 받아서 사용할 수 있게 된다.

@EnableConfigurationProperties(MyTestProperties.class)
public class PropertiesConfig {

    private final MyTestProperties properties;

    public PropertiesConfig(MyTestProperties properties) {
        this.properties = properties;
    }

    @Bean
    public MyTestProperties myTestProperties() {
        return new MyTestProperties(
                properties.getUrl(),
                properties.getUsername(),
                properties.getPassword(),
                properties.getMaxConnection());
    }
}