세상에 나쁜 코드는 없다

[앱프로젝트:동아리방] 개발 노트 2. 개발환경과 운영환경 분리하기 본문

웹개발/백엔드

[앱프로젝트:동아리방] 개발 노트 2. 개발환경과 운영환경 분리하기

Beomseok Seo 2023. 1. 10. 23:29

application.yml 파일 분리하기

Spring Boot에서는 application-{profile}.yml 와같은 포맷으로 application.yml 파일을 분리하여 빌드 시 특정 profile에 대한 파일이 적용되게 할 수 있다.

  • 각각의 profile에는 별도의 포트를 지정해 주어서 추후에 한 서버에서 dev와 prod 프로그램이 동시에 실행될 수 있게 했다.
  • dev 환경에서는 더미데이터가 존재하는 개발용 DB와 연결되게 하였고, prod에는 실제 운영할때 사용할 DB에 연결하게 하였다.
  • 각각의 yml 파일에는 env라는 변수를 놓고 local, dev, prod라는 값을 주어 프로그램 내에서 환경에 대한 값을 사용할 수 있게 하였다.

이후 build.gradle 에 다음과 같은 코드를 통해 gradle 이 resources 파일을 찾을 수 있게 해야한다

jar 파일 실행 시 다음과 같은 코드를 입력하여서 profile을 설정할 수 있다.

java -jar "-Dspring.profiles.active={profile}" @@@.jar

java "-Dspring.profiles.active=prod" -jar .\build\libs\dongaribang.jar 를 실행하면 application-prod.yml 에 있는 포트로 spring 이 실행되고, prod DB에 연결된다. 또한 env 변수를 출력했을 때 prod가 정상적으로 출력됨을 확인할 수 있다.

만약 “-Dspring…” 의 조건을 주지 않는다면 기본값인 application.yml 이 적용되어 실행된다.

Ubuntu 서버에서..

Ubuntu 서버에서는 git의 prod branch와 dev branch를 다른 디렉토리에서 각각 유지하고 빌드하여 prod 환경과 dev 환경이 서로 다른 jar 파일을 기반으로 실행되게 하였다.

하지만 여기서 문제가 발생했는데, 재배포시 기존의 task 를 kill할때 task PID를 찾는 기준이 jar 파일명이었기 때문에 prod 의 jar 파일과 dev jar 파일이 구분이 되지 않는다는 점이었다. 따라서 각각의 jar파일이 서로다른 이름을 갖게 해줄 필요가 있었다.

gradle build 시 jar 파일명을 변경하기 위해서는 build.gradle 에 bootJar에 다음과 같은 코드를 작성해주면 된다.

bootJar{
archivesBaseName = 'basename'
archiveFileName = 'filename.jar'
archiveVersion = "version"
}

FileName이 build 시 변수에 따라 다른 값을 갖기를 원하므로 build.gradle 내에서 사용하는 전역변수를 두었다.

#build.gradle

ext.profile = (!project.hasProperty('profile') || !profile) ? 'local' : profile


bootJar {
	archivesBaseName = 'dongaribang'
    archiveFileName="dongaribang_${profile}.jar"
    archiveVersion = "0.0.1"
}

build 시 profile이라는 property의 값이 존재하지 않는다면 ‘local’ , 존재한다면 전달한 값을 갖는 변수 ext.profile을 만들었다.

이제 build 시 property에 따라서 다른 이름의 jar 파일이 생성되므로 ubuntu 에서 서로다른 이름의 task 가 실행될 수 있다.

build시 property를 넣기 위해서는 ./gradlew build -Pprofile=prod 와 같은 방식으로 작성해주면 된다.

물론 다른 방식으로 PID 를 인식한다면 이런 과정을 거치지 않아도 되는데, 이에 대해서는 더 알아봐야할 것 같다.


Uploaded by N2T