Spring Boot로 백엔드 개발을 하면 빌드 도구로 Gradle을 많이 사용하고 gradle.properties라는 파일은 많이 보셨을 것 같습니다.
회사나 프로젝트마다 라이브러리 또는 넥서스를 관리하는 방법은 전부 다릅니다.
해당 게시물에서는 넥서스가 개발, 테스트, 운영으로 각각 나눠져 있고 ip나 도메인이 다를 때 설정 파일을 환경별로 나눠서 사용하는 방법을 다루려고 합니다.
./gradlew 명령어로 빌드 수행 시에 프로젝트 설정 변수인 -Penv를 받아서 gradle-${env}.properties로 각 환경별 넥서스 정보를 불러오는 방법을 정리했습니다.
하단 목록은 환경별로 만들 gradle 설정 파일 이름과 환경별로 테스트에 사용하기 위한 넥서스 포트 번호입니다.
환경별 | 환경별(영어) | 환경별 설정파일 이름 | 환경별 넥서스 port |
개발 | dev | gradle-dev.properties | localhost:8081 |
테스트 | test | gradle-test.properties | localhost:8082 |
운영 | prod | gradle-prod.properties | localhost:8083 |
테스트를 위해서 하나의 넥서스만 Docker를 통해서 띄우고 개발 환경의 넥서스라 가정을 하고 ./gradlew build -Penv=dev 명령어 실행 시 프로젝트 라이브러리를 가지고 오는지 확인하겠습니다.
개발 (8081) 넥서스만 실제 기동을 하고 테스트(8082)와 운영(8083) 넥서스는 기동하지 않고 빌드 명령어 실행 시 실제 접근하는 넥서스 port가 다르게 나오는지만 확인하겠습니다.
해당 게시물에서는 프로젝트 생성 및 Docker를 통해 넥서스를 띄우는 과정은 다루지 않겠습니다.
윈도우 환경에서 Docker로 nexus를 설치하고 실행하는 과정은 하단 게시물을 참고해 주시면 감사하겠습니다.
윈도우 Docker 환경 nexus 설치
Nexus란 Sonatype라는 회사에서 만들었으며 내부망에서 사설 레지스트리로 구성해서 사용할 수 있는 저장소이다. Nexus를 사용하는 이유는 자체적으로 개발한 라이브러리나 소프트웨어를 저장하고
co-deok.tistory.com
gradle.properties 환경별 파일 생성
gradle.properties 환경별 dev, test, prod 파일 생성을 하겠습니다.
초기 하단과 같은 일반적인 깡통 자바 프로젝트에서는 gradle.properties가 존재합니다.
환경별로 생성을 해야 하니 gradle.properties를 복사해서 dev, test, prod 3개를 만들어 줍니다.
기존 gradle.properties는 지워주고 나면 3개의 환경의 gradle-${env}.properties가 존재합니다.
gradle 설정 파일에 넥서스 url, username, password 설정
Gradle의 환경별 설정 파일(gradle-${env}.properties)에 넥서스 url, username, password를 설정해 보겠습니다.
미리 설치하고 실행한 넥서스의 url, username, password 설정 정보를 넣어줍니다.
gradle-dev.properties에는 localhost:8081로 넥서스를 설정하고
gradle-test.properties는 localhost:8082, gradle-prod.properties는 localhost:8083으로 설정하겠습니다.
gradle-dev.properties
Gradle 개발(dev) 환경 설정 파일입니다.
개발은 실제로 넥서스를 Docker로 기동을 했고 8081 포트를 사용했습니다.
nexusUrl=http://localhost:8081/repository/maven-public/
nexusUsername=admin
nexusPassword=hello1!
gradle-test.properties
Gradle 테스트(test) 환경 설정 파일은 8082 넥서스 포트를 설정해 주겠습니다.
test 넥서스는 따로 기동 하지 않았습니다.
gradle-prod.properties
Gradle 운영(prod) 환경 설정 파일은 8083 넥서스 포트를 설정해 주겠습니다.
prod 넥서스는 따로 기동 하지 않았습니다.
build.gradle repositories 넥서스 설정값 추가
repositories 스크립트에 gradle-${env}.properties에서 작성한 넥서스 설정값을 추가하겠습니다.
build.gradle에서 기존 mavenCentral()로 maven repository에서 가져오는 설정은 주석을 하고,
gradle-dev.properties에 설정한 nexusUrl, nexusUsername, nexusPassword를 작성해 줍니다.
repositories {
//mavenCentral()
maven {
url "${nexusUrl}"
credentials {
username = "${nexusUsername}"
password = "${nexusPassword}"
}
allowInsecureProtocol = true // http 가능 설정
}
}
build.gradle 환경별 설정파일 로드 스크립트 추가
build.gradle에 repositories 스크립트 상단에 프로젝트 설정 변수를 받아서 환경별로 gradle.properties 설정을 읽어오는 스크립트를 작성해 줍니다.
env라는 프로젝트 변수가 없으면 dev라는 값을 default로 설정을 해주고 gradle-dev.properties를 로드하게 설정했습니다.
gradle-${env}.properties가 존재하면 설정 파일을 로딩해서 속성들을 Gradle 프로젝트의 확장 프로퍼티(project.ext)에 추가했습니다.
하단과 같이 설정을 넣어주면 -Penv={dev | test | prod} 속성을 파라미터로 넘기면 환경에 맞게 설정 파일을 로드합니다.
// 현재 환경을 환경 변수나 시스템 속성으로 설정
def env = project.hasProperty('env') ? project.property('env') : 'dev'
// 환경별 properties 파일을 로드
def propertiesFile = file("gradle-${env}.properties")
// 파일이 존재하지 않으면 예외를 발생시켜 빌드를 중단
if (!propertiesFile.exists()) {
throw new GradleException("Properties file for '${env}' not found")
}
logger.lifecycle("Load Current env : ${env}")
// Properties 객체를 사용하여 파일을 로드
def properties = new Properties()
propertiesFile.withInputStream { stream ->
properties.load(stream)
}
// 로드한 각 속성을 project.ext에 추가
properties.each { key, value ->
project.ext.set(key, value)
}
넥서스 라이브러리 업로드 및 build.gradle 의존성 추가
Gradle build를 테스트하기 위해서 넥서스에 라이브러리를 업로드하고 build.gradle에 업로드한 poi의 의존성을 추가하겠습니다.
하나의 라이브러리를 개발(8081) 넥서스에 올리고 build 명령어 실행 시 정상적으로 가져와지는 테스트 하기 위해서 넥서스에는 poi라는 라이브러리를 upload 했습니다.
nexus에 라이브러리를 올렸으면 build.gradle의 dependencies에는 poi 라이브러리를 implementation 해줍니다.
dependencies {
implementation 'org.apache.poi:poi:5.3.0@jar'
}
Intellij Gradle refresh 수행 후 라이브러리 확인
dependencies를 추가하고 나면 우측 상단에 gradle refresh를 하라고 나옵니다.
gradle refresh를 누르게 되면 하단 좌측에 External Libraries에 poi가 생기게 됩니다.
정상적으로 refresh가 되면 poi 라이브러리가 정상적으로 가져와진 것을 볼 수 있습니다.
개발은 확인했으니 테스트와 운영은 실제 어떤 넥서스에 접근하는지 확인하게 위해서 git bash로 확인해 보겠습니다.
Gradle build 환경별(dev, test, prod) 실행
Git bash를 열고 프로젝트 경로로 이동합니다.
프로젝트 경로에서 ./gradlew build -Penv=dev를 실행하면 현재 로드된 env가 dev이고 정상적으로 BUILD SUCCESSFUL이 나온 것을 볼 수 있습니다.
이번에는 테스트와 운영을 실행해 보겠습니다.
./gradlew build -Penv=test 명령어로 테스트 환경 gradle-test.properties를 가져오게 실행하게 되면 test 인자가 로깅에 나오고 localhost:8082 포트로 poi 라이브러리를 가져오게 요청하는 것을 볼 수 있습니다.
현재 개발 넥서스(8081)만 띄워놨기에 테스트는 Connection refused로 잘 나오는 것을 볼 수 있습니다.
./gradlew build -Penv=prod 명령어로 운영 환경 gradle-prod.properties를 가져오게 실행하게 되면 prod 인자가 로깅에 나오고 localhost:8083 포트로 poi 라이브러리를 가져오게 요청하는 것을 볼 수 있습니다.
마찬가지로 Connection refused가 나오고 정상적으로 원하는 넥서스로 요청을 보내는 것을 확인할 수 있습니다.
정리
gradle-${env}.properties를 환경별로 만들고 원하는 넥서스에 접근해서 라이브러리를 가져왔습니다.
인터넷이 자유로운 곳에서는 mavenCentral()로 maven repository를 사용하면 되기에 관계가 없지만
사내 별도 넥서스 레포지토리가 환경별로 나눠져 있다면 사용할 수 있는 방법을 정리해 봤습니다.
더 좋은 방법이나 다른 방법도 있을 것 같지만 이런 방식으로 했구나 참고해 주시면 될 것 같습니다 :)
감사합니다.
참고
소스 코드는 하단 링크 참고해주시면 됩니다.
blog-code/gradle-env-properties at main · jaedeokhan/blog-code
블로그 소스 코드 정리. Contribute to jaedeokhan/blog-code development by creating an account on GitHub.
github.com
'Gradle' 카테고리의 다른 글
Gradle 데몬을 사용하지 않는 법 (1) | 2024.12.12 |
---|---|
Gradle copyDependencies task 생성 및 사용 (0) | 2024.04.27 |
Gradle Build Lifecycle (0) | 2024.04.27 |
Spring Boot + Gradle build.gradle local .jar 추가 (2) | 2024.01.03 |