
Kotlin Multiplatform(KMP)은 Kotlin 언어를 기반으로 Android, iOS, 웹, 데스크탑 등 다양한 플랫폼에서 공통 코드를 재사용할 수 있도록 지원하는 기술입니다. 하나의 코드베이스로 여러 플랫폼을 커버할 수 있어 코드 중복을 줄이고 일관성을 높이는 데 유리합니다.
KMP는 공유해야하는 코드베이스의 양이나 부분을 지정하지 않습니다. 공유할 만한 코드 부분은 개발자가 결정한다.
KMP에 대한 기초 학습은 다음 코드랩을 통해 학습했습니다.
KMP 기초 Codelab
기초적인 부분은 Codelab을 통해 학습한 만큼 이 글에서는 제가 학습하면서 느낀 KMP의 특징에 대해서 비교분석해보겠습니다.
특징 1. 공유할 부분 결정하기
KMP는 공유할 부분을 개발자가 직접 결정할 수 있습니다. 이 공유 코드를 사용하면 플랫폼 전반에서 일관성을 유지하고 중복된 보일러 플레이트 코드를 줄일 수 있습니다.
androidMain - android에 적용될 코드
commonMain - 공통으로 플랫폼 모두에 적용될 코드
iosMain - ios에 적용될 코드
이는 Flutter와 유사해 보일 수 있으나 Flutter는 UI와 로직 모두를 공유하는 반면 KMP는 주로 비즈니스 로직을 공유하고, UI는 각 플랫폼의 네이티브 UI 프레임워크로 별도 구현해야 합니다. (UI도 공유할 수 있는 Compose Multiplatform이 있긴 합니다.)
특징 2. 플랫폼별 편리한 구현 지원
멀티 플랫폼 개발의 가장 큰 한계점은 아무리 공통 모듈로 구현을 하여도 어쩔 수 없이 플랫폼 별로 별도 구현을 해줘야 하는 부분이 생길 수 밖에 없다는 점입니다.
Flutter에서는 플랫폼 별 고유 기능을 구현하기 위해서는 MethodChannel을 통해 네이티브 코드와 통신해야 합니다. 하지만 이 방식은 채널 명을 문자열로 하드코딩해야하기 때문에 휴먼 에러가 증가할 가능성이 있습니다. 또한 코드 관리가 통합적으로 관리되지 않아 네이티브에 누락된 코드가 있어도 관리하고 발견하기 쉽지 않습니다.
반면 KMP에서는 expect와 actual 키워드를 제공합니다.
expect: 공통 코드이며 commonMain에서 선언됩니다. 플랫폼 별 별도 구현이 필요함을 의미합니다.
actual: expect로 정의된 실구현을 제공합니다.
공통된 정의를 선언하고 실제 구현은 각 플랫폼 단으로 위임한다는 것입니다.
또한 expect로 선언했는데 androidMain과 iOSMain에서 actual class로 구현하지 않을 경우 오류가 발생하여 Flutter에서 구현된 로직이 각 플랫폼에 구현되지 않을 가능성을 없애주었습니다.
package com.example.shared
expect fun platform(): String
actual fun platform() = "iOS"
actual fun platform() = "Android"
다음 글에서는 KMP를 활용해 간단한 앱을 제작해보겠습니다.