티스토리 뷰
개인 공부용으로 번역한거라 오역이 있을 수 있고 생략된 내용이 있습니다~
Spring Boot Config Data Migration Guide · spring-projects/spring-boot Wiki
이 문서를 번역합니다~
이 문서는 application.properties와 application.yml 파일을 spring boot 2.4 상위 버전에 맞게 migration 하기 위한 방법을 서술한다.
Overview
스프링 부트 2.4는 application.properties와 application.yml 파일이 진행되는 방식을 점검overhaul한다. 업데이트된 로직은 simplify하고 rationalize 한 방식으로 고안되어 외부 설정을 로드할 수 있다. 또한 spring.config.import
지원과 같은 새로운 기능을 제공한다.
업데이트 된 디자인은 의도적으로 특정 속성 조합을 제한한다. 이는 스프링 부트 2.3 이전 버전에서 업그레이드할 때 몇 가지 변경할 사항이 있음을 말한다.
Legacy Mode
아직 migration 하고 싶지 않을 때는 legacy mode를 다시 사용하도록 설정한다.
spring.config.use-legacy-processing
속성을 true
로 놓는다.
applicatoin.properties에서
spring.config.use-legacy-processing=true
# 이하 다른 속성
중간 생략
Simple Scenarios
Multi-document YAML Ordering
Profile Specific Documents
jar 밖에서 설정을 사용하는 경우, 구체적인 프로필 설정profile-specific 파일을 만든 경우 예상대로 properties가 로드되었는지 확인이 필요하다. Spring boot 이전 버전에서 jar 밖에 있는 application.properties파일은 jar 내부의 application-.properties파일을 오버라이드 할 수 없었다.
스프링 부트 2.4 에서는 외부 파일이 프로필 설정이든 아니든 언제나 패키지된 파일을 오버라이드한다. 자세한 내용은 깃헙 이슈 3845에 있다. 또한 update Documentation에서도 관련 내용을 확인할 수 있다.
Profile Specific Documents
만약 spring.profiles 속성을 사용하는 경우, 여러 개의 YAMFL 파일을 예로 들었을 때, spring.config.active.on-profile
로 migrate 할 수 있다. 이전의 속성처럼 프로필 목록을 구체화하고 properties에 적용할 프로필을 활성화 할 수 있다. “prod” 와 “cloud” 처럼 프로필 표현을 할 수 있다.
만약 다음과 같은 application.yaml이 있다면
spring:
profiles: "prod"
secret: "production-password"
아래와 같이 migrate할 수 있다.
spring:
config:
active:
on-profile: "prod"
secret: 'production-password"
Profile Activation
spring.profiles.active
속성은 specific 프로필을 활성화 하기 위해서 사용된다.
예를 들어 명령어로 실행하고자 하면
java -jar myapp.jar --spring.profiles.active=prod
그리고 application.properties
나 application.yaml
에서 이를 설정할 수 있지만, 스프링 부트 2.4 부터는 profile-specific 문서에 속성을 설정할 수 없다. 다른 말로 더이상 spring.config.active.on-profile
속성을 갖는 문서와 결합이 불가능함을 말한다.
마찬가지로 spring.profiles.include
속성을 사용할 수는 있으나 profile-specific 문서가 아닌 경우에만 가능하다.
예를 들었을 때 두 번째 문서는 유효하지 않다.
# this document is valid
spring:
profiles:
active: "prod"
# this document is invalid
spring:
config:
activate:
on-profile: "prod"
profiles:
include: "metrics"
💡 이는 on-profile
조건이 오직 한 번만 evaluate 되기 때문이다. 이런 제한이 없으면 spring.config.active.on-profile 표현이 evaluate 될 때 마다 다른 결과를 내놓을 수 있게 된다.
Profile groups
스프링 부트 2.3 이전 버전에서 활성하는 프로필을 늘리기 위해 spring.profiles
와 spring.profiles.include
를 결합하곤 했는데,
spring.profiles: "debug"
spring.profiles.include: "debugdb, debugcloud"
이는 java -jar —spring.profiles.active=debug
를 실행하고 자동으로 debug, debugdb와 debugcloud 프로필을 활성화 했다.
만약 2.4 이후 버전으로 migrate 할 경우 기대되는 것은 아래와 같다.
spring:
config:
active:
on-profile: "debug"
profiles:
include :"debugdb, debugcloud"
근데 위에서 말한 것 처럼 spring.profiles.include
를 profile-specific 문서에서 함께 사용할 수 없다.
하지만 이런 use-case는 꽤 흔하기 때문에 이를 사용하기 위해 다른 방법을 제공하기로 했다. 스프링 부트 2.4에서는 “profile groups” 기능을 사용할 수 있다.
프로필 그룹의 의미:
프로필 x가 표시되면 프로필 y와 z도 활성화
프로필 그룹은 spring.profiles.group.<source>
속성에서 정의할 수 있다.
spring:
profiles:
group:
"debug" : "debugdb, debugcloud"
💡 `[spring.profile.group](http://spring.profile.group)\`%5C%60) 속성은 profile-specific 문서에서 쓰일 수 없다. 또한 `spring.config.activate.on-profile` 속성을 가진 문서에서도 사용할 수 없다.
Migration Example
이제 스프링 부트 2.3 버전에서 migration을 해보자. jar 내에 application.yaml 이라는 문서가 아래와 같이 있다고 해보자:
spring.application.name: "customers"
---
spring.profiles: "production"
spring.profiles.include: "mysql, rabbitmq"
---
spring:
profiles: "mysql"
datasource:
url: "jdbc:mysql://localhost/test"
username: "dbuser"
password: "dbpass"
---
spring:
profiles: "rabbitmq"
rabbitmq:
host: "localhost"
port: 5672
username: "admin"
password: "secret"
그리고 어플리케이션이 배포될 때 jar 옆에 포함되는 application-prod.yaml 파일이 있다고 해보자:
spring:
datasource:
username: "proddbuser"
password: "proddbpass"
rabbitmq:
username: "prodadmin"
password: "proddsecret"
어플리케이션 migration을 위해서는 application.yaml 을 새로운 속성 이름을 사용해서 업데이트 해야 한다.
spring.application.name: "customers"
---
spring:
config:
activate:
on-profile: "production"
profiles:
include: "mysql, rabbitmq"
---
spring:
config:
activate:
on-profile: "mysql"
datasource:
url: "jdbc:mysql://localhost/test"
username: "dbuser"
password: "dbpass"
---
spring:
config:
activate:
on-profile: "rabbitmq"
rabbitmq:
host: "localhost"
port: 5672
username: "admin"
password: "secret"
이제 spring.profiles.include
를 프로필 그룹을 사용해서 migration 한다.
(profile-specific에서는 spring.profiles.include를 쓸 수 없으니까)
spring:
application:
name: "customers"
profiles:
group:
"production": "mysql,rabbitmq"
---
spring:
config:
activate:
on-profile: "mysql"
datasource:
url: "jdbc:mysql://localhost/test"
username: "dbuser"
password: "dbpass"
---
spring:
config:
activate:
on-profile: "rabbitmq"
rabbitmq:
host: "localhost"
port: 5672
username: "admin"
password: "secret"
이제 migration 끝.
별개로 DB를 나눠서 사용하는 경우
spring:
profiles:
active:
- develop
---
spring:
config:
activate:
on-profile:
- develop
---
spring:
config:
activate:
on-profile:
- release
같은 형태로 작성할 수 있다.