Hilt는 매번 적용할 때마다 너무 복잡해서 화가 난다. 그래서 Kotlin 2.0으로의 전환 절차를 정리할 겸 하여 Hilt까지 같이 정리했다.
사실 Hilt의 KSP 대응은 완전히 끝난 건 아닌데, 2.4 후반부 버전부터 알파 느낌으로 KSP 사용이 가능하다고 한다. 보통은 KAPT를 많이 쓰는 것 같던데, KSP가 컴파일 시 KAPT에 비해 성능이 잘 나오는 것으로 알고 있다.
이 링크를 통해, Hilt에서 KSP를 사용하기 위한 요구 조건을 확인할 수 있다. 참고 바람.
먼저, 패키지 버전 카탈로그(libs.versions.toml)에 필요한 플러그인과 라이브러리의 버전을 명시해주어야 한다. 그 전에, 본인의 Kotlin 버전에 맞는 KSP 버전을 확인할 필요가 있다. 다음 링크에 가서 확인해보도록 하자. 비교적 최근에 업데이트된 Kotlin 버전과 그에 대응되는 KSP 버전은 아래와 같다:
적절한 KSP 버전을 확인했다면, 아래와 같이 패키지 버전 카탈로그를 수정하자:
(참고로, 플러그인과 라이브러리의 버전까지 정확하게 따라할 필요는 없다. 이 글은 2024년 11월 7일에 갱신된 것으로, 이후 업데이트에 따라 얼마든지 버전이 달라질 수 있음을 미리 알린다.)
[versions] # Plugins ksp = "2.0.10-1.0.24" # Libraries navigation = "2.8.3" hilt = "2.52" androidxHilt = "1.2.0"
[libraries] # Hilt androidx-navigation = { group = "androidx.navigation", name = "navigation-compose", version.ref = "nav" } androidx-hilt-navigation-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "androidxHilt" } dagger-hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" } dagger-hilt-android-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hilt"} dagger-hilt-android-gradle-plugin = { module = "com.google.dagger:hilt-android-gradle-plugin", version.ref = "hilt" }
[plugins] kotlin-ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } dagger-hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt"}
다음으로, 프로젝트 수준 build.gradle.kts(/build.gradle.kts)를 아래와 같이 수정한다:
// Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { // KSP 및 Hilt 플러그인 추가 alias(libs.plugins.kotlin.ksp) apply false alias(libs.plugins.dagger.hilt.android) apply false } // Hilt Android Gradle Plugin 적용 buildscript { dependencies { classpath(libs.dagger.hilt.android.gradle.plugin) } }
마지막으로, 모듈 수준 build.gradle.kts(/app/build.gradle.kts)를 아래와 같이 수정한다. Hilt 컴파일러만 ksp
로 선언하는 부분에 유의하자:
plugins { // KSP와 Hilt 플러그인 추가 alias(libs.plugins.kotlin.ksp) alias(libs.plugins.dagger.hilt.android) } dependencies { // 관련 플러그인들 추가 implementation(libs.dagger.hilt.android) ksp(libs.dagger.hilt.android.compiler) implementation(libs.androidx.navigation.compose) implementation(libs.androidx.hilt.navigation.compose) }
수정이 끝났으면, Gradle sync를 한 번 진행해준다.
가장 먼저, MainActivity.kt에 앱의 이름으로 클래스를 하나 만들고, @HiltAndroidApp
어노테이션을 달아 준다. 아래 코드를 참고:
@HiltAndroidApp
class MyApp : Application() // import android.app.Application
두 번째로, 앱의 진입점인 MainActivity
클래스에 @AndroidEntryPoint
어노테이션을 달아 준다. 아래 코드를 참고:
@HiltAndroidApp
class MyApp : Application()
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
MobileAppDevTheme {
// 애플리케이션 구현...
}
}
}
}
마지막으로, AndroidManifest.xml 파일의 application
블럭 아래에 android:name
항목을 추가한 후, 값으로 MainActivity.kt에 맨 처음 새로 추가했던 클래스 이름을 넣어준다.
그리고 반드시 클래스 이름 앞에 온점(.)을 적어두어야 한다. 예를 들어, @HiltAndroidApp
어노테이션이 붙은 클래스의 이름이 MyApp
이라면, AndroidManifest.xml에는 android:name=".MyApp"
으로 작성해야 한다.
아래를 참고:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:name=".MyApp"
</application>
</manifest>