# 멀티 모듈 프로젝트 구성 소프트웨어 개발에서 프로젝트의 규모가 커질수록 코드 관리가 복잡해진다. 이때 **멀티 모듈(Multi-Module) 프로젝트**를 활용하면 코드의 재사용성을 높이고, 빌드 속도를 최적화하며, 팀 협업을 효율적으로 진행할 수 있다. Gradle은 멀티 모듈 프로젝트를 손쉽게 구성할 수 있도록 지원하며, 각 모듈을 독립적으로 관리하면서도 전체 프로젝트와 연동할 수 있도록 설계되어 있다. ## 멀티 모듈 프로젝트란? 멀티 모듈 프로젝트는 하나의 **루트 프로젝트**(Root Project)와 여러 개의 **서브 모듈**(Submodule)로 구성된 프로젝트 구조를 의미한다. ### 왜 멀티 모듈을 사용할까? - **코드 재사용성 증가**: 공통 로직을 별도의 모듈로 분리하여 여러 프로젝트에서 사용할 수 있다. - **빌드 속도 최적화**: 변경된 모듈만 빌드하여 전체 빌드 시간을 줄일 수 있다. - **의존성 관리 용이**: 각 모듈에서 필요한 라이브러리만 선언하여 불필요한 의존성을 제거할 수 있다. - **팀 협업 효율성 증가**: 서로 다른 팀이 독립적으로 모듈을 개발하고 유지할 수 있다. ## Gradle 멀티 모듈 프로젝트 구조 Gradle 멀티 모듈 프로젝트는 다음과 같은 구조로 구성된다. ``` my-project/ ├── app │   ├── build.gradle.kts │   └── src │   ├── main │   │   ├── java │   │   └── resources │   └── test │   ├── java │   └── resources ├── buildSrc │   ├── build.gradle.kts │   ├── settings.gradle.kts │   └── src │   └── main │   └── kotlin │   ├── buildlogic.java-application-conventions.gradle.kts │   ├── buildlogic.java-common-conventions.gradle.kts │   └── buildlogic.java-library-conventions.gradle.kts ├── gradle │   ├── libs.versions.toml │   └── wrapper │   ├── gradle-wrapper.jar │   └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── list │   ├── build.gradle.kts │   └── src │   ├── main │   │   ├── java │   │   └── resources │   └── test │   ├── java │   └── resources ├── settings.gradle.kts └── utilities ├── build.gradle.kts └── src ├── main │   ├── java │   └── resources └── test └── resources ``` ## Gradle 멀티 모듈 프로젝트 설정 ### **3.1 루트 프로젝트 설정** 루트 프로젝트에서는 `settings.gradle.kts` 파일을 사용하여 서브 모듈을 등록한다. `settings.gradle.kts` ```kotlin rootProject.name = "my-project" include("app", "list", "utilities") ``` ### 개별 모듈 설정 각 모듈은 `build.gradle.kts` 파일을 가지고 있으며, 필요한 플러그인과 의존성을 선언할 수 있다. #### 루트 프로젝트의 `build.gradle.kts` 루트 프로젝트에서는 전체 모듈에 적용할 공통 설정을 정의할 수 있다. ```kotlin plugins { kotlin("jvm") version "1.9.0" apply false } subprojects { repositories { mavenCentral() } } ``` --- ## 모듈 간 의존성 설정 ### 모듈 간 의존성 추가 각 모듈에서 다른 모듈을 의존성으로 추가할 수 있다. 예를 들어, `app` 모듈에서 `core` 모듈을 사용하려면 `dependencies` 블록에 다음을 추가한다. `app/build.gradle.kts` ```kotlin dependencies { implementation(project(":core")) implementation(project(":shared")) } ``` ## 공통 라이브러리 관리 멀티 모듈 프로젝트에서는 모든 모듈에서 공통으로 사용하는 라이브러리를 `libs.versions.toml` 파일로 관리할 수 있다. `gradle/libs.versions.toml` ```toml [versions] kotlin = "1.9.0" junit = "5.9.2" [libraries] kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } junit = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } ``` 이제 각 모듈에서 라이브러리를 다음과 같이 참조할 수 있다. `core/build.gradle.kts` ```kotlin dependencies { implementation(libs.kotlin.stdlib) testImplementation(libs.junit) } ``` ## 멀티 모듈 프로젝트 빌드 및 실행 ### 전체 프로젝트 빌드 모든 모듈을 빌드하려면 다음 명령어를 실행한다. ```sh gradle build ``` ### 특정 모듈만 빌드 예를 들어, `feature-a` 모듈만 빌드하려면 다음 명령어를 실행한다. ```sh gradle :feature-a:build ``` ### 특정 모듈의 테스트 실행 ```sh gradle :core:test ```