npm에서 의존성 사용하기

npm에서 의존성 사용하기

Kotlin/JS 프로젝트에서는 모든 의존성을 Gradle 플러그인으로 관리할 수 있어요. 여기에는 kotlinx.coroutines, kotlinx.serialization, ktor-client 같은 Kotlin/Multiplatform 라이브러리도 포함됩니다.

출처: Use dependencies from npm

본문

npm의 JavaScript 패키지에 의존하려면, Gradle DSL이 npm 함수를 제공합니다. 이 함수로 npm에서 가져오고 싶은 패키지를 지정할 수 있어요. is-sorted라는 npm 패키지를 가져온다고 생각해 볼게요.

Gradle 빌드 파일의 해당 부분은 다음과 같아요:

dependencies {
    // ...
    implementation(npm("is-sorted", "1.0.5"))
}

JavaScript 모듈은 보통 동적 타입이고 Kotlin은 정적 타입 언어이기 때문에, 일종의 어댑터를 제공해야 해요. Kotlin에서는 이런 어댑터를 외부 선언(external declarations)이라고 부릅니다. 함수가 하나뿐인 is-sorted 패키지라면 이 선언은 아주 간단하게 작성할 수 있어요. 소스 폴더 안에 is-sorted.kt라는 새 파일을 만들고, 다음 내용으로 채워 볼게요:

@JsModule("is-sorted")
@JsNonModule
external fun <T> sorted(a: Array<T>): Boolean

만약 CommonJS를 타깃으로 사용한다면 @JsModule@JsNonModule 애너테이션을 그에 맞게 조정해야 한다는 점을 기억해 주세요.

이제 이 JavaScript 함수를 일반적인 Kotlin 함수처럼 사용할 수 있어요. 헤더 파일에 타입 정보를 제공했기 때문에(파라미터와 반환 타입을 그냥 dynamic으로 정의하는 대신), 컴파일러 지원과 타입 검사도 제대로 동작합니다.

console.log("Hello, Kotlin/JS!")
console.log(sorted(arrayOf(1,2,3)))
console.log(sorted(arrayOf(3,1,2)))

이 세 줄을 브라우저나 Node.js에서 실행하면, sorted 호출이 is-sorted 패키지가 내보낸 함수에 제대로 매핑되었음을 출력으로 확인할 수 있어요:

Hello, Kotlin/JS!
true
false

JavaScript 생태계에는 패키지에서 함수를 노출하는 여러 방식(예를 들어 이름 있는 내보내기나 기본 내보내기)이 있기 때문에, 다른 npm 패키지는 외부 선언 구조를 약간 다르게 해야 할 수도 있어요.

선언 작성 방법에 대해 더 알아보려면 JavaScript에서 Kotlin 호출하기 (Calling JavaScript from Kotlin) 문서를 참고하세요.

더 알아보기