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 이름을 적어주면 아래와 같이 설정값이 적용되어 실행되는 것을 확인할 수 있다.
'TIL' 카테고리의 다른 글
[Java] 향상된 try catch문: try-with-resources (0) | 2024.09.21 |
---|---|
프로메테우스란? (0) | 2023.03.01 |
[JPA] BaseTimeEntity @CreatedDate 오류 (0) | 2021.08.29 |
[Java] cron 시간 설정 시 에러 발생 (0) | 2021.06.02 |
[Java] List.sublist의 사용법과 주의할 점 (0) | 2021.05.31 |
댓글