나의 먼 미래의 작은 창업 꿈을 위해 KMP(Kotlin Multiplatform)를 공부해보기 시작했다.
Android 가 나의 주요 기술스택이었기 때문에 Kotlin과 Compose 를 최대한 활용하여 앱을 개발해보려 한다.
Compose multiplatform wizard(https://kmp.jetbrains.com/)를 이용하여 아래 사진과 같이 폴더를 구성할 수 있었다. Android Studio 에서 직접 new project 생성해서 만들어주는 구성과 조금 다른데, wizard 버전이 더 직관적이라 마음에 들었다.
androidMain 은 android 에만 적용될 코드가, commonMain 은 모든 (android, iOS 등) 플랫폼에서 사용될 코드가, iosMain 에는 iOS에만 적용될 코드가 들어가게 된다.
KMP로 개발하면서 코드 구성 목표는 androidMain, iosMain 은 최소화하고 commonMain을 최대화하는 것이다.
3th party library 또한 가급적 최소화하려 한다.
우선 통신 모듈과 의존성 주입 모듈을 정착시키고 기능을 쉽게 추가할 수 있는 기반부터 만들어보려 한다.
참고로 Kotlin 이라는 언어는 JVM 에만 국한되어 있지 않다. Kotlin은 Java를 wrapping한 언어라고 잘못 인지하는 케이스를 본 적이 있는데 Java와 100% 호환성을 가지고, Kotlin 바이트코드를 Java로 변환할 수 있어서 오해할 수 있을 것 같다. 엄연히 다른 언어이며 Kotlin은 coroutine 과 같이 java 에 없는 것들이 있고, 멀티 플랫폼을 지원한다.
KMP 를 접한 계기는 건대에서 열린 kotlin conf 2024 를 현장 강연에 놀러갔을 때였는데, 코드도 살짝 맛보게 되었다.
강연을 간단히 요약하자면,
- jetpack 라이브러리가 android의 성공적인 사례가 되어 KMP 에서 더 확장하게 되었다.
- android 라이브러리를 kmp 로 지원할때 XPoet 을 이용해서 한벌의 코드로 java 와 kotlin의 code generate을 한다.
(아마 이것은 OOP이기에 가능했으리라) - KMP를 지원하는 버전으로 올리면 기존 android 앱 동작에 영향은 없을까에 대한 의문이 있을수 있지만 X Processing class 인터페이스가 있어서 지원받는다.
- 플랫폼마다 같은 함수로 부르기 위해서 class 명과 함수명 앞에 actual과 expect 키워드가 있다.
ex. expect class A, expect fun a()
ex. actual class B, actual fun b()
(어쩔수 없는 플랫폼 특화 기능을 호출하기 위해 필요한것으로 보이며, expect는 부호 클래스, actual은 자식클래스인 android와 iOS 에서 부르는것 같다.) - android로 개발할때와 KMP 로 개발할때의 차이는
KMP 에서는 hilt 대신 koin을 쓰고, retrofit 대신 ktor를 써야한다. (Kotlin의 K와 맞춘것 같은건 기분탓일까)