멀티 모듈 탐험기 (2) - Gradle 톺아보기 for 멀티 모듈

suky·2024년 3월 16일
0

멀티 모듈 탐험기

목록 보기
2/4
post-thumbnail

안녕하세요~ 오늘도 멀티 모듈을 탐험하기 위해 돌아온 suky입니다~ 😎
멀티 모듈을 알기 전에 먼저 Gradle의 구조를 파악하여 동작 원리를 공부해보려고 하는데요.
GradleCore Concept를 공부하면서 Gradle이 어떤 구조로 이루어져있고, 어떻게 멀티 모듈을 빌드하는지에 대해 접근을 하려고 합니다.
영어로 된 문서라서 이해하기 쉽게 의역한 점이 있다는 점 양해부탁드려요~~ (잘못된 것은 피드백 주시면 즉각 반영하겠습니다 😊)

전체 구조

핵심 개념

GradleCore Concept는 다음과 같습니다. 이후 해당 명칭들은 핵심 개념이므로 한글로 번역을 하기 보다는 영어 그대로 사용하도록 하겠습니다~

  • Project: 응용 프로그램이나 라이브러리 같이 빌드할 수 있는 소프트웨어

    • Single Project: 하나의 루트 project만 포함
    • Multi Project: 하나의 루트 project와 여러 개의 하위 Project가 포함
  • Build Scripts: Project를 빌드하는데 필요한 단계를 설명. 각 Project는 하나 이상의 Build Script를 포함할 수 있음

  • Depencency Management: 프로젝트가 필요로 하는 외부 리소스를 선언하고 해석하기 위한 자동화 된 기술. 일반적으로 각각의 ProjectGradle이 빌드 중에 해석할 많은 외부 의존성을 포함.

  • Tasks: 코드 컴파일이나 테스트 실행과 같은 작업의 기본 단위. 각 프로젝트에는 Build Script 또는 Plugin 내에 정의된 하나 이상의 Task를 포함하고 있음

  • Plugins: PluginGradle의 기능을 확장하고, 선택적으로 ProjectTask를 제공하는데 사용.

프로젝트 구조

Gradle의 프로젝트의 구조는 다음과 같습니다.

project
├── gradle (1)              
│   ├── libs.versions.toml (2)
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew     (3)                         
├── gradlew.bat (3)                   
├── settings.gradle(.kts)  (4)               
├── subproject-a
│   ├── build.gradle(.kts) (5)            
│   └── src                (6)          
└── subproject-b
    ├── build.gradle(.kts) (5)         
    └── src                (6) 

(1) - Gradle Wrapper 파일이나 기타 파일 저장
(2) - Dependency Management를 위한 버전 카탈로그 (예시)
(3) - Gradle Wrapper 실행을 위한 스크립트
(4) - 루트 Project 이름과 하위 Project를 정의
(5) - subproject-asubproject-b 두 하위 ProjectBuild Script
(6) - Project의 소스 코드 혹은 추가 파일

앞선 핵심 개념에서 본 것처럼 하나의 Proeject는 하나 이상의 Build Script(build.gradle)을 포함하고 있는 것을 확인할 수 있네요.

Gradle Wrapper 톺아보기

공식 문서에서는 Gradle을 이용해서 빌드할 때는 Gradle Wrapper를 이용해서 빌드하는 것을 추천한다고 합니다.

Gradle Wrapper Script는 필요한 경우 선언된 버전의 Gradle을 다운로드하고 호출을 합니다.
Gradle Wrappergradlew(Linux, OSX)gradle.bat(Windows)으로 이용이 가능한데요. 다음과 같은 이점을 제공한다고 합니다.

  • 주어진 Gradle 버전에 맞게 프로젝트 표준화
  • 다른 사용자들에게 같은 Gradle 버전 제공
  • 다른 실행 환경(IDE, CI 서버, ...)에 같은 Gradle 버전 제공

Gradle Wrapper는 다음과 같이 실행할 수 있습니다.
해당 예시는 gradle.bat을 예시로 들었는데요. 만약 LinuxOSX 환경이신 경우에는 gradlew로 사용하시면 됩니다.

$ gradlew.bat build

Downloading https://services.gradle.org/distributions/gradle-5.0-all.zip
.....................................................................................
Unzipping C:\Documents and Settings\Claudia\.gradle\wrapper\dists\gradle-5.0-all\ac27o8rbd0ic8ih41or9l32mv\gradle-5.0-all.zip to C:\Documents and Settings\Claudia\.gradle\wrapper\dists\gradle-5.0-al\ac27o8rbd0ic8ih41or9l32mv
Set executable permissions for: C:\Documents and Settings\Claudia\.gradle\wrapper\dists\gradle-5.0-all\ac27o8rbd0ic8ih41or9l32mv\gradle-5.0\bin\gradle

BUILD SUCCESSFUL in 12s
1 actionable task: 1 executed

프로젝트 세팅하기

settings.gradle 파일은 모든 Gradle Project의 진입점이고, 해당 파일의 주요 목적은 빌드에 하위 Project를 포함시키는 것이라고 합니다.

앞선 프로젝트 구조에서 살펴보았다시피 Single Project 빌드에서는 해당 파일이 선택적이지만, Multi Project에서는 필수고, 모든 하위 Project를 포함해야합니다.

setting.gradleGroovy DSLKotlin DSL을 지원하는데요. 일반적으로 해당 파일은 Project의 루트 디렉토리에서 찾을 수 있습니다.

다음은 예시입니다.

rootProject.name = 'root-project'  // (1)

include('sub-project-a') // (2)
include('sub-project-b') // (2)
include('sub-project-c') // (2)

(1): Project의 이름. 하나의 빌드당 하나의 루트 Project가 존재

(2): 하위 Project를 추가. 하위 Project를 포함함으로써 Project의 구조를 정의함

위처럼 settings.gradle을 구성한다면 root-project라는 이름을 가진 루트 Project에서 3개의 하위 Project(sub-project-a, sub-project-b, sub-project-c)를 포함하여 빌드를 할 수 있게 됩니다.

이제 각 하위 Project마다 build.gradle 를 구성하면 멀티 모듈을 구성하기 위한 세팅은 끝났습니다!

마무리

이번 시간에는 멀티 모듈을 구성하기까지 필요한 Gradle의 배경지식을 알아보았습니다. 처음에 멀티 모듈을 도입하려면 아주 복잡한 테크닉이 필요할 것이라고 생각했는데, 공부하고 보니 단순명료한 Gradle의 철학에 감탄이 나옵니다. 다음 포스팅에서는 직접 멀티 모듈을 구성해보면서 그 철학을 체득해보도록 하겠습니다. 그럼 안뇽~ 😎

profile
도전하고 성장하는 개발자입니다 :)

0개의 댓글