175 lines
5.0 KiB
Markdown
175 lines
5.0 KiB
Markdown
# 멀티 모듈 프로젝트 구성
|
|
|
|
소프트웨어 개발에서 프로젝트의 규모가 커질수록 코드 관리가 복잡해진다. 이때 **멀티 모듈(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
|
|
```
|
|
|