@Value 대신에 속성들의 타입을 명시하여 아래와 같이 @ConfigurationProperties 를 선언할 수 있다.

아래는 @ConfigurationProperties 로부터 사용자 메타데이터 파일을 쉽게 생성할 수 있도록 spring-boot-configuration-processor 종속성을 가져와서 properties 작성, getter/setter 정의, getter 를 사용하는 순으로 properties 의 속성값을 가져오는 예이다.


- properties

acme.enabled=false
acme.remote-address=192.168.1.234
...
acme.security.username=abc
acme.security.password=efg
...
cs


- build.gradle

dependencies {
   compile "org.springframework.boot:spring-boot-configuration-processor"
}
cs


- AcmeProperties.java

package com.example;
 
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
import org.springframework.boot.context.properties.ConfigurationProperties;
 
@Component
@ConfigurationProperties(prefix="acme")
public class AcmeProperties {
 
    private boolean enabled;
    private InetAddress remoteAddress;
    private final Security security = new Security();
    public boolean isEnabled() { ... }
    public void setEnabled(boolean enabled) { ... }
    public InetAddress getRemoteAddress() { ... }
    public void setRemoteAddress(InetAddress remoteAddress) { ... }
    public Security getSecurity() { ... }
 
    public static class Security {
        private String username;
        private String password;
        private List<String> roles = new ArrayList<>(Collections.singleton("USER"));
        public String getUsername() { ... }
        public void setUsername(String username) { ... }
        public String getPassword() { ... }
        public void setPassword(String password) { ... }
        public List<String> getRoles() { ... }
        public void setRoles(List<String> roles) { ... }
    }
}
cs


- MyService

@Service
public class MyService {
 
    private final AcmeProperties properties;
 
    @Autowired
    public MyService(AcmeProperties properties) {
        this.properties = properties;
    }
 
     //...
 
    @PostConstruct
    public void openConnection() {
        Server server = new Server(this.properties.getRemoteAddress());
        // ...
    }
}
cs


위 예에서 getter와 setter는 Spring MVC 와 마찬가지로 표준 Java Beans 프로퍼티 디스크립터를 통해 바인딩되기 때문에 일반적으로 필수이지만 setter 는 생략될 수도 있다. Project Lombok 을 사용하여 getter 와 setter 를 자동으로 추가하기도 한다.


Spring Boot 는 properties 정보를 @ConfigurationProperties Bean 에 바인딩할 때 다소 완화된 규칙을 사용하므로 properties 속성 이름과 Bean 속성 이름이 정확히 일치하지 않아도 된다. 일반적으로 properties 속성 이름의 단어 사이에 camel/Kebab case 를 사용하거나 언더바(_)로 이어주곤 하는데 이러한 이름들을 모두 동일하게 바인딩 시켜준다. @Value 는 엄격한 규칙 때문에 속성 이름이 일치하지 않으면 값을 불러올 수 없다.


  • acme.my-project.person.first-name (Kebab case)
  • acme.myProject.person.firstName (camel case)
  • acme.my_project.person.first_name (underscore)



@Validated


@ConfigurationProperties 클래스에 @Validated 어노테이션을 사용하여 유효성 검사를 시도할 수 있다.

해당 Properties 를 사용할 @Bean 메서드에 @Validated 를 사용하여 검증을 트리거 할 수도 있다.


@ConfigurationProperties(prefix="acme")
@Validated
public class AcmeProperties {
 
    @NotNull
    private InetAddress remoteAddress;
 
    @Valid
    private final Security security = new Security();
 
    // ... getters and setters
 
    public static class Security {
 
        @NotEmpty
        public String username;
 
        // ... getters and setters
    }
}
cs




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret