Overview

Kotlin은 JetBrains에서 2011년에 출시된 이후에 Android에서는 플랫폼 공식 언어로 지정되었고, 빠르게 기존 Java의 영역을 대체하고 있습니다. Kotlin의 장점 중 하나가 Multiplatform programming을 언어에서 지원하는 점입니다.

athena

https://kotlinlang.org/docs/mpp-supported-platforms.html

Kotlin Multiplatform Mobile(KMM)은 JetBrains가 제공하는 크로스 플랫폼 모바일 개발용 SDK입니다. Kotlin의 멀티플랫폼 기능을 사용하며, 모바일 크로스 플랫폼 애플리케이션을 최대한 즐겁고 효율적으로 빌드할 수 있도록 종합 환경을 제공하기 위해 설계된 다양한 도구와 기능을 포함합니다. KMM은 2020년 8월에 알파로 출시되었습니다.

Android 개발자 관점에서 KMM에 대해 간단하게 해당 내용을 설명한 뒤에, 브랜디에서는 추후에 이를 어떻게 활용하려고 하는지에 대한 내용을 정리하여 보았습니다.


KMM 이란

Kotlin Multiplatform Mobile( KMM )은 크로스 플랫폼 모바일 애플리케이션 생성을 단순화하도록 설계된 SDK입니다. KMM은 기존에 출시되었던 크로스 플랫폼 언어 flutter, React-Native 와는 크로스 플랫폼 개발을 도와주는 점에서 동일합니다. 다만, 개발도구와 언어의 사용에서 기존 플랫폼 개발 언어를 사용한다는 점이 큰 차이를 보입니다.

지원되는 플랫폼

KMM은 다음 모바일 대상을 지원합니다.

  • Android 애플리케이션 및 라이브러리
  • ARM32 및 ARM64 플랫폼의 Android NDK
  • ARM64(iPhone 5s 이상), ARM32(이전 모델) 플랫폼의 Apple iOS, Intel 기반 및 Apple Silicon 플랫폼 모두의 데스크탑 시뮬레이터
  • ARM64(Apple Watch Series 4 이상), ARM32(이전 모델) 플랫폼의 Apple watchOS, Intel 기반 및 Apple Silicon 플랫폼 모두의 데스크탑 시뮬레이터

KMM 기본 컨셉

  • AOS, iOS 개발 시 ui 레이어를 제외한 동일하게 처리해야 하는 비지니스 로직 처리를 KMM에서 순수 Kotlin으로 작성되고 이를 컴파일된 코드가 각 플랫폼에서 사용할 수 있게 제공해줌.
  • shared 라고 각 플랫폼에 제공되는 순수 코틀린 코드 영역에서는 kmm을 지원하는 라이브러리를 사용하여서 작성해야 함

현재 지원되는 라이브러리 (Ktor, kotlinx.serialization, SQLDelight, Koin)

athena
athena
athena

Android Studio 에서 기본 KMM 프로젝트를 생성해서 구조를 보면

athena

anfroidApp 과 iosApp 은 각 플랫폼 레이어에서 구현하는 영역입니다. 기존에 개발하는 형태로 작성하시면 됩니다.

shared 영역이 kmm에서 각 플랫폼으로 제공해주는 공통 코드 영역입니다.

  • commonMain : 각 플랫폼이 순수하게 공유하는 로직이 담긴 부분으로 순수 Kotlin 으로 작성됩니다.
  • androidMain : Android 플랫폼에 특화된 로직이 담기는 부분으로 Android 프레임워크에 접근할 수 있습니다. (android.os.X, Managers, SqliteOpenHelper…)
  • iosMain : iOS 플랫폼에 특화된 로직이 담기는 부분 부분으로 iOS 프레임워크에 접근할 수 있습니다. (Foundation, UIKit, CoreData…)

공통 모듈에서도 commonMain 에는 순수 코틀린만으로 작성되는데 어찌 보면 당연하게도 이곳에 각 플랫폼에 특화된 구현이 필요한 경우가 발생합니다. 이때, KMP(또는 KMM) 프로젝트에서는 플랫폼에 의존적인 기능을 추상화하여 expect 라는 키워드를 이용하여 공통 영역인 commonMain에 정의하고, 각 플랫폼 프레임워크에 접근하여 플랫폼 의존적인 기능을 구현할 수 있는 영역(androidMain, iosMain)에서 actual 이라는 키워드를 통해 구현합니다.

이를 통해 공통 영역(commonMain)에서는 각 플랫폼 구현체에 신경 쓰지 않고 expect 가 붙은 추상화 된 인터페이스를 호출하여 공통 비지니스 로직을 구현할 수 있게 됩니다.

android의 쉐어드 프리퍼런스나 파일 접근 등 비지니스 로직 레이어에 해당하지만 각 플랫폼에 종속적인 코드가 필수적으로 필요한 부분 처리를 위와 같이 추상화하여 처리할 수 있습니다.

athena


KMM 샘플 프로젝트

최신 버전 안드로이드 스튜디오 설치 후에 KMM 플러그인을 설치합니다. 신규 프로젝트 생성을 KMM 프로젝트 템플릿을 이용하여 구현할 수 있습니다.

athena
athena

iosApp 폴더 내에 iosApp xcode 프로젝트가 구성되어 있습니다. 이를 Xcode에서 실행하면 됩니다.

athena

현재 KMM프로젝트를 생성할 때 기본으로 스위프트 UI 기반으로 iOS 프로젝트를 생성하여서 스위프트 UI로 코드가 작성되어 있습니다. 간단한 UI를 구현한 뒤에 iOS 프로젝트를 실행해보면 아래와 같이 실행됩니다.

athena

현재 iOS에서는 버튼을 클릭 시 viewmodel 의 getversion함수를 호출하여서 API를 호출하고 있습니다.

공통 모듈 코드는 import shared 를 통해서 접근할 수 있습니다.

코드 상세 내용에 접근해 보면 아래와 같이 컴파일된 코드 내용을 확인해 볼 수 있습니다.

athena
athena


KMM 장단점

장점

공통되는 로직 영역만 순수 Kotlin으로 개발하고, 개별 플랫폼 영역은 각 플랫폼에서 구현하기 때문에 플랫폼에 따른 성능 이슈 등이 없습니다. 중복되는 비지니스 로직 개발에 드는 리소스를 효율적으로 활용할 수 있습니다. 아키텍쳐 적인 측면에서 레이어 분리가 구조적으로 쉽게 적용할 수 있습니다. 각 플랫폼 개발자가 있는 환경에서는 쉽게 적용할 수 있습니다. KMM을 Kotlin 언어 개발사인 JetBrains 가 지속적인 로드맵을 가지고서 이를 빠르게 대응하고 있습니다. VMWARE, 넷플릭스, AUTODESK 등에서 이를 빠르게 적용하고 있습니다. Slack, John O’Reilly, Touchlab, 등 개발자 커뮤니티 지원도 활발하게 이루어지고 있습니다. 개발 문서, 샘플 등이 잘 지원되고 있습니다.

https://kotlinlang.org/lp/mobile/case-studies/

https://netflixtechblog.com/netflix-android-and-ios-studio-apps-kotlin-multiplatform-d6d4d8d25d23

단점

iOS 개발자가 공통 영역 로직을 확인하기 위해서는 Kotlin 코드를 확인하여야 합니다. 개별 플랫폼 개발자가 있어야만 KMM을 구현할 수 있습니다. 알파 버전이기 때문에 안정성이 검증되지는 않았습니다. 동시성 지원 문제 freeze라는 개념이 추가되었습니다. 현재 iOS에서 coroutines, Flow 를 완벽하게 대응하지 않기 때문에 이를 별도로 래핑하여서 사용하여야 합니다. KMM을 지원하는 특정 라이브러리 사용이 강제됩니다.

https://kotlinlang.org/docs/kmm-concurrency-overview.html#immutable-and-frozen-state

https://kotlinlang.org/docs/kmm-concurrency-and-coroutines.html#multithreaded-coroutines

Conclusion

KMM은 작년 8월에 알파 버전 출시 이후에 거의 매주 kotlinweekly에서 핫하게 다루어지고 있습니다. 넷플릭스와 같이 큰 회사에서도 알파 버전이지만 이미 이를 적용해서 개발 효율성을 개선하고 있습니다. 공통되는 비지니스 로직을 공용으로 사용할 수 있게 개발한다면, 각 플랫폼별로 중복적으로 개발하는 것에 비해 효율적으로 개발을 진행할 수 있습니다. 이를 통해서 얻어지는 리소스는 앱, 코드 등의 퀄리티 향상에 더 투입할 수 있습니다. 브랜디에서는 KMM의 가능성을 확인하고서 MA팀에서 이를 내부적으로 검증 및 테스트를 진행하는 등 신규 기술 트랜드를 빠르게 따라가기 위해서 구성원 모두 열심히 노력하고 있습니다.

참고 사이트

https://kotlinlang.org/docs/kmm-overview.html

https://blog.jetbrains.com/ko/kotlin/2021/06/whats-new-in-kmm-since-going-alpha/

https://github.com/myungpyo/kmm-sample

https://github.com/JetBrains/kotlinconf-app


장순철 | MA팀
jangsc@brandi.co.kr
브랜디, 오직 예쁜 옷만