본문 바로가기

KMP

[KMP] gradle 설정 방법

 안녕하세요. 이번 포스팅에서는 저번에 이은 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