Spring Boot 2.4 이상에서 설정파일을 다루는 방법
개요
- Spring Boot 2.4 부터 설정파일 (
application.properties
,application.yml
) 를 다루는 방식이 변경되었다. - 그 이유는 쿠버네티스 때문이다. 쿠버네티스의 볼륨 마운트 구성을 지원하기 위해 변경된 것인데, 자세한 내용은 아래 Spring.io 블로그를 참고하자.
- 우리는 변경된 사항에 대해 자세히 알아보도록 한다.
Document Order
- 하나에
yml
파일에서 여러 프로필을 작성한다면 (즉, 다중 프로필 yml 이라면) 하단 문서가 상단 문서의 값을 덮어씌운다.
# 상단 문서
test: "value"
myTest: "value"
---
# 하단 문서
test: "overridden-value" # 위 test의 값을 덮어씌운다. `myTest`는 null이 된다.
Multi-document Properties Files
- 기존에는
.properties
파일 하나에 여러 프로필을 설정할 수 없었고, 파일마다 관리를 했어야 했다.application.properties
,application-dev.properties
등…
- 이제는
.yml
파일처럼 하나의.properties
파일에서 여러 프로필을 관리할 수 있다. - 그리고
.yml
과 마찬가지로 Document Order 도 가능하다.
# 상단 문서
test=value
#---
# 하단 문서
test=overridden-value # 위 test의 값을 덮어씌운다.
Profile Specific Documents
- 기존에는
spring.profiles
를 통해, 프로필을 활성화했다. - 이제는
spring.config.active.on-profile
을 사용하면 된다.
test=value
#---
spring.config.activate.on-profile=dev # 만약 dev라는 이름을 갖는 프로필이 활성화되면 해당 문서를 함께 활성화시킨다.
test=overridden-value
Profile Activation
- 기존의
spring.profiles.active
를 사용해서 프로필을 활성화하거나 포함시키는 작업 역시 그대로 할 수 있다. - 하지만
spring.config.active.on-profile
과 함께 사용하는 것은 불가능하다.
test=value
#---
spring.config.activate.on-profile=dev # 본 문서를 dev에 추가한다.
spring.profiles.active=local # 본 문서가 활성화되면 local 도 활성화시키도록 하려했지만, 실패한다.
test=overridden value
- 이렇게 제한을 걸어둔 이유는 설정 자체가 너무 복잡해질 수 있기 때문에 그렇다고 한다.
- 그렇다면 하나의 설정 파일에 하위 설정 파일을 어떻게 지정할까?
- 일일이 하위 설정 파일마다
spring.config.activate.on-profile
을 작성해주거나, 부모 설정 파일에spring.profiles.active
를 작성하고 모든 하위 설정 파일을 명시해주어야 할까? - 그 해답은
Profile Groups
이다. 이를 통해, 좀 더 보기 좋게 작성할 수 있다.
- 일일이 하위 설정 파일마다
Profile Groups
- Profile Groups 는 단일 프로필을 여러 하위 프로필로 확장할 수 있는 새로운 기능이다.
- Profile Groups 를 사용하면, 여러 하위 프로필을 한눈에 확인할 수 있다.
- 또한, 다른 프로필로 바꾸기 위해 일일이 필요한 프로필을 지정하지 않아도 된다.
- 기존에는 배포 시 필요한 프로필 파일이 10개라고 하면,
spring.profiles.active
에 10개의 프로필 이름을 작성해야 했다. - 이때 만약 실수로 9개의 프로필만 작성한다면? ⇒ 상당히 킹받을 것이다.
- Profile Groups 를 통해 간단히 여러 프로필을 묶을 수 있고, 개발자가 실수할 가능성을 줄일 수 있다.
- 기존에는 배포 시 필요한 프로필 파일이 10개라고 하면,
# 만약 prod 프로필을 활성화시킬때,
# proddb, prodmq, prodmetrics 모두 활성화시켜야 한다면 아래와 같이 작성하면 된다.
spring.profiles.group.prod=proddb,prodmq,prodmetrics
- 이렇게 작성하면, 아래와 같이 동작시킬 수 있다.
# 개발 환경을 사용한다면
spring.profiles.active=dev
# 프로덕트 환경을 사용한다면
spring.profiles.active=prod
# 그룹 설정
spring.profiles.group.dev=devdb,devdata
spring.profiles.group.prod=proddb,prodmq,prodmetrics
Importing Additional Configuration
- 추가적인 속성 파일을 가져올 수 있다.
application-{profile}.properties
나application-{profile}.yml
형식을 갖는 프로필이 아닌, 말 그대로 속성 파일 (변수 등이 담긴) 을 가져올 때 쓴다.
application.name=myapp
spring.config.import=developer.properties
- 아래는
application-prod.properties
가 활성화되었을 때,prod.properties
속성 파일을 가져오는 예시이다.
spring.config.activate.on-profile=prod
spring.config.import=prod.properties
Volume Mounted Configuration Trees
- URL 속성을 가져온다.
- 접두사가 없으면 일반 파일 또는 폴더로 간주한다.
configtree:
- 해당 접두사를 사용하는 경우, 해당 위치에 Kubernetes 스타일의 볼륨 마운트 구성 트리가 있어야 한다는 것을 Spring Boot에게 알려준다.
spring.config.import=configtree:/etc/config
Cloud Platform Activation
- 특정 클라우드 플랫폼에서 볼륨 마운트 구성 트리(또는 해당 항목의 속성)만 활성화한다.
spring.config.activate.on-cloud-platform=kubernetes
spring.config.import=configtree:/etc/config
Using Legacy Processing
- 만약 이전 버전의 설정 방식을 사용하고 싶다면, 아래와 같이 설정하면 된다.
spring.config.use-legacy-processing=true