자바 - 스프링부트 프로젝트에서 gradle을 이용하여 종속성 관리를 많이한다. 환경 설정 셋업이라 주니어 개발자로써 잘 모르는 내용이 많았는데, 대략적으로라도 이해한 내용을 정리해놓는다.
아래 gradle 공식 사이트에서 docs - running gradle builds - Tutorial 부분을 20~30분만 읽어봐도 대략적으로 이해할 수 있다.
ref) https://docs.gradle.org/current/userguide/part1_gradle_init.html
1. build
자바- 스프링 계열에서 프로젝트 build를 하는 것은 실행가능한 .jar 파일을 만드는 과정이다. 직접 작성하는 .java 파일들을 JVM이 해석할 수 있는 .class 파일로 변환하고 메인 함수의 위치는 어디인지(MANIFEST, META-INF 파일) 등의 정보들을 JVM의 인터페이스에 맞게 설정해준다.
그리고 gradle은 이 build시 여러 가지 task들을 수행한다. 아래에서보면 jar, bootJar가 있는데 jar는 작성된 클래스 및 메타 정보만 포함하는 JAR 파일을 생성하는 task이고, bootJar는 다른 의존하는 라이브러리 및 메인 클래스를 포함하여 'java -jar'로 실행할 수 있는 실행 가능한 파일을 만드는 작업까지 포함하는 task이다.
이외에도 classes, test 등 여러 가지 작업을 수행한다. build를 실제로 해보면 콘솔창에 실행되는 task 목록들을 확인할 수 있다.
2. Build Tools 설정
intellij와 관련된 부분이다. 환경 설정에서 Build, Execution, Deployment / Gradle에 들어가보면 아래 사진처럼 Build and run using, Run tests using을 할 도구들을 설정할 수 있다. intellij로 설정하는 것이 빠르다고는 한다. 그러나 여기서는 default로 설정된 gradle을 기준으로 살펴본다.
build 작업을 수행하면 모듈 아래에 빨간색으로 생긴 build 디렉토리가 생긴다. 이 파일이 gradle이 compile 작업을 수행하고 난 결과물을 저장하는 위치이다. 터미널에서 아래 명령어를 실행해보면 된다.(프로젝트의 루트 디렉토리 위치에서 실행)
./gradlew build
여기에 해당 프로젝트에서 참조하는 라이브러리 정보 등이 생긴다. 서버 실행 시 이 빌드된 파일들을 참고하여 실행이 되는것이다.
그런데 위에서 살펴본 Build and Run 설정을 intelliJ로 변경하면 build가 아니라 out 이라는 폴더가 추가로 생긴다. 그리고 docker나 타 환경에서 참조하는 위치를 out으로 제대로 설정해주지 않으면 에러가 나는 경우가 있을 수 있다. 그래서 우선 gradle로 build tools를 설정해주었다. 정확한 원인이나 설정 방식은 좀 더 자세히 알아봐야할 것 같다.
3. 서브 모듈
프로젝트를 멀티 모듈로 구성하는 방식으로, 여러 서브모듈로 구성할 수 있다. 각 서브 모듈별로 서버가 뜨게 한다면 MSA(Micro Service Architecture)가 된다. 이를 위해서 아래 사진과 같이 프로젝트의 루트 디렉토리에 있는 build.gradle에서 하위 서브 프로젝트들과의 관계를 정의해준다.
서브 모듈인 A-server, B-server가 server-common이라는 모듈을 참조하도록 한다. 이러면 server-common에 정의된 모든 파일과 라이브러리 의존성을 A-server, B-server가 따르게 된다. 만약 server-common에 어떤 클래스 파일을 만들거나, server-common의 build.gradle에서 의존하는 라이브러리를 추가하는 등의 변경 사항이 생기면 A-server, B-server도 이런 변경사항을 따르게 되는 것이다.
project(':A-server') {
dependencies {
api project(':server-common')
testImplementation(testFixtures(project(':server-common')))
}
}
project(':B-server') {
dependencies {
api project(':server-common')
testImplementation(testFixtures(project(':server-common')))
}
}
allprojects, subprojects
allprojects와 subprojects를 프로젝트 루트 디렉토리에서 정의하여 공통 또는 각 모듈에서 사용할 옵션들을 설정할 수 있다.
allprojects {
repositories {
google()
mavenCentral()
}
}
subprojects {
group = 'com.yourPackageName'
version = 'latest'
... 중략
repositories {
google()
mavenCentral()
}
// 공통 관리 종속성
dependencies {
implementation 'yourLibraryName'
}
...
}
각 모듈에서의 build.gradle
각 모듈에서의 build.gradle에는 공통으로 필요한 종속성이나 설정 외에 정말 각 모듈에서 필요한 설정 내용을 적어주면 된다. 여기서는 각 모듈이 서버로 실행될 수 있도록, 실행가능한 빌드 파일을 구성하기 위해 bootJar가 수행되도록 해주었다.
tasks.jar {
enabled = false
}
tasks.bootJar {
enabled = true
}
각 서브모듈이 ...Application에서 정의된 main 클래스로 실행되는 형태
'Programming-[Backend] > Java' 카테고리의 다른 글
자바 기초 강의 정리 - 3. 멀티태스킹(쓰레드) - 1: Thread, Runnable, Group, Daemon (0) | 2024.06.08 |
---|---|
자바 기초 강의 정리 - 2. 컬렉션, 함수형 인터페이스, 에러와 예외 (0) | 2024.06.06 |
자바 기초 강의 정리 - 1. 기초 ~ 함수, 제너릭까지 (0) | 2024.05.26 |
자바 linter, 포매팅 처리 : spotless, googlejavaformat, commit시 자동 적용 (0) | 2024.05.26 |
[경험 요약] 자바 테스트 객체 자동으로 만들기: Instancio 라이브러리 (0) | 2024.05.20 |