Android 공부/KMM

KMM (1) 시작

서론

 네이티브 개발을 하다보면, 다른 플랫폼의 개발도 잘 하고 싶은 욕심이 많이 생긴다. Flutter, 리액트는 이러한 욕심을 갖고 있는 개발자에게 좋은 플랫폼이 될 것이라고 생각을 한다. 최근에는 어느 정도 안정화 단계에 도달했다고 생각이 들 정도로, 많은 개발자들이 해당 플랫폼에 관심을 갖고 있다. 하지만, 필자에게는 새로운 것을 배우는 것에 대한 거부감이 있었으며, 여태까지 사용을 한 안드로이드 생태계를 유지하고 싶었다.

 그래서 필자는 KMM을 공부하고 싶다는 욕심이 있었다. KMM은 비지니스 로직은 코틀린 언어를 통해서 작성을 하고, 뷰 영역은 Android와 iOS로 구분지어서 작성을 할 수 있다. 물론, 비지니스 로직에도 Android와 iOS에 대한 로직에 대한 작성이 필요하다고는 한다. 이번 년도에는 KMM 학습과 함께 iOS에 대한 공부를 진행하고자 한다.

https://kotlinlang.org/lp/mobile/ 홈페이지에서 소개하고 있는 KMM

 

Sample 프로젝트 실행

androidApp, iosApp, shared

 샘플 프로젝트를 통해서 KMM에 개념에 대해서 이해할 수 있었다. 

androidApp, iosApp, shared로 크게 세 개의 모듈로 나누어져있다.

모듈 설명
androidApp 안드로이드 ui에 대한 로직이 담겨져 있는 모듈
iosApp iOS ui에 대한 로직이 담겨져 있는 모듈
shared 안드로이드와 iOS의 공통된 비지니스 로직과 각 운영체제 별로 로직을 처리할 수 있는 모듈

 또한, shared 모듈은 기본적으로 androidMain, iosMain, commonMain으로 나누어져있다. 여기에 추가적으로 desktop 환경, web 환경 등으로 추가할 수 있다. 그 외에도 테스트 환경에 따라서 androidTest, iosTest 등으로 모듈을 나눌 수 있어서 필요에 따른 모듈을 shared에서 관리할 수 있다.

모듈 설명
androidMain 안드로이드에 대한 비지니스 로직이 담겨져 있는 모듈
iosMain iOS에 대한 비지니스 로직이 담겨져 있는 모듈
commonMain 안드로이드와 iOS의 공통된 비지니스 로직을 처리하는 모듈

expect, actual 키워드

//Android
actual class Platform actual constructor() {
    actual val platform: String = "Android ${android.os.Build.VERSION.SDK_INT}"
}

//iOS
actual class Platform actual constructor() {
    actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
}

//common
expect class Platform() {
    val platform: String
}

 비지니스 모델이 android와 iOS로 나누어진다면, androidMain과 iosMain 모듈에 각각의 비지니스 로직이 만들어 진다. 위는 KMM을 통해서 모듈이 처음 만들어질 때 작성된 코드인데, 이에 대해서 Android와 iOS에서는 각각의 모듈에서 Platform 클래스를 actual 키워드를 통해서 만들게 되고, common 모듈에서는 expect 키워드를 통해서 추상화하게 된다.

 이를 통해서 actual은 구현부에 추가해야하는 키워드이며, expect 키워드는 만든 클래스를 어느정도 추상화하는 용도로 사용한다고 생각하면 된다.

 이 개념을 추가한 상태로 KMM 프로젝트를 사용해보고자 하였다.

시작이 절반

 해당 프로젝트를 만든 지, 2주가 지났는데 별도로 ui를 개발하지도 못 하였다. 2주동안 환경설정만 셋팅하다가 시간이 지났다. 필자의 개발환경은 아래와 같다. 기본적으로 제공하고 있는 shared 모듈에 있는 Greeting 클래스를 참조하지 못하는 현상이 있었다.

 이에 대한 현상은 꽤 빈번히 발생하는 현상으로 보였고, 검색을 하다가 이에 대한 해결책을 찾을 수 있었다.

Android Gradle Plugin Version : 7.2.0-alpha07
Gradle Version : 7.3.3
Android Studio Version : Android Studio Chipmunk 2021.2.1 Canary7

 build.gradle.kts (:shared)

 sourceSets에 있는 내용을 긁어왔다. 기존에는 commonMain, androidMain, iosMain만 있었는데, commonMain에 대한 소스코드가 androidMain이 가지고 있지 않기 때문에, Greeting 클래스를 임포트하지 못 하는 현상이 있었던 것 같다.

  공통로직을 관리하는 commonMain을 commonJvmAndroid라는 새로운 디펜던시를 만들어주고, 해당 디펜던시는 commonMain을 참조하게 한 후에, androidMain에서 해당 commonJvmAndroid와 함께 commonJvmAndroid/kotlin 패키지를 이하의 소스코드를 사용할 수 있게 셋팅하는 것 같았다.

 이와 같이 shared 모듈을 셋팅하고 나니, kmm 패키지를 사용할 수 있었다.

val commonMain by getting
val commonTest by getting {
     dependencies {
          implementation(kotlin("test-common"))
          implementation(kotlin("test-annotations-common"))
     }
}
val commonJvmAndroid = create("commonJvmAndroid") {
     dependsOn(commonMain)
}

val androidMain by getting {
     dependsOn(commonJvmAndroid)
     kotlin.srcDir("src/commonJvmAndroid/kotlin")
     dependencies {
          implementation(kotlin("stdlib-jdk8"))
     }
}

val iosX64Main by getting
val iosArm64Main by getting

val iosMain by creating {
     dependsOn(commonMain)
     iosX64Main.dependsOn(this)
     iosArm64Main.dependsOn(this)     
}

 

아래의 블로그 글을 읽어보는 것을 추천한다. 

https://jeroenmols.com/blog/2021/03/17/share-code-kotlin-multiplatform/

 

Share code between Android and Jvm in Kotlin multiplatform

While Android supports most Java language features, it doesn’t support every API that Java provides. On the other hand, Kotlin multiplatform only allows sharing code across all targets (commonMain), not a subset of targets (commonJvm).

jeroenmols.com

Next

멀티플랫폼 개발을 시작하는 단계이지만, KMM은 기존의 안드로이드 개발 지식을 그대로 사용할 수 있기 때문에, 안드로이드 개발자로 하여금 멀티플랫폼 언어를 별도로 배우지 않아도 되며, iOS 개발만 배울 필요가 생기기 때문에 적은 공수로 성능 좋은 네이티브 앱을 사용하는 것이 정말 큰 메리트라고 생각을 한다. 그래서, KMM을 알게 된 이후에는 iOS 학습에 대한 목표가 생기게 되었다.

 앞으로의 목표는 아래와 같다.

 Android iOS
- Jetpack Compose
- Coroutine
- Material Design3
- Swift
- 쉬운 레이아웃 개발
- iOS 개발 환경

 Android의 최신기술들을 학습하고자 한다. Compose, Coroutine, Material Design3 등 각종 최신기술을 경험해보고자 하며,
iOS 개발에 있어서는 기본적인 개발을 배워보고자 한다. 이에 대해서 경험을 하며, 작성하고 싶은 내용들을 블로그를 통해서 남기려고 한다.

  

출처

그림1 - https://kotlinlang.org/lp/mobile/

 

Kotlin for Cross-Platform Mobile Development

Save time and effort by writing the business logic for your iOS and Android apps just once, in pure Kotlin.

kotlinlang.org

 

'Android 공부 > KMM' 카테고리의 다른 글

KMP에서 Unresolved reference: IO 에러 땜질하는 법  (0) 2024.02.05
2024년의 NEW 감자튀김의 프로젝트  (0) 2024.01.31
KMM (2) sqldelight  (1) 2022.04.16