1. 개요
Spring Boot의 일반적인 관행은 외부 구성을 사용하여 속성을 정의하는 것 입니다. 이를 통해 다른 환경에서 동일한 애플리케이션 코드를 사용할 수 있습니다.
속성 파일, YAML 파일, 환경 변수 및 명령 줄 인수를 사용할 수 있습니다.
이 짧은 사용방법(예제)에서는 속성과 YAML 파일의 주요 차이점을 살펴 봅니다.
2. 속성 구성
기본적으로 Spring Boot는 key-value 형식을 사용 하는 application.properties 파일에 설정된 구성에 액세스 할 수 있습니다 .
spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
spring.datasource.password=password
여기에서 각 라인은 단일 구성입니다. 따라서 키에 동일한 접두사를 사용하여 계층 적 데이터를 표현해야합니다. 그리고이 예에서 모든 키는 spring.datasource에 속합니다.
2.1. Properties 파일에서 Placeholder 사용
값 내에서 $ {} 구문 과 함께 자리 표시자를 사용하여 다른 키, 시스템 속성 또는 환경 변수의 내용을 참조 할 수 있습니다.
app.name=MyApp
app.description=${app.name} is a Spring Boot application
2.2. List 구조
값이 다른 동일한 종류의 속성이있는 경우 배열 인덱스로 List 구조를 나타낼 수 있습니다.
application.servers[0].ip=127.0.0.1
application.servers[0].path=/path1
application.servers[1].ip=127.0.0.2
application.servers[1].path=/path2
application.servers[2].ip=127.0.0.3
application.servers[2].path=/path3
2.3. 여러 프로필
버전 2.4.0부터 Spring Boot는 다중 문서 속성 파일 생성을 지원합니다. 간단히 말해, 하나의 실제 파일을 여러 논리 문서로 분할 할 수 있습니다.
이를 통해 선언해야하는 각 프로필에 대한 문서를 모두 동일한 파일에 정의 할 수 있습니다.
logging.file.name=myapplication.log
bael.property=defaultValue
#---
spring.config.activate.on-profile=dev
spring.datasource.password=password
spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
bael.property=devValue
#---
spring.config.activate.on-profile=prod
spring.datasource.password=password
spring.datasource.url=jdbc:h2:prod
spring.datasource.username=prodUser
bael.property=prodValue
문서를 분할 할 위치를 나타 내기 위해 '# ---'표기법을 사용합니다.
이 예에서는 태그 가 다른 프로파일을 가진 두 개의 스프링 섹션이 있습니다. 또한 루트 수준에서 공통 속성 집합을 가질 수 있습니다.이 경우 logging.file.name 속성은 모든 프로필에서 동일합니다.
2.4. 여러 파일의 프로필
동일한 파일에 다른 프로필을 갖는 대신 다른 파일에 여러 프로필을 저장할 수 있습니다. 버전 2.4.0 이전에는 속성 파일에 사용할 수있는 유일한 방법이었습니다 .
예를 들어 application-dev.yml 또는 application-dev.properties 와 같이 파일 이름에 프로필 이름을 입력하면됩니다 .
3. YAML 구성
3.1. YAML 형식
Java 속성 파일뿐만 아니라 Spring Boot 애플리케이션에서 YAML 기반 구성 파일을 사용할 수도 있습니다 . YAML은 계층 적 구성 데이터를 지정하기위한 편리한 형식입니다 .
이제 속성 파일에서 동일한 예를 가져와 YAML로 변환 해 보겠습니다.
spring:
datasource:
password: password
url: jdbc:h2:dev
username: SA
반복되는 접두사가 포함되지 않으므로 대체 속성 파일보다 더 읽기 쉽습니다.
3.2. List 구조
YAML에는 List을 표현하기위한보다 간결한 형식이 있습니다.
application:
servers:
- ip: '127.0.0.1'
path: '/path1'
- ip: '127.0.0.2'
path: '/path2'
- ip: '127.0.0.3'
path: '/path3'
3.3. 여러 프로필
속성 파일과 달리 YAML은 설계에 따라 다중 문서 파일을 지원하므로 사용하는 Spring Boot 버전에 관계없이 동일한 파일에 여러 프로필을 저장할 수 있습니다.
그러나이 경우 사양은 새 문서의 시작을 나타 내기 위해 세 개의 대시를 사용해야 함 을 나타냅니다 .
logging:
file:
name: myapplication.log
---
spring:
config:
activate:
on-profile: staging
datasource:
password: 'password'
url: jdbc:h2:staging
username: SA
bael:
property: stagingValue
4. 스프링 부트 사용법
구성을 정의 했으므로 이제 구성에 액세스하는 방법을 살펴 보겠습니다.
4.1. 값 어노테이션
@Value 어노테이션을 사용하여 속성 값을 삽입 할 수 있습니다 .
@Value("${key.something}")
private String injectedProperty;
여기서 key.something 속성 은 필드 주입을 통해 객체 중 하나에 주입됩니다.
4.2. Envirionment Abstraction
환경 API를 사용하여 속성 값을 얻을 수도 있습니다 .
@Autowired
private Environment env;
public String getSomeKey(){
return env.getProperty("key.something");
}
4.3. ConfigurationProperties 어노테이션
마지막으로 @ConfigurationProperties 어노테이션을 사용하여 속성을 형식이 안전한 구조화 된 개체에 바인딩 할 수도 있습니다 .
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
String name;
String description;
...
5. 결론
이 기사에서 우리는 속성 과 yml Spring Boot 구성 파일 간의 몇 가지 차이점을 확인했습니다 . 또한 그 값이 다른 속성을 어떻게 참조 할 수 있는지 살펴 보았습니다. 마지막으로 런타임에 값을 주입하는 방법을 살펴 보았습니다.