KSP FAQ
KSP FAQ (KSP FAQ)
KSP를 쓰면서 가장 많이 받는 질문들을 모아봤어요. 궁금한 내용부터 골라 읽어도 돼요.
출처: Kotlin 공식 문서
본문
왜 KSP를 쓰나요?
KSP는 kapt보다 몇 가지 장점이 있어요.
- 더 빨라요.
- Kotlin 사용자에게 더 자연스러운 API예요.
- 생성된 Kotlin 소스에 대한 다중 라운드 처리를 지원해요.
- 처음부터 멀티플랫폼 호환을 염두에 두고 설계되고 있어요.
왜 KSP가 kapt보다 빠른가요?
kapt는 Java 스텁(stub)을 만들려고 모든 타입 참조를 파싱하고 해석해야 하는 반면, KSP는 참조를 필요할 때만(on-demand) 해석해요. javac에 일을 위임하는 것도 시간이 걸리죠. 게다가 KSP의 증분 처리 모델은 단순히 격리(isolating)와 집계(aggregating)만 나누는 것보다 더 미세한 단위로 동작해요. 전체를 다시 처리하는 일을 피할 기회를 더 많이 찾아내죠. 또 KSP는 심볼 해석을 동적으로 추적하기 때문에, 한 파일이 바뀌어도 다른 파일을 오염시킬 가능성이 낮아서 다시 처리해야 할 파일의 집합이 더 작아요. kapt는 처리 과정을 javac에 위임하기 때문에 이런 게 불가능해요.
KSP는 Kotlin 전용인가요?
KSP는 Java 소스도 처리할 수 있어요. API가 통합되어 있어서, Java 클래스와 Kotlin 클래스를 파싱하면 KSP에서는 같은 통일된 데이터 구조를 얻게 돼요.
KSP는 어떻게 업그레이드하나요?
KSP에는 API와 구현(implementation)이 있어요. API는 거의 바뀌지 않고 하위 호환성을 유지해요. 새 인터페이스가 추가될 수는 있어도, 기존 인터페이스가 바뀌진 않아요. 구현은 특정 컴파일러 버전에 묶여 있어요. 새 릴리스가 나오면 지원하는 컴파일러 버전이 바뀔 수 있어요.
프로세서는 API에만 의존하므로 컴파일러 버전에 묶이지 않아요. 하지만 프로세서를 쓰는 쪽에서는 프로젝트의 컴파일러 버전을 올릴 때 KSP 버전도 함께 올려야 해요. 그렇지 않으면 다음 오류가 발생해요.
ksp-a.b.c is too old for kotlin-x.y.z. Please upgrade ksp or downgrade kotlin-gradle-plugin
프로세서 사용자는 프로세서 버전을 올릴 필요가 없어요. 프로세서는 API에만 의존하니까요.
예를 들어 어떤 프로세서가 KSP 1.0.1로 릴리스되어 테스트됐고, KSP 1.0.1은 엄밀히 Kotlin 1.6.0에 의존한다고 해볼게요. 이걸 Kotlin 1.6.20에서 동작하게 하려면, Kotlin 1.6.20용으로 빌드된 KSP 버전(예: KSP 1.1.0)으로 올리기만 하면 돼요.
더 오래된 Kotlin 컴파일러에 더 새로운 KSP 구현을 써도 되나요?
언어 버전이 같으면 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를 실행하거나 타깃 간에 계산을 공유하는 것.
- 성능 개선. 최적화할 게 정말 많아요!
- 버그 수정 지속.
아이디어를 논의하고 싶다면 #ksp 채널 in Kotlin Slack(초대받기)에 편하게 연락해 주세요. GitHub 이슈/기능 요청이나 풀 리퀘스트를 올리는 것도 환영해요!