https://www.baeldung.com/spring-boot-yaml-vs-properties/ 를 번역함.
1. 개요
Spring Boot의 일반적인 관행은 외부 구성을 사용하여 속성을 정의하는 것 입니다. 이를 통해 서로 다른 환경에서 동일한 애플리케이션 코드를 사용할 수 있습니다.
속성 파일, YAML 파일, 환경 변수 및 명령줄 인수를 사용할 수 있습니다.
이 짧은 자습서에서는 속성과 YAML 파일 간의 주요 차이점을 살펴보겠습니다.
2. 속성 구성
기본적으로 Spring Boot는 키-값 형식을 사용 하는 application.properties 파일에 설정된 구성에 액세스할 수 있습니다 .
spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
spring.datasource.password=password
여기서 각 행은 단일 구성이므로 키에 동일한 접두사를 사용하여 계층적 데이터를 표현해야 합니다. 그리고 이 예에서 모든 키는 spring.datasource 에 속합니다 .
2.1. 속성의 자리 표시자
값 내에서 ${} 구문 과 함께 자리 표시자를 사용하여 다른 키, 시스템 속성 또는 환경 변수의 내용을 참조할 수 있습니다.
app.name=MyApp
app.description=${app.name} is a Spring Boot application
2.2. 목록 구조
값이 다른 동일한 종류의 속성이 있는 경우 배열 인덱스를 사용하여 목록 구조를 나타낼 수 있습니다.
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. 목록 구조
YAML에는 목록을 표현하기 위한 보다 간결한 형식이 있습니다.
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
참고: 일반적으로 표준 application.properties 와 application.yml 파일을 동시에 프로젝트에 포함하는 것을 원하지 않습니다 . 예기치 않은 결과가 발생할 수 있기 때문입니다.
예를 들어, 위의 속성( application.yml 파일)을 섹션 2.3.에 설명된 속성과 결합하면 bael.property 에 프로필별 값 대신 defaultValue 가 할당됩니다 . 이는 단순히 application.properties 가 나중에 로드되어 해당 지점까지 할당된 값을 재정의하기 때문입니다.
4. 스프링 부트 사용법
이제 구성을 정의했으므로 구성에 액세스하는 방법을 살펴보겠습니다.
4.1. 값 주석
@Value 주석을 사용하여 속성 값을 주입할 수 있습니다 .
@Value("${key.something}")
private String injectedProperty;
여기서 key.something 속성 은 필드 주입을 통해 객체 중 하나에 주입됩니다.
4.2. 환경 추상화
환경 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 구성 파일 간의 몇 가지 차이점을 보았습니다 . 또한 해당 값이 다른 속성을 참조하는 방법도 보았습니다. 마지막으로 런타임에 값을 주입하는 방법을 살펴보았습니다.
항상 그렇듯이 모든 코드 예제는 GitHub에서 사용할 수 있습니다 .