KSP 자주 묻는 질문
왜 KSP인가요?
KSP는 kapt에 비해 몇 가지 장점이 있습니다:
- 더 빠릅니다.
- Kotlin 사용자에게 더 유려한 API를 제공합니다.
- 생성된 Kotlin 소스에 대해 다중 라운드 처리를 지원합니다.
- 멀티플랫폼 호환성을 염두에 두고 설계되고 있습니다.
KSP가 kapt보다 빠른 이유는 무엇인가요?
kapt는 Java 스텁을 생성하기 위해 모든 타입 참조를 파싱하고 해석해야 하지만, KSP는 필요할 때(또는 온디맨드 방식으로) 참조를 해석합니다. javac에 위임하는 것도 시간이 걸립니다.
또한, KSP의 증분 처리 모델은 단순히 격리하고 집계하는 것보다 더 세밀한 단위로 작동합니다. 모든 것을 재처리하는 것을 피할 더 많은 기회를 찾습니다. 또한, KSP는 심볼 해석을 동적으로 추적하기 때문에, 한 파일의 변경이 다른 파일에 영향을 미칠 가능성이 적으며, 따라서 재처리될 파일의 집합이 더 작습니다. kapt는 처리를 javac에 위임하기 때문에 이것은 불가능합니다.
KSP는 Kotlin 전용인가요?
KSP는 Java 소스도 처리할 수 있습니다. API는 통합되어 있으며, 이는 Java 클래스와 Kotlin 클래스를 파싱할 때 KSP에서 통합된 데이터 구조를 얻는다는 의미입니다.
KSP를 어떻게 업그레이드하나요?
KSP는 API와 구현을 가집니다. API는 거의 변경되지 않으며 하위 호환성을 가집니다. 새로운 인터페이스가 추가될 수는 있지만, 기존 인터페이스는 변경되지 않습니다. 구현은 특정 컴파일러 버전에 종속됩니다. 새 릴리스에서는 지원되는 컴파일러 버전이 변경될 수 있습니다.
프로세서는 API에만 의존하므로 컴파일러 버전에 종속되지 않습니다. 그러나 프로세서 사용자는 프로젝트의 컴파일러 버전을 올릴 때 KSP 버전도 올려야 합니다. 그렇지 않으면 다음 오류가 발생합니다.
ksp-a.b.c is too old for kotlin-x.y.z. Please upgrade ksp or downgrade kotlin-gradle-plugin
NOTE
프로세서 사용자는 프로세서가 API에만 의존하기 때문에 프로세서 버전을 올릴 필요가 없습니다.
예를 들어, KSP 1.0.1로 릴리스 및 테스트된 일부 프로세서는 Kotlin 1.6.0에 엄격하게 종속됩니다. Kotlin 1.6.20에서 작동하도록 하려면, Kotlin 1.6.20용으로 빌드된 KSP 버전(예: KSP 1.1.0)으로 KSP를 업데이트하기만 하면 됩니다.
최신 KSP 구현을 이전 Kotlin 컴파일러와 함께 사용할 수 있나요?
언어 버전이 동일하다면, Kotlin 컴파일러는 하위 호환성을 가지도록 되어 있습니다. Kotlin 컴파일러를 업데이트하는 것은 대부분의 경우 간단한 일입니다. 더 새로운 KSP 구현이 필요하다면, 그에 맞춰 Kotlin 컴파일러를 업그레이드하세요.
KSP는 얼마나 자주 업데이트되나요?
KSP는 Semantic Versioning을 가능한 한 가깝게 따르려고 노력합니다. KSP 버전 major.minor.patch
에서,
major
는 호환되지 않는 API 변경 사항에 사용됩니다. 이에 대한 정해진 일정은 없습니다.minor
는 새로운 기능에 사용됩니다. 이는 대략 분기별로 업데이트됩니다.patch
는 버그 수정 및 새로운 Kotlin 릴리스에 사용됩니다. 이는 대략 매월 업데이트됩니다.
일반적으로 새로운 Kotlin 버전이 릴리스된 후 며칠 내에 해당 KSP 릴리스가 제공되며, 사전 릴리스(Beta 또는 RC)도 포함됩니다.
Kotlin 외에 다른 라이브러리 버전 요구사항이 있나요?
다음은 라이브러리/인프라에 대한 요구사항 목록입니다.
- Android Gradle Plugin 7.1.3+
- Gradle 6.8.3+
KSP의 향후 로드맵은 무엇인가요?
다음 항목들이 계획되어 있습니다.
- 새로운 Kotlin 컴파일러 지원
- 멀티플랫폼 지원 개선. 예를 들어, 타겟의 하위 집합에서 KSP 실행/타겟 간 계산 공유.
- 성능 개선. 최적화할 부분이 많습니다!
- 버그 수정 지속.
아이디어를 논의하고 싶으시다면, Kotlin Slack의 #ksp 채널에서 저희에게 자유롭게 연락 주세요 (초대 받기). GitHub 이슈/기능 요청 또는 풀 리퀘스트를 제출하는 것도 환영합니다!