Programming-[Backend]/Java

gradle -Build Tools 설정, 서브 모듈, task에 대한 기본적 이해

컴퓨터 탐험가 찰리 2024. 6. 2. 18:42
728x90
반응형

 

 

자바 - 스프링부트 프로젝트에서 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 클래스로 실행되는 형태

각 서브모듈이 ...Application에서 정의된 main 클래스로 실행되는 형태

 

728x90
반응형