Jay's Developer Note

[Kotlin] kapt에서 KSP로 Migration 본문

Kotlin

[Kotlin] kapt에서 KSP로 Migration

Jay(J) 2023. 12. 13. 01:31
728x90

kapt에서 KSP로 Migration

게시글들을 보면 Gradle에 dependency를 추가할 때 kapt를 추가하는 곳이 있고 ksp를 추가하는 곳이 있다.

kapt는 the Kotlin Annotation Processing Tool의 약자로 Kotlin에서 Java Annotation Processor를 사용하여 Annotation들을 사용할 수 있도록 해준다. 그 과정에서 Stub을 생성하는데 이게 빌드 속도에 큰 영향을 준다.

KSP는 Kotlin Symbol Processing의 약자로 kapt와 같은 역할을 하지만! Kotlin 코드를 직접 분석하기 때문에 빌드 속도가 훨씬 빠르다.

kapt를 사용할 때는 3초가 걸린 반면 KSP를 사용하면 2초 만에 빌드가 완료된 것을 볼 수 있다.

이렇게 빌드 시간을 단축시켜 주는 KSP는 kapt와 같이 사용할 수도 있기는 한데.. 안타깝게도 kapt가 우선순위가 더 높은지 빌드를 kapt로 하게 되어 성능 향상의 의미가 없다.

DataBinding을 사용하는 프로젝트라면 뒤로 가기 버튼을.. :)

 

그래서 DataBinding을 사용하는 프로젝트는 굳이 KSP를 사용할 필요가 없다. 혹은 혼용해서 사용할 필요가 없다. 이유는 DataBinding에서는 kapt를 사용하고 있고 유지보수 모드로 돌아가고 있어서 앞으로 KSP는 지원할 계획이 없다고 했기 때문이다.

자세한 내용은 여기에서 볼 수 있다.

모듈로 따로 분리하여 빌드 속도에 미치는 영향을 줄일 수는 있으나.. 현시점에서는 '굳이'? 싶다.

사실 KSP Migration도 kapt가 유지보수 단계로 들어갔기 때문에 장기적으로 봤을 때 권고되는 것이지 필수는 아직 아니기 때문이다.

언젠간 때가 되면 DataBinding에서 KSP 지원을 해줄지도 모르고, 정 안되면 Jetpack Compose로 갈아타면 된다. 혹은 더 좋은 툴킷이 나오거나..

만약 프로젝트의 빌드 속도를 향상시키고 싶다면 아래 스크린샷들을 보고 KSP를 고려해 보는 것도 좋을 것이다.

Build Analyzer

kapt를 사용하여 빌드했을 때 어떤 항목들을 얼마 만에 빌드했는지를 보여주는 화면이다.

총 3.3초의 시간이 걸렸고 Kotlin 빌드만 2초가 걸렸다.

그중 Kotlin Task에 :app:kaptGenerateStubsDebugKotlin0.4초 동안 빌드되었다는 것을 알 수 있다.

kapt가 프로세서들을 생성하는 과정이 추가되었다는 의미로 볼 수 있다.

다음은 KSP의 Build Analyzer를 보도록 하자.

총 2.7초의 시간이 걸렸고 Kotlin 빌드만 1.5초가 걸렸다.

KSP의 Build Analyzer에서는 kapt에서 발견했던 :app:kaptGenerateStubsDebugKotlin이 없는 것을 알 수 있다.

Task 1개가 빠졌기 때문에 속도가 훨씬 빠를 수밖에 없다.

테스트했던 프로젝트는 Base로 그냥 만들어진 프로젝트에서 했기 때문에 큰 차이가 없을 수 있다.

하지만 규모가 커지거나 PC성능이슈가 있을 경우 아주 큰 차이를 느낄 수 있을 것이다.

뭐야 이렇게 빨라진다고? 얼른 적용해야지

라고 생각했다면 아주 좋은 Attitude다.👍

 

하. 지. 만! Migration 하기 전에 kapt를 사용하는 Library들이 KSP를 지원하는지를 우선 확인해야 한다!

 

기껏 바꿔놨는데 Library에서 지원하지 않는다면 말짱 도루묵이기 때문이다.

현재 공식적으로 공개된 KSP 지원 Library는 아래와 같다.

Room Moshi RxHttp
Kotshi Lyricist Lich SavedState
gRPC Dekorator EasyAdapter Koin
Glide Micronaut Epoxy
Paris Auto Dagger SealedX
DeeplinkDispatch Dagger Hilt

Dagger/Hilt는 현재 Alpha 단계이다.

 

이제 프로젝트에 KSP를 추가하고 kapt를 지워주면 된다

KSP 관련 Plugin 추가

2곳의 plugins를 추가해야 한다.

먼저, project단의 build.gradle 파일 plugins 블록 안에 아래 코드를 추가한다.

plugins {
  ...
  id("com.google.devtools.ksp") version "1.8.10-1.0.9" apply false
  ...
}

version 값은 여기에서 더 자세하게 확인할 수 있다. 하이픈을 기준으로 앞에는 Kotlin Compiler version이고 뒤에는 KSP version이다.

그다음은 module단의 build.gradle 파일 plugins 블록 안에 아래 코드를 추가한다.

plugins {
  ...
  id("com.google.devtools.ksp")
  ...
}
kapt to KSP

이제 dependencies 블록 안에 있는 kapt들을 KSP들로 바꿔주면 된다.

dependencies {
  ...
  // kapt("androidx.room:room-compiler:2.5.0")
  ksp("androidx.room:room-compiler:2.5.0")
  ...
}

Room의 경우는 간단하게 DependencyHandler를 바꿔주면 된다.

! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !

Room과는 다르게 kapt와 KSP가 다른 경우가 있다. Glide가 대표적인 Library 중 하나다. Glide의 자세한 내용은 여기에서 볼 수 있다.

dependencies {
  kapt("com.github.bumptech.glide:compiler:4.14.2")
  ksp("com.github.bumptech.glide:ksp:4.14.2")
}

또한, Glide를 포함해서 kapt에서 KSP로 넘어오면서 API 가 동일하지 않을 수 있다.

꼭 Sync Now를 한 후 빌드를 해서 정상적으로 기능들이 돌아가는지 확인을 해볼 필요가 있다.

kapt 관련 내용들 삭제

KSP로 완전히 변경 완료되었다면 이제 기존 kapt와 관련된 내용들을 전부 지워주면 된다.

plugins {
  id("org.jetbrains.kotlin.kapt")
}

kapt {
  correctErrorTypes = true
  useBuildCache = true
}

마치며

Room을 사용하려고 찾아보다 샘플에 kapt와 KSP가 있길래 찾아보면서 정리하게 되었다.

나중의 나를 위하여.

728x90