우리 팀은 Android와 iOS 두 플랫폼의 앱을 동시에 개발하는 것을 목표로 하고 있었다.
초기 계획은 Android는 Kotlin 기반의 네이티브 코드(Native Code) 로 개발하고,
iOS는 React Native 를 활용해 크로스 플랫폼으로 구현하는 방식이었다.
하지만 조사 과정에서 KMP(Kotlin Multiplatform) 과 CMP(Compose Multiplatform) 을 알게 되었다.
Kotlin과 Compose만으로 iOS까지 개발이 가능하다는 점은,
iOS 전문 인력이 없는 우리 팀에게 매우 매력적인 선택지였다.
새로운 프레임워크(RN)를 학습하는 대신, 이미 익숙한 Kotlin과 Compose를 그대로 사용할 수 있었기 때문이다.
이에 따라 팀은 KMP 기반 개발로 전환하기로 결정하였다.
그러나 예상치 못한 문제가 하나 있었다 —
지금까지 Android에서 의존성 주입(Dependency Injection)을 위해 사용하던 Hilt가
KMP 환경에서는 지원되지 않는다는 점이었다.
결국 우리는 Hilt → Koin으로의 전환을 결정하게 되었고,
이 과정을 통해 KMP 환경에 맞는 구조와 의존성 주입 방식으로 프로젝트를 새롭게 정비하게 되었다.
❌ 왜 Hilt(=Dagger)는 KMP에서 쓸 수 없나?
Hilt/Dagger는 KSP/Annotation Processing 기반
→ KMP의 commonMain은 annotation processor를 사용할 수 없음
→ 즉, 공유 코드에서 Hilt 사용 자체가 불가능함
IOS에서는 Hilt가 동장할 수 없음
→ Hilt는 안드로이드 프레임워크 의존
→ IOS Swift에서는 Hilt 객체를 생성할 수 없음
→ 그래서 KMP에서 IOS가 사용하는 DI 구조 자체가 깨짐
⭐️ KMP 공식 추천 DI = Koin
Koin이 KMP를 공식 지원하는 이유
→ 공통 모듈(commonMain)에서 DI가 된다.
UseCase, Repository, Network 모두 공유 가능
Android/IOS 양쪽에서 같은 DI 구성 사용
→ IOS에서도 Kotlin 객체를 DI로 받아 사용 가능
Swift에서 바로 Koin으로 resolve 가능
→ Annotation Processor 없음 (런타임 DI)