티스토리 뷰

개인 공부용으로 번역한거라 오역이 있을 수 있고 생략된 내용이 있습니다~

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.propertiesapplication.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.profilesspring.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

같은 형태로 작성할 수 있다.

728x90
댓글
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함