멀티플랫폼용 Kotlin 라이브러리 만들기

멀티플랫폼용 Kotlin 라이브러리 만들기

Kotlin 라이브러리를 만들 때는, Kotlin Multiplatform 지원을 염두에 두고 빌드·배포하는 것을 고려해 보세요. 이렇게 하면 라이브러리의 대상 층이 넓어져서, 여러 플랫폼을 겨냥하는 프로젝트와도 호환되게 돼요.

참고: 다양한 용도와 대상 플랫폼에 맞는, 이미 만들어져 있는 Kotlin Multiplatform 라이브러리를 klibs.io에서 찾아볼 수 있어요.

다음 섹션에서는 Kotlin Multiplatform 라이브러리를 효과적으로 만드는 데 도움이 되는 지침을 소개할게요.

출처: Building a Kotlin library for multiplatform

본문

도달 범위 최대화하기

라이브러리를 가능한 한 많은 프로젝트의 의존성으로 쓸 수 있게 하려면, Kotlin Multiplatform이 지원하는 대상 플랫폼(target platform)을 최대한 많이 지원하는 걸 목표로 하세요. 라이브러리가 멀티플랫폼 프로젝트(라이브러리든 앱이든)에서 쓰는 플랫폼을 지원하지 않으면, 그 프로젝트가 라이브러리에 의존하기 어려워져요. 그런 경우 프로젝트는 일부 플랫폼에서만 라이브러리를 쓰고 나머지 플랫폼은 별도 해결책을 구현해야 하거나, 모든 플랫폼을 지원하는 다른 라이브러리를 아예 선택하게 돼요.

아티팩트 생산을 간소화하려면 **교차 컴파일(cross-compilation)**을 사용해서 어떤 호스트에서든 Kotlin Multiplatform 라이브러리를 배포하세요. 이렇게 하면 Apple 머신이 없어도 Apple 타깃용 .klib 아티팩트를 만들 수 있어요.

참고: Kotlin/Native 타깃의 경우, 가능한 모든 타깃을 지원하기 위해 티어(tier) 접근 방식을 고려해 보세요.

공통 코드에서 쓰도록 API 설계하기

라이브러리를 만들 때는 플랫폼별 구현을 따로 작성하는 대신, 공통 Kotlin 코드에서 사용할 수 있게 API를 설계하세요.

가능하면 합리적인 기본 설정(default configuration)을 제공하고, 플랫폼별 설정 옵션도 포함하세요. 좋은 기본값 덕분에 사용자는 라이브러리를 설정하려고 플랫폼별 구현을 작성할 필요 없이, 공통 Kotlin 코드에서 라이브러리 API를 쓸 수 있어요.

API는 다음 우선순위에 따라 가장 넓은 관련 소스셋에 배치하세요:

  • commonMain 소스셋: commonMain 소스셋의 API는 라이브러리가 지원하는 모든 플랫폼에서 사용할 수 있어요. 대부분의 라이브러리 API를 여기에 두는 걸 목표로 하세요.
  • 중간 소스셋(intermediate source set): 어떤 플랫폼이 특정 API를 지원하지 않으면, 중간 소스셋으로 특정 플랫폼만 겨냥할 수 있어요. 예를 들어 멀티스레딩을 지원하는 타깃을 위한 concurrent 소스셋이나, 모든 비-JVM 타깃을 위한 nonJvm 소스셋을 만들 수 있어요.
  • 플랫폼별 소스셋: 플랫폼 전용 API는 androidMain 같은 소스셋을 사용해요.

참고: Kotlin Multiplatform 프로젝트의 소스셋에 대해 더 알아보려면 계층적 프로젝트 구조(Hierarchical project structure) 문서를 참고하세요.

플랫폼 간 일관된 동작 보장하기

라이브러리가 지원하는 모든 플랫폼에서 일관되게 동작하게 하려면, 멀티플랫폼 라이브러리의 API가 모든 플랫폼에서 같은 범위의 유효 입력을 받고, 같은 동작을 수행하며, 같은 결과를 반환해야 해요. 마찬가지로 라이브러리는 유효하지 않은 입력을 균일하게 처리하고, 모든 플랫폼에서 일관되게 오류를 보고하거나 예외를 던져야 해요.

동작이 일관되지 않으면 라이브러리를 쓰기 어려워지고, 사용자는 플랫폼별 차이를 관리하려고 공통 코드에 조건부 로직을 넣어야 해요.

expectactual 선언을 사용해서 공통 코드에서 함수를 선언하고, 각 플랫폼의 네이티브 API에 완전히 접근할 수 있는 플랫폼별 구현을 제공할 수 있어요. 이 구현들도 같은 동작을 해야 공통 코드에서 안정적으로 쓸 수 있어요.

API가 플랫폼 간에 일관되게 동작하면, commonMain 소스셋에서 한 번만 문서화하면 돼요.

참고: 한 플랫폼이 더 넓은 입력 범위를 지원하는 경우처럼 플랫폼 차이가 불가피하다면, 그 차이를 최대한 줄이세요. 예를 들어 다른 플랫폼과 맞추려고 한 플랫폼의 기능을 제한하고 싶지 않을 수도 있어요. 그런 경우에는 특정 차이를 문서에 명확히 기록하세요.

모든 플랫폼에서 테스트하기

멀티플랫폼 라이브러리는 모든 플랫폼에서 실행되는 공통 코드로 작성된 멀티플랫폼 테스트를 가질 수 있어요. 이 공통 테스트 스위트를 지원 플랫폼에서 정기적으로 실행하면, 라이브러리가 올바르고 일관되게 동작하는지 확인할 수 있어요.

모든 배포 플랫폼에서 Kotlin/Native 타깃을 정기적으로 테스트하는 건 까다로울 수 있어요. 하지만 더 넓은 호환성을 보장하려면, 호환성 테스트에 티어(tiered) 방식을 사용하면서 라이브러리가 지원할 수 있는 모든 타깃으로 배포하는 걸 고려해 보세요.

kotlin-test 라이브러리를 사용해서 공통 코드에서 테스트를 작성하고, 플랫폼별 테스트 러너로 실행하세요.

비-Kotlin 사용자 고려하기

Kotlin Multiplatform은 지원 대상 플랫폼에서 네이티브 API와 언어와의 상호 운용성을 제공해요. Kotlin Multiplatform 라이브러리를 만들 때는, 사용자가 Kotlin이 아닌 언어로부터 여러분의 라이브러리 타입과 선언을 사용해야 할 수도 있다는 점을 고려해 보세요.

예를 들어 라이브러리의 일부 타입이 상호 운용성을 통해 Swift 코드에 노출된다면, 그 타입을 Swift에서 쉽게 접근할 수 있게 설계하세요. Kotlin-Swift interopedia는 Kotlin API가 Swift에서 호출될 때 어떻게 보이는지에 대한 유용한 통찰을 제공해요.

라이브러리 홍보하기

개발자들이 Kotlin Multiplatform 라이브러리를 발견하고 평가하는 검색 플랫폼인 klibs.io에 여러분의 라이브러리를 소개할 수 있어요. klibs.io는 자격 기준(listing criteria)을 충족하는 라이브러리를 자동으로 나열해요. 여러분의 라이브러리가 자격을 갖추는지 확인하려면 FAQ를 참고하세요.

더 알아보기