환경변수 설정
- 설정파일을 어플리케이션 밖에서 관리함으로써 같은 어플리케이션으로 여러가지 설정을 변경하면서 운영할 수 있다.
- 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_
}
@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
  
  }
}
@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.
댓글
댓글 쓰기