본문 바로가기
TIL

[Java] Spring 다중 profile 설정하기

by 긍고 2021. 6. 9.
반응형

Spring 프로젝트를 진행하다보면 로컬, 개발, 운영 환경에서 서로 다른 설정값을 넘겨줘야 하는 경우가 있다. 로컬, 개발 환경에서의 DB와 운영 환경에서의 DB를 분리한다던지, 과금이 필요한 외부 api를 사용하는 경우 로컬 환경에서는 더미 api로 요청을 보내는 등의 경우가 그 예이다.

Spring을 이용해서 프로젝트를 진행할 경우 application.yml이라는 파일을 통해 설정값을 스프링 프로젝트에 주입해줄 수 있으며 환경별로 다른 값을 넘겨줄 수 있다. 다음은 로컬, 개발, 운영 환경에 서로 다른 DB 커넥션 정보를 넘겨주는 application.yml 파일의 예이다.

server:
  port: 2580
  error:
    whitelabel:
      enabled: false
  servlet:
    encoding:
      charset: UTF-8
      enabled: true
      force: true
  tomcat:
    uri-encoding: UTF-8

---
spring:
  profiles:
    group:
      "localEnv": "common, local"
---
spring:
  profiles:
    group:
      "devEnv": "common, dev"
---
spring:
  profiles:
    group:
      "realEnv": "common, real"

---
spring:
  config:
    activate:
      on-profile: "common"

  datasource:
    hikari:
      driver-class-name: com.mysql.cj.jdbc.Driver
      connection-timeout: 300000
      pool-name: TEST_DB
      maximum-pool-size: 10

---
spring:
  config:
    activate:
      on-profile: "local"
  datasource:
    url: jdbc:mysql://localhost:3306/test_dev?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    username: root
    password: 'password'
---
spring:
  config:
    activate:
      on-profile: "dev"
  datasource:
    url: jdbc:mysql://test-dev.csjdksn1as.ap-northeast-2.rds.amazonaws.com:3306/test?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul
    username: testDev
    password: dev23
---
spring:
  config:
    activate:
      on-profile: "real"
  datasource:
    url: jdbc:mysql://test.casdf1bj4las.ap-northeast-2.rds.amazonaws.com:3306/test?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul
    username: testReal
    password: real12!

공통값

서버 정보는 로컬, 개발, 운영 모든 환경을 통틀어 공통으로 적용되며, 그 외에 추가로 세 환경 모두 적용될 환경 정보는 common이라는 이름을 주어 설정을 할 수 있다.

---
spring:
  config:
    activate:
      on-profile: "common"

  datasource:
    hikari:
      driver-class-name: com.mysql.cj.jdbc.Driver
      connection-timeout: 300000
      pool-name: TEST_DB
      maximum-pool-size: 10

개별 설정값

앞서 설정했던 공통으로 적용될 설정값 외에 각 환경별로 설정할 값을 spring.config.activate.on-profile에 이름을 주어 설정해줄 수 있다. 기존에는 spring.profile에 이름을 설정해 주었으나 스프링 부트 2.4 버전부터는 deprecated 되어 사용할 수 없으므로 spring.config.activate.on-profile을 사용해야 한다.

또한 한 yml 파일 내에는 기본적으로 spring 키워드가 한 번 밖에 사용되지 못한다. 따라서 추가적으로 설정해 주려면 - 3개를 써서 구분을 해주어야 한다.

---
spring:
  config:
    activate:
      on-profile: "local"
  datasource:
    url: jdbc:mysql://localhost:3306/test_dev?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    username: root
    password: 'password'
---
spring:
  config:
    activate:
      on-profile: "dev"
  datasource:
    url: jdbc:mysql://test-dev.csjdksn1as.ap-northeast-2.rds.amazonaws.com:3306/test?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul
    username: testDev
    password: dev23
---
spring:
  config:
    activate:
      on-profile: "real"
  datasource:
    url: jdbc:mysql://test.casdf1bj4las.ap-northeast-2.rds.amazonaws.com:3306/test?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul
    username: testReal
    password: real12!

실행 환경별 적용될 설정값 선언

로컬, 개발, 운영 환경을 각각 localEnv, devEnv, realEnv라는 이름으로 설정을 해 주었으며 spring.profiles.group에 해당 환경 이름을 할당해 주었다. 이렇게 설정한 뒤 Java 빌드 시 옵션으로 해당 이름을 주거나 IntelliJ를 사용시 Edit Configuration을 통해 쉽게 설정을 적용해서 실행할 수 있다.

---
spring:
  profiles:
    group:
      "localEnv": "common, local"
---
spring:
  profiles:
    group:
      "devEnv": "common, dev"
---
spring:
  profiles:
    group:
      "realEnv": "common, real"

설정값 적용 빌드 or 실행

자바 빌드 시

java -jar test.jar --spring.profiles.active=devEnv

intelliJ 사용 시

 


위와 같이 Active Profiles에 적용하고자 하는 group 이름을 적어주면 아래와 같이 설정값이 적용되어 실행되는 것을 확인할 수 있다.

댓글