안녕하세요~ 오늘도 멀티 모듈을 탐험하기 위해 돌아온 suky입니다~ 😎
멀티 모듈을 알기 전에 먼저 Gradle의 구조를 파악하여 동작 원리를 공부해보려고 하는데요.
Gradle의 Core Concept를 공부하면서 Gradle이 어떤 구조로 이루어져있고, 어떻게 멀티 모듈을 빌드하는지에 대해 접근을 하려고 합니다.
영어로 된 문서라서 이해하기 쉽게 의역한 점이 있다는 점 양해부탁드려요~~ (잘못된 것은 피드백 주시면 즉각 반영하겠습니다 😊)
Gradle의 Core Concept는 다음과 같습니다. 이후 해당 명칭들은 핵심 개념이므로 한글로 번역을 하기 보다는 영어 그대로 사용하도록 하겠습니다~
Project: 응용 프로그램이나 라이브러리 같이 빌드할 수 있는 소프트웨어
Build Scripts: Project를 빌드하는데 필요한 단계를 설명. 각 Project는 하나 이상의 Build Script를 포함할 수 있음
Depencency Management: 프로젝트가 필요로 하는 외부 리소스를 선언하고 해석하기 위한 자동화 된 기술. 일반적으로 각각의 Project는 Gradle이 빌드 중에 해석할 많은 외부 의존성을 포함.
Tasks: 코드 컴파일이나 테스트 실행과 같은 작업의 기본 단위. 각 프로젝트에는 Build Script 또는 Plugin 내에 정의된 하나 이상의 Task를 포함하고 있음
Plugins: Plugin은 Gradle의 기능을 확장하고, 선택적으로 Project에 Task를 제공하는데 사용.
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-a 및 subproject-b 두 하위 Project의 Build Script
(6) - Project의 소스 코드 혹은 추가 파일
앞선 핵심 개념에서 본 것처럼 하나의 Proeject는 하나 이상의 Build Script(build.gradle)을 포함하고 있는 것을 확인할 수 있네요.
공식 문서에서는 Gradle을 이용해서 빌드할 때는 Gradle Wrapper를 이용해서 빌드하는 것을 추천한다고 합니다.
Gradle Wrapper Script는 필요한 경우 선언된 버전의 Gradle을 다운로드하고 호출을 합니다.
Gradle Wrapper는 gradlew(Linux, OSX)
나 gradle.bat(Windows)
으로 이용이 가능한데요. 다음과 같은 이점을 제공한다고 합니다.
Gradle Wrapper는 다음과 같이 실행할 수 있습니다.
해당 예시는 gradle.bat
을 예시로 들었는데요. 만약 Linux나 OSX 환경이신 경우에는 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.gradle
은 Groovy DSL
과 Kotlin 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의 철학에 감탄이 나옵니다. 다음 포스팅에서는 직접 멀티 모듈을 구성해보면서 그 철학을 체득해보도록 하겠습니다. 그럼 안뇽~ 😎