Spring Boot 애플리케이션을 개발하다 보면 외부 설정 파일(application.yaml)을 관리하는 방법에 대해 고민하게 됩니다. 애플리케이션이 실행되는 환경에 따라서 달라지는 값들이 있습니다. 대표적으로 DBMS를 제공하는 서버의 IP, Port는 개발 환경과 운영 환경에서 각각 다른 값을 가집니다. 그래서 애플리케이션이 실행되는 환경에 따라서 다른 값을 외부에서 세팅해줄 방법이 필요합니다.
application properties
스프링 기반의 애플리케이션을 실행할 때 적용되는 설정들을 application properties 라고 합니다. 스프링은 기본적으로 실행 시점에 /src/main/resources
경로의 application.yaml(혹은 application.properties)
파일을 파싱하여 프로퍼티를 설정합니다. 스프링은 환경에 따라서 다른 설정 값을 적용해서 실행하는 기능을 제공합니다.
환경에 따른 설정 파일 분리
환경이 로컬(default), 개발(develop), 검증(stage), 운영(product) 으로 분리되어 있다면, 각 환경에서 DBMS 서버 IP가 다를 수 있습니다. 그러면 각 환경에서 jdbc url이 다르게 적용되어야 DBMS에 연결할 수 있습니다.
각 환경의 IP 대역이 모두 다르고 운영 환경에서는 username과 password가 다르다면 어떻게 해야 할까요?
단순하게 4 개의 yaml 파일 (application-local.yaml
, application-develop.yaml
, application-stage.yaml
, application.product.yaml
)을 생성하는 방법이 있습니다. 직관적이라는 장점이 있지만 여러 개의 파일을 관리해야 하고 같은 설정 값이 여러 파일에 중복되는 단점이 있습니다. 중복이 발생한다는 것은 수정할 때도 여러 곳을 수정해야 한다는 뜻입니다. 실수로 빠뜨리거나 잘못 수정할 경우 생각보다 큰 문제가 될 수 있습니다.
default 설정을 먼저 적용하고 active profile에 해당하는 설정을 overriding 하는 스프링의 동작 방식을 이해할 수 있다면 default 설정 파일로 application.yaml
을 만들어서 중복되는 설정을 줄일 수 있습니다.
스프링은 애플리케이션을 실행할 때 active profile을 지정할 수 있습니다. active profile은 애플리케이션이 실행될 때 어떤 부분의 설정을 적용할지 결정합니다. 애플리케이션을 실행할 때 spring.profiles.active
프로퍼티를 설정하여 지정할 수 있습니다. spring.profiles.active=develop
으로 실행하면 application.yaml
설정에 application-develop.yaml
설정을 오버라이딩해서 적용합니다.
하나로 통합된 설정 파일(application.yaml)
아래와 같이 설정 파일을 하나로 합치는 방법을 이해한다면 단 하나의 yaml 파일로 4가지 환경에 대한 설정을 관리할 수 있습니다.
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/testdb
username: root
password: 1234
---
spring:
config.activate.on-profile: develop
datasource:
url: jdbc:mysql://192.168.0.9:3306/testdb
---
spring:
config.activate.on-profile: stage
datasource:
url: jdbc:mysql://172.16.0.5:3306/testdb
---
spring:
config.activate.on-profile: product
datasource:
url: jdbc:mysql://10.0.0.7:3306/testdb
username: admin
password: 9876
가장 위에 있는 설정이 default 로 적용되며 ---
으로 분리된 부분을 선택적으로 오버라이딩하여 적용합니다. 마찬가지로 애플리케이션이 실행될 때 어떤 부분의 설정을 적용할지 결정하는 것은 spring.profiles.active
입니다.
spring.profiles.active=develop
으로 애플리케이션을 실행할 경우 가장 위에 있는 설정 값에 spring.config.activate.on-profile=develop
으로 설정된 yaml을 오버라이딩 하게 됩니다.