@ConfigurationProperties 설정

merci·2023년 8월 14일

설정파일의 속성들을 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 {
}

@ConstructorBinding

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만 필요
}

@ConfigurationProperties를 사용하는 이유

  • 유지보수성, 유연성, 그리고 재사용성이 크게 향상되기 때문이다
    설정파일(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;
    //...
}
profile
작은것부터

0개의 댓글