사이드 프로젝트를 진행하는데 갑자기 문득 그런 생각이 들었다. 내가 만든 프로젝트를 AWS 아니면 개인 서버를 구축하여 실행시키는 등 다양한 방법으로 운영하게 될 텐데 문제는 운영환경마다 properties 파일의 내용은 전부 다르고 매번 배포할 때마다 하나하나 값을 바꾼다면 분명 실수가 생길 것이다. 그렇다면 미리 실행환경을 세팅해 놓고 간단한 설정만 바꿔서 배포하면 좋지 않을까 생각해서 작성하기로 생각했다.
전 직장에서는 배포 환경을 나누어 관리하고 있었는데 용도에 따라 local, Dev, prod 등의 properties 파일이 존재했고 자세히는 기억이 나진 않지만, properties 파일을 용도별로 만들고 build할 때는 파일의 확장자를 고쳐서 실행환경을 분리한 기억이 난다.
예전과 지금의 다른점은 전 작장에서는 전자정부프레임워크를 사용했고 현재는 Visual Studio Code를 사용한다는 점이 다르다. 또한 Spring Boot버전도 3.3.7 버전을 사용하고 있다.
자료조사결과 실행환경잡는 방식에는 명확한 표준이 없었고 다들 자신이 사용했을 때 본인이 많이 사용하는 방법을 게시글로 작성한거 같았다. 하지만 방법이 Spring Boot 버전에 따라 다르게 잡아야한다는 것을 알았다, 정확히는 Spring Boot 버전이 증가하면서 기존의 방식에 새로운 방식이 추가 되었을 뿐이었다.
개발자 별로 실행환경을 세팅하는 것이 전부 달랐다.
정말 다양했다, 나는 Spring Boot버전이 2.4.0 이상이기에 하나의 properties파일에 세팅을 하고 VScode의 launch.json 파일을 수정하는 방식으로 하였다.
1번 방식 (기본 resource폴더에 다음과 같이 설정파일을 관리)
2번 방식 (기본 resource폴더에 다음과 같이 폴더를 추가로 만들어 설정파일을 관리)
2번 방법은 하나하나 설정파일을 만들어 환경을 다르게 세팅한 후
// profile의 기본값 local로 설정
ext.profile = (!project.hasProperty('profile') || !profile) ? 'local' : profile
// 리소스 디렉토리 추가
sourceSets {
main {
resources {
srcDirs "src/main/resources/${profile}"
}
}
}
마지막으로 build.gradle에 다음과 같은 설정을 추가하고
이클립스 혹은 인텔리제이 에서 profile의 기본 값을 설정하여 실행환경 분리를 해주었다.
spring boot 2.4.0버전 이후로 properties 파일에
#---
를 추가하여 환경이 분리가 되도록 기능이 추가 되었다.
application.properties
# 공통 설정
#---
spring.profiles.active=local
# local환경 설정
#---
spring.profiles.active=dev
# dev환경 설정
#---
spring.profiles.active=prod
# 운영환경 설정
위와 같은 방식으로 먼저 #---
으로 구분을 지은뒤 spring.profiles.active
설정에 값을 넣어 구분을 지었다, 추가적으로 공통되는 설정은 위에 입력하는 것이 좋다.
VScode는 이클립스나 인텔리제이처럼 UI로 profile설정을 바꾸는 것을 찾을 수 없었다. 방법을 찾던 중 VScode는 launch.json 파일에서 arg설정을 해주면 된다고 한다. 참고로 launch.json파일은 .vscode폴더 안에 존재한다.
launch.json
{
"version": "0.0.2",
"configurations": [
{
"type": "java",
"name": "",
"request": "launch",
"cwd": "",
"mainClass": "",
"projectName": "",
"args": "--spring.profiles.active=local",
"envFile": "${workspaceFolder}/.env"
}
]
}
위와 같이 args에 다음과 같이 spring.profiles.active=local
로 설정하면 application.properties파일에서 local세팅으로 프로젝트를 build 및 실행이 된다.
local환경
dev환경
위의 두 이미지처럼 프로젝트를 실행시키면 profile이 변경되는 것을 확인할 수 있다.
혹시 몰라서 build도 해보고 jar파일의 properties파일을 확인해본 결과 문제없이 설정 되었다.
개인적으로 나는 사이드 프로젝트를 만들 때 VScode를 많이 사용했기에 다른 방식에 비해 편하게 느껴졌다, 또한 수정해야 할 파일이 적은 것도 이유 중의 하나이다, 다른 방식은 여러 파일을 추가하고 gradle파일 수정 및 기본값을 지정해야 하지만 내가 정한 방식은 properties와 launch.json 두 개의 파일만 수정함으로써 같은 동작이 된다.
https://velog.io/@haerong22/Spring-배포-환경-별로-설정파일-분리하기feat.-gradle
https://lejewk.github.io/springboot-gradle-spring-profiles-active/
https://cordingmonster.tistory.com/240
https://lordofkangs.tistory.com/320
(항상 감사합니다.)