'Properties'에 해당하는 글 2건

@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

Spring Boot 사용시 특정 속성들을 별도로 만들어(외부화) 다른 환경에서도 동일하게 코딩을 할 수 있다.

일반적으로 공통적으로 사용되는 속성들을 정의하거나, 개발 환경(prod/dev) 등을 구분하고자 할 때 주로 사용된다.

그 방법으로 properties 파일이나, YAML 파일, 환경변수 및 명령행 인수 등을 사용할 수 있으며, 

워낙 다양한 방법들이 있다보니 중복되거나 하는 속성 값들에는 PropertySource 우선 순위가 작용한다.


  1. ~/.spring-boot-devtools.properties (devtools가 활성화시)
  2. @TestPropertySource (테스트시)
  3. @SpringBootTest (테스트시)
  4. Command line 파라미터
  5. SPRING_APPLICATION_JSON 속성 (환경 변수 또는 시스템 속성에 포함 된 인라인 JSON).
  6. ServletConfig 초기화 파라미터
  7. ServletContext 초기화 파라미터
  8. java:comp/env JNDI 속성
  9. System.getProperties() (Java System 등록 정보)
  10. OS 환경 변수
  11. RandomValuePropertySource (random.* 속성으로 랜덤값을 삽입할 때 유용)
  12. jar 외부의 프로필 별 속성(application-{profile}.properties 및 YAML 변형)
  13. jar 내부의 프로필 별 속성(application-{profile}.properties 및 YAML 변형)
  14. jar 외부의 속성 ( application.properties 및 YAML 변형)
  15. jar 내부의 속성 ( application.properties 및 YAML 변형)
  16. @Configuration 클래스의 @PropertySource
  17. SpringApplication.setDefaultProperties()


많기도 하여라. 나름이겠지만 사실상 사용하는건 @SpringBootTestapplication-{profile}.properties, @PropertySource 정도가 아닐까.

일반적으로 다음과 같은 방식으로 properties 파일을 작성하여 속성을 정의한다.


spring.profiles.active=dev,hsqldb

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}

app.name=MyApp
app.description=${app.name} is a Spring Boot application
cs


Spring Profiles 는 어플리케이션 구성의 일부를 분리하여 특정 환경에서만 사용할 수 있게 한다. 

@Component 나 @Configuration 은 @Profile 으로 표시되어 로드될 상황을 분리할 수 있다.


@Configuration
@Profile("production")
public class ProductionConfiguration {
    // ...
}
cs


나는 주로 YAML 보다는 properties 를 사용하므로 YAML 에 관련된 내용은 생략하겠다. 

properties 와 동일한 정의가 가능하지만, @PropertySource 로 값을 가져올 수 없다는 차이점 정도?


이렇게 설정된 속성들은 @Value("${property}") 어노테이션을 사용하여 값을 가져올 수 있지만, 여러 속성을 작성하거나 계층적으로 그룹화 된 여러 property 들을 관리할 때는 @Value("${property}") 보다는 @ConfigurationProperties 로 설정하여 바인딩 하는 것이 좋다.




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

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