catsridingCATSRIDING|OCEANWAVES
Dev

application.yml 파일 하나로 Spring Profiles 관리하기

jynn@catsriding.com
Oct 31, 2023
Published byJynn
999
application.yml 파일 하나로 Spring Profiles 관리하기

Configuration Multiple Spring Profiles Inside a Single Yaml

개발, 테스트, 운영 환경에서의 구성 관리는 소프트웨어 개발에서 중대한 과제 중 하나입니다. Spring Framework는 이러한 환경별 구성을 용이하게 관리할 수 있는 다양한 옵션을 제공합니다.

Multiple Yaml Files

전통적으로 각 환경에 맞는 별도의 파일 application-{PROFILE}.yml을 사용하는 방식이 많이 채택되었습니다. 이 접근법은 각 환경의 요구사항에 따라 설정을 구분할 수 있게 해주며, 각 파일을 통해 설정의 독립성을 확보하고 보안을 강화할 수 있습니다.

  • application-test.yml: 테스트 환경에서는 주로 로컬 개발 중 발생할 수 있는 문제들을 식별하기 위해 상세한 로깅과 테스트 전용 데이터베이스 설정이 포함됩니다. 이러한 설정은 오류 추적과 빠른 문제 해결을 돕기 위해 최적화되어 있습니다.
  • application-dev.yml: 개발 서버는 개발 중인 기능들이 다른 작업과 통합되는 과정에서 신속하게 변경 사항을 반영할 수 있도록 설계되어 있습니다. 높은 로깅 레벨을 통해 개발자는 문제를 쉽게 진단하고 해결할 수 있습니다.
  • application-prod.yml: 운영 서버는 실제 사용 환경에 적합하도록 성능 최적화와 보안을 강화한 설정을 제공합니다. 로깅은 필수적인 정보만 기록하도록 최소화하여, 시스템의 성능 저하를 방지하고 운영 효율성을 유지합니다.

예를 들어, 개발 서버의 application-dev.yml 설정은 다음과 같이 구성됩니다:

application-dev.yml
spring:
  profiles:
    active: dev

  datasource:
    jdbc-url: {DEV_DATASOURCE_URL}
    username: {DEV_DATASOURCE_USERNAME}
    password: {DEV_DATASOURCE_PASSWORD}

logging:
  level:
    org:
      hibernate:
        SQL: debug
        type:
          descriptor:
            sql: trace
...

운영 서버의 application-prod.yml 설정은 성능 최적화와 보안을 중심으로 구성됩니다:

application-prod.yml
spring:
  profiles:
    active: prod

  datasource:
    jdbc-url: {PROD_DATASOURCE_URL}
    username: {PROD_DATASOURCE_USERNAME}
    password: {PROD_DATASOURCE_PASSWORD}

logging:
  level:
    org:
      hibernate:
        SQL: info
        type:
          descriptor:
            sql: info
...

이와 같이 환경별로 파일을 분리하여 관리함으로써, 각 환경에 최적화된 설정을 유지하고 관리의 복잡성을 줄이며, 필요한 정보만 노출시키는 것이 가능합니다. 이러한 접근은 특히 대규모 시스템이나 민감한 정보를 다루는 환경에서 효과적입니다.

Single Yaml File

최근에는 모든 설정을 하나의 application.yml 파일로 통합하여 관리하는 방식이 점차 선호되고 있습니다. 이 접근 방식은 파일의 중복을 줄이고 중앙 집중식 관리를 가능하게 하여, 전체적인 설정 구조를 간소화하고 오류 가능성을 감소시킵니다.

application.yml
spring:
  profiles:
    active: test

  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQLDialect
    open-in-view: false
    generate-ddl: false
    properties:
      hibernate:
        default_batch_fetch_size: 1000
        format_sql: true
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

  devtools:
    add-properties: false

  datasource:
    jdbc-url: {DEV_DATASOURCE_URL}
    username: {DEV_DATASOURCE_USERNAME}
    password: {DEV_DATASOURCE_PASSWORD}

logging:
  level:
    org:
      hibernate:
        SQL: debug
        type:
          descriptor:
            sql: trace

jwt:
  issuer: {JWT_ISSUER}
  expiresAccessToken: {JWT_ACCESS_TOKEN_EXPIRED_IN}
  expiresRefreshToken: {JWT_REFRESH_TOKEN_EXPIRED_IN}

---
##################
###   🛸 DEV   ###
##################
spring:
  config:
    activate:
      on-profile: dev

  datasource:
    jdbc-url: {DEV_DATASOURCE_URL}
    username: {DEV_DATASOURCE_USERNAME}
    password: {DEV_DATASOURCE_PASSWORD}

logging:
  level:
    org:
      hibernate:
        SQL: debug
        type:
          descriptor:
            sql: trace

---
###################
###   💎 PROD   ###
###################
spring:
  config:
    activate:
      on-profile: prod

  datasource:
    jdbc-url: {PROD_DATASOURCE_URL}
    username: {PROD_DATASOURCE_USERNAME}
    password: {PROD_DATASOURCE_PASSWORD}

logging:
  level:
    org:
      hibernate:
        SQL: info
        type:
          descriptor:
            sql: info

---

하나의 application.yml 파일에서 여러 Spring 프로파일을 효과적으로 관리하는 방법은 다음과 같습니다:

  • 프로파일 구분: 각 프로파일은 문서 내에서 ---로 시작되는 별도의 섹션을 통해 명확하게 구분됩니다. spring.config.activate.on-profile 속성을 통해 각 섹션마다 특정 프로파일을 활성화할 수 있습니다.
  • 공통 설정: 파일의 최상단에 위치한 설정은 모든 프로파일에 기본적으로 적용됩니다. 특정 프로파일에서 이 공통 설정을 재정의함으로써 변경사항을 적용할 수 있습니다. 예를 들어, 위 구성에서 하이버네이트 로깅 레벨은 기본적으로 debug로 설정되어 있지만, 운영 환경 프로파일에서는 시스템 부하를 고려하여 info 레벨로 조정합니다.

이러한 구성 방식은 파일 관리를 단순화하고, 프로젝트의 구성을 한눈에 파악할 수 있게 합니다. 프로파일 별로 파일을 나누는 전통적인 방법과 비교할 때, 중복되는 설정을 제거하고 중앙 집중식으로 관리함으로써 오류 가능성을 줄이고, 변경 사항을 신속하게 적용할 수 있다는 장점이 있습니다.

그러나 각 환경의 구성을 더욱 명확하게 구분하고자 할 때는 각각의 파일을 유지하는 것이 유리할 수 있습니다. 결국 선택은 프로젝트의 특정 요구사항과 팀의 선호에 따라 달라질 수 있습니다. 이 접근법은 유연성과 효율성을 동시에 고려하여 선택해야 할 부분입니다.

  • Spring
  • Environment