Hilt - compose 도입기

312·2024년 4월 14일

Hilt

목록 보기
1/3

기존에 사용하던 koin은 런타임에 의존성이 주입되어 특정 환경에서 stable하지 않거나, 디바이스의 성능에 영향을 받는다는 이슈가 있었다.
그래서 이번 프로젝트에는 compose kotlin 네이티브 개발환경에서 가장 대중적인 Hilt를 도입해보기로 했다.

1. 환경 구축

Project gradle

buildscript {
    dependencies {
        classpath("com.google.dagger:hilt-android-gradle-plugin:2.48")
    }
}

App gradle

plugins {
	...
    id("com.google.devtools.ksp")
    id("com.google.dagger.hilt.android")
    ...
}


dependencies {
	...
    // Hilt
    implementation("com.google.dagger:hilt-android:2.48")
    ksp("com.google.dagger:hilt-compiler:2.48")
    ksp("com.google.dagger:hilt-android-compiler:2.48")
	...
}

Gradle.kts에 환경에 맞는 버전의 Hilt를 추가해준다.

2. Application 클래스에 Hilt선언

MainApplication.class

@HiltAndroidApp
class MainApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        ...
    }
}

최상위인 애플리케이션 클래스에 @HiltAndroidApp 어노테이션을 추가해준다.
Application 클래스가 생략되는 경우가 있는데, 직접 생성하고 manifest에 선언해주면 된다.

3.Activity와 ViewModel에서 의존성 주입

MainActivity

@AndroidEntryPoint
class MainActivity : ComponentActivity() {

	private val mainViewModel by viewModels<MainViewModel>()
    ...
}
  

본격적으로 Hilt를 활용해 의존성을 주입할 수 있는 단계다!

@AndroidEntryPoint 어노테이션을 선언해줘야 액티비티를 Hilt로 필요한 의존성을 자동으로 주입하고, 적절한 시점에 컴포넌트를 인스턴스화 할 수 있게끔 해준다.

MainViewModel

@HiltViewModel
class MainViewModel @Inject constructor() : ViewModel() {
    ...
}

ViewModel 에서는 @HiltViewModel 어노테이션을 선언해준다.
해당 어노테이션을 통해 viewModel이 HiltViewModelFactory에서 생성 & 관리되고, @AndroidEntryPoint로 지정된 Activity나 Fragment에서 검색될 수 있다.

// 적용해보면서 느낀 koin과의 차이점..?

Koin에서는 Koin내부 클래스에서 모든 Activity와 ViewModel, Manager등의 모듈을 선언해주고 멤버변수로 활용할때마다 코드를 변경해야 했는데, Hilt에서는 어노테이션을 통해 의존성을 비교적 간단하게 주입할 수 있었다.

성능을 제외하고 관리적 측면에서는 Koin에서는 한눈에 어떻게 주입되는지 파악이 가능했다면, Hilt에서는 쉽고 실용적인 활용이 가능했던 것 같다.
다음에는 Hilt를 활용해 compose에서 Room 내부 데이터를 가져와보겠다..!

profile
안드로이드 개발자 이상일입니다.

0개의 댓글