Android

Android) KAPT를 대체할 KSP(Kotlin Symbol Process) 소개 with Kotlin DSL

가짜 개발자 2021. 7. 17. 19:18


What is KSP

  • KSP의 탄생 배경은 Kotlin 빌드 속도를 더 빠르게 하기 위함에 있습니다.
  • 컴파일에 있어, Kotlin이 자체적으로 Annotation Processing 시스템을 갖추고 있지 않는 것이 문제가 되었습니다.
  • KSPKAPT와 비슷한 기능을 제공하지만, 속도가 최대 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목표는 대부분의 안드로이드 개발자가 내부 작동 원리에 대해 신경 쓸 필요가 없도록 하는 것입니다.
  • KSPKAPT 사용 시 유일한 차이점은 아래와 같이 두 줄에 불과합니다.

 

 

  • 공식 문서를 더 자세히 살펴보면 KSP Kotlin에만 국한되지 않고 Java 클래스의 Parsing도 지원한다고 합니다.
  • 따라서 Java 클래스를 Parsing 하면 Kotlin 동일한 데이터가 생성됩니다.

 

KSP Supported Libraries

 

Limitations of KSP

  • KSP한계도 존재합니다. 아래는 KSP가 고려하는 사항이 아닙니다.

 

  1. 소스 코드의 표현 수준 정보를 조사
  2. 소스 코드 수정
  3. JAVA Annotation Processing API100% 호환 
  4. 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마이그레이션 하는 방법은 참고 바랍니다.

 

  1. 컴파일 타임에 에러 확인
  2. 코드 탐색
  3. 자동 완성
  4. 구문 강조
  5. 소스코드와 동일한 언어의 사용

 

  • 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() 메서드의 resolverSymbolProcessor에 심벌(어노테이션)과 같은 컴파일러 세부 정보에 대한 접근을 제공합니다.
  • finish() 메서드는 최종적인 단계로, 에러가 없을 시 프로세싱을 마무리 짓습니다.
  • onError() 메소드는 수행 후 에러를 처리합니다.

 


Preference

KSP 알파를 소개합니다

Announcing Kotlin Symbol Processing (KSP) Alpha

 

반응형