-
Android) KAPT를 대체할 KSP(Kotlin Symbol Process) 소개 with Kotlin DSLAndroid 2021. 7. 17. 19:18
What is KSP
- KSP의 탄생 배경은 Kotlin 빌드 속도를 더 빠르게 하기 위함에 있습니다.
- 컴파일에 있어, Kotlin이 자체적으로 Annotation Processing 시스템을 갖추고 있지 않는 것이 문제가 되었습니다.
- KSP는 KAPT와 비슷한 기능을 제공하지만, 속도가 최대 2배 더 빠르고 Kotlin 컴파일러 기능에 직접 액세스 및 호환성을 가진 도구입니다.
- Kotlin Symbol Processing(KSP)이 공식적으로 알파 버전이 발표되었으며, Kotlin 버전 1.4.30 이상과 호환됩니다.
- KSP는 Kotlin 코드를 직접 Parsing하기 위한 강력하고 간단한 API를 제공합니다.
KSP vs KAPT
- 안드로이드에서 많이 사용되는 Room, Dagger, Retrofit과 같은 라이브러리의 Annotation Processor는 KAPT(Kotlin Annotation Processing Tool)의 도움을 받아 Java Annotation Processing 시스템을 사용합니다.
- KAPT에는 전용 주석 프로세서가 없습니다. 이를 위해 APT(Annotation Proecessing)는 Java만 처리할 수 있어, Java Stub을 생성하게 되어 성능에 영향을 미칠 수 있어 실행 속도가 느릴 수 있습니다.
- KSP는 설계 시점부터 Kotlin에서 Annotation Processing이 어떻게 동작할지 고려하여 만들었기 때문에, KAPT의 Stub 생성으로 인한 빌드 속도 저하 문제를 줄여줍니다. (최대 2배 정도)
- 같은 모듈에서 KSP와 KAPT를 사용하면 처음에는 빌드 속도가 느려질 수 있으므로 각각 별개의 모듈에서 사용하는 것이 좋습니다.
- KSP의 목표는 대부분의 안드로이드 개발자가 내부 작동 원리에 대해 신경 쓸 필요가 없도록 하는 것입니다.
- KSP와 KAPT 사용 시 유일한 차이점은 아래와 같이 두 줄에 불과합니다.
- 공식 문서를 더 자세히 살펴보면 KSP가 Kotlin에만 국한되지 않고 Java 클래스의 Parsing도 지원한다고 합니다.
- 따라서 Java 클래스를 Parsing 하면 Kotlin과 동일한 데이터가 생성됩니다.
Limitations of KSP
- KSP의 한계도 존재합니다. 아래는 KSP가 고려하는 사항이 아닙니다.
- 소스 코드의 표현 수준 정보를 조사
- 소스 코드 수정
- JAVA Annotation Processing API와 100% 호환
- IDE와 통합
Kotlin DSL
- KSP 설정 - build.gradle.kts (ksp 모듈 레벨)
- .kts 확장자는 Kotlin DSL입니다.
-
plugins { // kotlin plugin kotlin("jvm") } dependencies { // KSP implementation("com.google.devtools.ksp:symbol-processing-api:1.5.21-1.0.0-beta05") }
- 기본적으로 안드로이드에서 사용하고 있는 DSL(Domain Specific Language)은 Groovy DSL 입니다.
- Kotlin DSL로 변경하여 사용하는 이유에는 몇 가지 장점이 있기 때문입니다.
- Kotlin DSL로 마이그레이션 하는 방법은 참고 바랍니다.
- 컴파일 타임에 에러 확인
- 코드 탐색
- 자동 완성
- 구문 강조
- 소스코드와 동일한 언어의 사용
- Kotlin DSL의 단점으로는 빌드 속도가 Groovy DSL보다 느리다는 점입니다.
Deep in Dive KSP
interface SymbolProcessor { /** * Called by Kotlin Symbol Processing to run the processing task. * * @param resolver provides [SymbolProcessor] with access to compiler details such as Symbols. * @return A list of deferred symbols that the processor can't process. */ fun process(resolver: Resolver): List<KSAnnotated> /** * Called by Kotlin Symbol Processing to finalize the processing of a compilation. */ fun finish() {} /** * Called by Kotlin Symbol Processing to handle errors after a round of processing. */ fun onError() {} }
- SymbolPorcessor는 프로세싱을 위해 process(), finish(), onError() 3가지의 메서드를 가지는 인터페이스입니다.
- process() 메서드의 resolver는 SymbolProcessor에 심벌(어노테이션)과 같은 컴파일러 세부 정보에 대한 접근을 제공합니다.
- finish() 메서드는 최종적인 단계로, 에러가 없을 시 프로세싱을 마무리 짓습니다.
- onError() 메소드는 수행 후 에러를 처리합니다.
Preference
Announcing Kotlin Symbol Processing (KSP) Alpha
반응형'Android' 카테고리의 다른 글
Android) 테스트 코드 왜 작성 해야 할까? 예제로 알아보자 (1) 2021.08.29 Android) 안드로이드 네트워크 프로파일러 사용해보기 feat) 웹 파싱 방법 (0) 2021.08.11 Android) 이미지 로딩 라이브러리 자세히 알아보자 (0) 2021.07.11 Android) WebView 정리 (0) 2021.07.08 Android) Coroutine Exception Handling 어떻게 처리 할까 (0) 2021.06.27