안녕하세요. 이번 포스팅에서는 저번에 이은 kmp 프로젝트에서 gradle 설정법에 대해 알아보려합니다.
KMP 프로젝트는 저번 포스팅에서 처럼 원하는 플랫폼을 선택하여 프로젝트를 생성할 수 있습니다. 프로젝트 생성 시 지정한 플랫폼들은 프로젝트 구조에서 모듈로 분할되어 있습니다.
아래 코드처럼 gradle 내부에서 각 플랫폼 별로 종속항목을 나눌수 있게 되어있어 별도 추가가 필요한 기능에 대해서는 맞추어 추가하면 됩니다. (ex. android 의 okhttp와 ios의 darwin)
1.Android 프로젝트의 gradle과의 차이점
| 차이점 | Android | KMP |
| 플러그인 | com.android.application, com.android.library |
org.jetbrains.kotlin.multiplatform |
| 소스세트 | main과 androidTest 소스세트 | commonMain과 각 플랫폼별 소스세트 |
| 의존성 | implementation 또는 api와 같은 단일 dependencies 블록에 선언 | sourceSets 블록 내에 선언되며, commonMain 또는 특정 플랫폼 소스 세트마다 해당 플랫폼에 대한 전용 설정 추 |
| 타겟 | 자동 android | android(), ios(), jvm(), 또는 macosX64()와 같이 빌드할 타겟을 명시적으로 정의 |
2. KMP 프로젝트의 gradle 구성
1) plugin
아래 코드만 봤을때는 일반 Android 프로젝트와 동일해 보일 수 있습니다.
plugins {
alias(libs.plugins.kotlinMultiplatform)
alias(libs.plugins.composeMultiplatform)
alias(libs.plugins.composeCompiler)
alias(libs.plugins.composeHotReload)
}
하지만 각 버전을 자세히 보면 다음과 같이 org.jetbrains쪽 compose 와 multiplatform관련 차이가 있습니다..
[plugins]
composeHotReload = { id = "org.jetbrains.compose.hot-reload", version.ref = "composeHotReload" }
composeMultiplatform = { id = "org.jetbrains.compose", version.ref = "composeMultiplatform" }
composeCompiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
2) sourceSets
kotlin 내부에 JVM과 sourceSets를 설정합니다. 이때 sourceSets 내부에 commonMain이과 생성한 플랫폼 모듈마다 라이브러리를 추가합니다.그럼 해당 모듈에서는 해당 라이브러리들을 사용할 수 있습니다.
kotlin {
jvm()
sourceSets {
commonMain.dependencies {
implementation(compose.runtime)
implementation(compose.foundation)
implementation(compose.material3)
implementation(compose.materialIconsExtended)
implementation(compose.ui)
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview)
implementation(libs.androidx.lifecycle.viewmodelCompose)
implementation(libs.androidx.lifecycle.runtimeCompose)
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")
implementation("org.jetbrains.androidx.navigation:navigation-compose:2.8.0-alpha10")
}
androidMain.dependencies {
implementation(libs.ktor.client.okhttp)
}
iosMain.dependencies {
implementation(libs.ktor.client.darwin)
}
commonTest.dependencies {
implementation(libs.kotlin.test)
}
jvmMain.dependencies {
implementation(compose.desktop.currentOs)
implementation(libs.kotlinx.coroutinesSwing)
}
}
}
위 코드에서 좀 생소할수있는 두가지 commonMain과 jvmMain에 대해서 설명드리겠습니다.
1. commonMain: 다양한 플랫폼에서 재사용될 비즈니스 로직, 데이터 모델, 유틸리티 함수 등을 담고 있습니다. 즉 플랫폼에 한정되지 않은 공통된 핵심 기능, 로직을 담하는 부분입니다.
2. jvmMain: JVM 환경에서만 필요한 라이브러리 의존성을 추가합니다.(Android, desktop앱, 서버 측 어플리케이션 등)
각 sourceSet의 역할을 정리하면 다음과 같습니다.
- commonMain/kotlin: 비즈니스 로직, UI(Compose) 공용, expect 선언 등
- commonMain/resources: 문자열/이미지 등 공용 리소스(Compose Resources)
- jvmMain/kotlin: Desktop 전용 코드(파일 I/O, TCP 서버, Room DB builder 등)
- androidMain/kotlin: Android 전용 코드(권한, Context 필요 영역)
- iosMain/swift: ios 전용 코드(ios 전용 라이브러리)
- text/kotlin: 각종 로직 test코드
3) 프로그램 시작점 및 틀 지정
이 부분은 android 의 mainfest를 생각하시면 좋을것 같습니다.
프로젝트의 compose.플랫폼으로 해당 플랫폼의 시작점 및 버전, 파일형식, 이름 등을 정의하는 곳입니다.
아래 코드는 desktop 앱의 내용이며 주석으로 간단히 어떤 역할인지 표시해두었습니다.
compose.desktop {
application {
mainClass = "example.package.Main" // fun main() 있는 곳
// 실행 파일/배포 설정
nativeDistributions {
packageName = "AppName"
packageVersion = "1.0.0"
// 배포 포맷 선택
targetFormats(
TargetFormat.Msi, // Windows 설치형
TargetFormat.Dmg, // macOS
TargetFormat.Deb // Linux
// TargetFormat.AppImage, TargetFormat.Rpm, TargetFormat.Pkg …
)
// 아이콘(선택)
windows { iconFile.set(project.file("icons/app.ico")) }
macOS { iconFile.set(project.file("icons/app.icns")) }
linux { iconFile.set(project.file("icons/app.png")) }
}
}
}
지금까지 KMP 프로젝트의 기본적인 gradle 구조를 알아보았습니다.
여기서 각 플랫폼별 내용 혹은 진행간 ksp 등의 추가에 대한 좀더 자세한 내용은 다른 포스팅에서 진행하겠습니다.
긴글 읽어주셔서 감사합니다.
'KMP' 카테고리의 다른 글
| [KMP] kotlin multiplatform 프로젝트 생성 (0) | 2025.09.18 |
|---|