KSP로 Hilt 적용하기 - Jetpack Compose

Shawn Kang·2024년 9월 13일
0

Jetpack Compose

목록 보기
4/5

개요

Hilt는 매번 적용할 때마다 너무 복잡해서 화가 난다. 그래서 Kotlin 2.0으로의 전환 절차를 정리할 겸 하여 Hilt까지 같이 정리했다.

사실 Hilt의 KSP 대응은 완전히 끝난 건 아닌데, 2.4 후반부 버전부터 알파 느낌으로 KSP 사용이 가능하다고 한다. 보통은 KAPT를 많이 쓰는 것 같던데, KSP가 컴파일 시 KAPT에 비해 성능이 잘 나오는 것으로 알고 있다.

이 링크를 통해, Hilt에서 KSP를 사용하기 위한 요구 조건을 확인할 수 있다. 참고 바람.

절차

패키지 버전 카탈로그 갱신

먼저, 패키지 버전 카탈로그(libs.versions.toml)에 필요한 플러그인과 라이브러리의 버전을 명시해주어야 한다. 그 전에, 본인의 Kotlin 버전에 맞는 KSP 버전을 확인할 필요가 있다. 다음 링크에 가서 확인해보도록 하자. 비교적 최근에 업데이트된 Kotlin 버전과 그에 대응되는 KSP 버전은 아래와 같다:

  • Kotlin 2.0.10 - KSP 1.0.24
  • Kotlin 2.0.21 - KSP 1.0.26

적절한 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(/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 갱신

마지막으로, 모듈 수준 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를 한 번 진행해준다.

소스에 Hilt 관련 변경 사항 반영

가장 먼저, 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>
profile
i meant to be

0개의 댓글