버미

[KMP] KMP에서 iOS 라이브러리는 어떻게 연결될까? 본문

안드로이드/KMP

[KMP] KMP에서 iOS 라이브러리는 어떻게 연결될까?

Bum_2 2026. 1. 28. 21:20

Kotlin Multi Platform(KMP) 사용하다가 플랫폼 별로 라이브러리를 연결해야하는 상황에서 추가적인 작업이 필요하다.

Android 에서는 Gradle dependency로 간단하게 연결할 수 있지만, iOS에서는 어떻게 연결할지 알아보자.


KMP에서 플랫폼별 구현이 필요한 이유

KMP는 공통 Kotlin 코드를 작성하고,
각 플랫폼(Android / iOS)에서 실제 구현(actual)을 제공한다.

문제는 iOS SDK가 Swift 와 Objective-C 으로 구성되어있다는 점이다.

코틀린에서는 이를 직접 사용할 수 없기 때문에, 연결 과정이 필요하다.

 


iOS SDK가 KMP에 연결되는 흐름을 보면 아래와 같다.

 


CocoaPods

CoCoaPods는 iOS에서 사용하는 의존성 관리자다. 

마치, 안드로이드의 Gradle과 같이 라이브러리를 설치 & 관리해준다고 생각하면 될 것 같다.

 

KMP에서 CocoaPods는 아래와 같은 역할을 한다.

  • iOS 네이티브 라이브러리 다운로드
  • Objective-C 헤더 노출
  • Kotlin Native가 접근할 수 있는 구조 제공

Gradle 에서는 아래와 같이 선언한다.

cocoapods {
    pod("NMapsMap")
}

 


cinterop

cinterop은 Kotlin Native 도구다.

 

KMP에서 cinterop은 아래와 같은 역할을 한다.

  • Objective-C 헤더 분석
  • Kotlin 타입으로 변환
  • 네이티브 함수 연결

예를 들어 iOS SDK에 아래와 같은 코드가 있다고 하자.

@interface MapView
- (void)setZoom:(double)zoom;
@end

 

여기서 cinterop은 아래와 같이 바인딩 한다.

val map = MapView()
map.setZoom(10.0)

 

 

Swift SDK 역시 대부분 아래와 같은 과정을 거쳐서 연결된다.

 

Swift → Objective-C 인터페이스 노출 → cinterop 처리

 

🔎 처음에 cinterop이 바인딩 역할을 해준다고해서 RN의 브릿지와 어떤 차이가 있을까 궁금해졌다.
간략하게 정리하면, 

RN(Reat Native)의 브릿지는 JS ↔ Native 런타임 연결 역할을한다.
반면, KMP의 cinterop은 컴파일 타임 네이티브 바인딩 역할을 한다.

두 방식 모두 네이티브 API를 호출한다는 공통점이 있지만,
React Native의 브릿지런타임에 JS와 네이티브 사이를 중계하는 통신 계층이고,
KMP의 cinterop컴파일 단계에서 네이티브 API에 대한 Kotlin 바인딩을 생성한다는 차이가 있다.

 

 

위의 구조 덕분에 KMP에서는 Cocoapods를 사용하여 Kotlin 코드 베이스로 iOS의 라이브러리를 호출하여 확장할 수 있게 된다.