ABOUT ME

-

  • Android) KAPT를 대체할 KSP(Kotlin Symbol Process) 소개 with Kotlin DSL
    Android 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

     

    반응형

    댓글

Designed by Me.