이 글의 원문은 여기서 확인 가능하며, 블로그 리뷰에는 김태호(Google)님이 참여해주셨습니다.
오늘 드디어 Kotlin으로 가벼운 컴파일러 플러그인을 빌드하기 위한 새로운 도구 KSP(Kotlin Symbol Processing)의 알파 버전을 발표하게 되었습니다. KSP는 KAPT와 비슷한 기능을 제공하지만, 속도가 최대 2배 더 빠르고 Kotlin 컴파일러 기능에 직접 액세스할 수 있으며 여러 플랫폼과의 호환성을 염두에 두고 개발 중인 도구입니다.
KSP는 Kotlin 1.4.30 버전 이상과 호환되며, KSP GitHub 저장소에서 오픈 소스 코드와 문서를 확인할 수 있습니다.
왜 KSP인가요?
저희가 Kotlin 개발자로부터 가장 많이 받는 요청은 빌드 속도를 더 빠르게 만들어 달라는 것입니다. 많은 개발자가 하루에도 수십 번씩 앱 테스트를 반복하고, 배포하므로, 느린 빌드 속도 때문에 멍하니 앉아서 기다리는 건 시간 낭비가 아닐 수 없습니다. Kotlin 코드 컴파일과 관련해 가장 큰 문제 중 하나는 Kotlin이 자체적으로 어노테이션 프로세싱 (Annotation Processing) 시스템을 갖추고 있지 않다는 점입니다. Room과 같은 어노테이션 프로세서는 Android에서 널리 사용되고, 이는 KAPT(Kotlin Annotation Processing Tool)의 도움을 받아 자바단의 어노테이션 프로세싱 시스템을 사용합니다. 하지만, 이를 위해 Java 스텁(Stubs)을 생성해야 하므로 실행 속도가 느릴 수 있습니다.
KSP는 설계 시점부터 Kotlin 단에서 어노테이션 프로세싱이 어떻게 동작할지 고려했습니다. KSP는 Kotlin 코드를 직접 파싱(parsing)하기 위한 강력하면서도 간단한 API를 제공하므로, KAPT의 스텁 생성으로 인해 빌드 속도가 저하되는 문제를 크게 줄여줍니다. Room 라이브러리를 사용하여 벤치마크를 수행한 결과, KSP가 KAPT보다 대략 2배 정도 빨리 동작했습니다.
시작하기
KSP를 실제로 어떻게 사용하는지 확인해 보려면, GitHub에서 KSP Playground project를 다운로드해서 확인해 보세요. 다음 사항을 확인할 수 있습니다.
빌더 구현을 위한 모든 로직은 test-processor에 있습니다. KSP를 사용하는 입장에서 본다면, KAPT와 KSP 사용 시 유일한 차이점은 다음과 같이 두 줄에 불과합니다:
KSP의 목표는 대부분의 Android 앱 개발자가 내부 작동 원리에 대해 신경 쓸 필요가 없도록 하는 것입니다. 위의 빌드스크립트 변경 사항을 제외하면, KSP를 지원하는 라이브러리가 일반적인 어노테이션 프로세스와 모든 것이 동일하면서도 속도가 최대 2배 더 빠릅니다. 하지만, 같은 모듈에서 KAPT와 KSP를 사용하면 처음에는 빌드 속도가 느려질 가능성이 있으므로 이번 알파 버전 시험 단계 중에는 KSP와 KAPT를 각각 별개의 모듈에서 사용하는 것이 좋습니다.
더 많은 주석 처리기가 KSP를 채택함에 따라 대부분의 모듈에서 거의 즉시 KAPT를 KSP로 교체해 사용할 수 있을 것으로 기대합니다. 우선은 이 표에서 어떤 어노테이션 프로세스가 KSP를 지원하는지 확인할 수 있습니다. KSP를 지원하거나 KSP에 대한 지원을 구현 중인 라이브러리가 표에서 빠져 있다면 저희에게 알려주세요! 현재 어노테이션 프로세서를 사용하는 라이브러리 작성자라면 빠른 시작(quickstart) 가이드와 README 가이드에서 라이브러리를 KSP와 호환 가능하게 하는 자세한 방법을 찾아볼 수 있습니다.
어노테이션 프로세서가 포함된 라이브러리를 만드는 경우, KSP가 알파 단계이므로 면밀한 검토를 시작해 KSP 문제 추적기(issue tracker)에 이 API에 관한 의견을 제시하기에 적기이므로 적극적으로 참여해주세요. 또한, Kotlin Slack의 #ksp 채널에 정기적으로 릴리스 업데이트를 게시하고 있으니 자주 살펴봐주세요. 작년 6월 개발자 프리뷰 이후 100여 개의 버그와 문제를 해결했으며 그중 수십 개는 Kotlin 라이브러리 개발자 커뮤니티 회원 여러분의 적극적인 참여를 통해 이루어졌습니다.
Java는 Oracle 및/또는 계열사의 등록상표입니다.