환경변수 설정
- 설정파일을 어플리케이션 밖에서 관리함으로써 같은 어플리케이션으로 여러가지 설정을 변경하면서 운영할 수 있다.
- Properties files, yaml files, environment variable, command-line arguments 사용
- @Value 어노테이션을 통해 주입받을 수 있다.
우선순위
- 스프링부트에서는 환경변수값을 읽는 우선순위가 있다. 만약 예사외의 값이 적용되었다면 아래 순위를 확인해보자
- devtools -> test관련 -> command line -> servlet -> Jndi -> system property -> environments -> random -> properties file -> @Configuration classes
1. [Devtools global settings properties](https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-globalsettings) on your home directory (~/.spring-boot-devtools.properties when devtools is active).
2. [@TestPropertySource](https://docs.spring.io/spring/docs/5.0.5.BUILD-SNAPSHOT/javadoc-api/org/springframework/test/context/TestPropertySource.html) annotations on your tests.
3. [@SpringBootTest#properties](https://docs.spring.io/spring-boot/docs/2.0.1.BUILD-SNAPSHOT/api/org/springframework/boot/test/context/SpringBootTest.html) annotation attribute on your tests.
4. Command line arguments.
5. Properties from SPRING\_APPLICATION\_JSON (inline JSON embedded in an environment variable or system property).
6. ServletConfig init parameters.
7. ServletContext init parameters.
8. JNDI attributes from java:comp/env.
9. Java System properties (System.getProperties()).
10. OS environment variables.
11. A RandomValuePropertySource that has properties only in random.*.
12. [Profile-specific application properties](https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-profile-specific-properties) outside of your packaged jar (application-{profile}.properties and YAML variants).
13. [Profile-specific application properties](https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-profile-specific-properties) packaged inside your jar (application-{profile}.properties and YAML variants).
14. Application properties outside of your packaged jar (application.properties and YAML variants).
15. Application properties packaged inside your jar (application.properties and YAML variants).
16. [@PropertySource](https://docs.spring.io/spring/docs/5.0.5.BUILD-SNAPSHOT/javadoc-api/org/springframework/context/annotation/PropertySource.html) annotations on your @Configuration classes.
17. Default properties (specified by setting SpringApplication.setDefaultProperties).
Configuring Random Values
- 프로퍼티에 랜던값을 넣어줄 수 있음
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\]}
yaml
- json의 superset, properties의 대안,
- SankeYAML 라이브러리 필요(Spring-boot-starter에 포함)
Loading YAML
- yaml를 로딩하는 클래스는 2가지임
- YamlPropertiesFactoryBean : Properties 형태
- YamlMapFactoryBean : Map 형태
Yaml
environments:
dev:
url: http://dev.example.com
name: Developer Setup
prod:
url: http://another.example.com
name: My Cool App
Yaml->properties
environments.dev.url=http://dev.example.com
environments.dev.name=Developer Setup
environments.prod.url=http://another.example.com
environments.prod.name=My Cool App
Yaml
my:
servers:
- dev.example.com
- another.example.com
Yaml -> list
my.servers[0]=dev.example.com
my.servers[1]=another.example.com
@ConfigurationProperties
- yaml 프로퍼티를 바로 mutable한 list나 set타입의 객체에 바인딩할 수도 있다.
@ConfigurationProperties(prefix="my")
public class Config {
private List<String> servers = new ArrayList<String>();
public List<String> getServers() {
return this.servers;
}
}
Multi-profile YAML Documents
- 하나의 파일에서 복수개의 프로파일을 설정할 수 있다.
server:
address: 192.168.1.100
---
spring:
profiles: development
server:
address: 127.0.0.1
---
spring:
profiles: production
server:
address: 192.168.1.120
Third-party Configuration
@ConfigurationProperties 어노테이션을 사용하면 properties를 바로 클래스에 매핑해서 빈으로 등록해서 사용할 수 있었다. 그런데 이번에는 추가로 @Bean 어노테이션을 사용하면 클래스가 외부에 존재한다고 하더라도 빈으로 등록해서 사용할 수 있다.@ConfigurationProperties(prefix = "another")
@Bean
public AnotherComponent anotherComponent() {
...
}
Properties Conversion
스프링부트에서 프로퍼티를 빈으로 매핑할때 적당한 타입을 지정할때 @ConfigurationProperties 빈이 사용된다. 만약 type 변환을 수정하려면 ConversionService 빈을 사용허거나 CustomEditorConfigurer, Coverters라는 빈을 활용하면 된다.Converting durations
프로퍼티에 시간에 관련된 값이 있다면 java.util.Duration 클래스를 사용한다.@DurationUnit 을 별도로 지정하지 않으면 ISO-8601 형식으로 출력된다.
@ConfigurationProperties("app.system")
public class AppSystemProperties {
@DurationUnit(ChronoUnit.SECONDS)
private Duration sessionTimeout = Duration.ofSeconds(30);
private Duration readTimeout = Duration.ofMillis(1000);
public Duration getSessionTimeout() {
return this.sessionTimeout;
}
public void setSessionTimeout(Duration sessionTimeout) {
this.sessionTimeout = sessionTimeout;
}
public Duration getReadTimeout() {
return this.readTimeout;
}
public void setReadTimeout(Duration readTimeout) {
this.readTimeout = readTimeout;
}
}
Validation
@Validated 를 사용해 propertie값의 유효성체크를 할 수 있다.
@ConfigurationProperties(prefix="acme")
@Validated
public class AcmeProperties {
@NotNull
private InetAddress remoteAddress;
//... getters and setters_
}
중첩된, 서브프로퍼티도 유효성체크를 진행할 수 있는데 명시적으로 @Valid 어노테이션을 사용하는걸 권장한다고 한다.@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
}
}
Validator를 수정할 수 도 있다. https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-property-validation/src/main/java/sample/propertyvalidation/SamplePropertyValidationApplication.java@ConfigurationProperties vs. @Value
Feature | @ConfigurationProperties | @Value |
---|---|---|
Relaxed binding | Yes | No |
Meta-data support | Yes | No |
SpEL evaluation | No | Yes |
Profile
어플리케이션 환경설정을 분리하고, 특정한 환경에서만 사용할 수 있도록 해준다.@Component, @Configuration은 @Profile과 같이 사용할 수 있다.
@Configuration
@Profile("production")
public class ProductionConfiguration {
// ...
}
spring.profiles.active에 특정 profile 을 명세해줌으로써 사용할 수 있다.
// spring.profiles.active=dev,hsqldb
command-line에서도 지정 가능하다.
// —spring.profiles.active=dev,hsqldb.
댓글
댓글 쓰기