안드로이드 공식 문서에 보면 Hilt는 프로젝트에서 종속 항목 수동 삽입을 실행하는 상용구를 줄이는 Android용 종속 항목 삽입 라이브러리라고 적혀있다. 기존에 dagger라는 라이브러리가 있었지만 dagger에서는 안드로이드의 생명주기를 고려하는 의존성 주입은 없어서 따로 구현해야 했다.
우선 Hilt 같은 경우 초기 설정이 중요하다. 필자는 설정하면서 안드로이드판 Spring이 아닌가 생각이 들었다. Hilt는 에러를 자세하게 알려주지 않고 설정이 꽤나 복잡하다.
우선 Inject 하는 방법으로는
이렇게 두 가지 방법이 있지만 이 글에서는 Constructor Injection 예시를 들어보고자 한다.
plugins {
...
id 'com.google.dagger.hilt.android' versiono '2.44' apply false
}
plugins {
id 'kotlin-kapt'
id 'com.google.dagger.hilt.android'
}
dependencies {
implementation "com.google.dagger:hilt-android:2.44"
kapt "com.google.dagger:hilt-compiler:2.44"
}
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
@HiltAndroidApp
class ExampleApplication: Application() {
...
}
그리고 Manifest에 application 쪽에
android:name=".ExampleApplication"
해당 코드를 작성하는 것을 까먹으면 안 된다!
@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
...
}
interface ExampleRepository {
fun test()
}
class ExampleRepoImpl: ExampleRepository {
override fun test() {
Log.d("TAG", "test: This is test")
}
}
@Module
@InstallIn(SingletonComponent::class)
object ExampleModule {
@Provides
@Singleton
fun provideExampleRepository(): ExampleRepository = ExampleRepoImpl()
}
ExampleRepository가 들어가는 곳에는 ExampleRepoImpl()을 넣어 의존성을 주입한다.
class ExampleUseCase @Inject constructor(private val repository: ExampleRepository){
fun execute() {
repository.test()
}
}
여기서 @Inject를 통해 repository 자리에 ExampleRepoImpl()이 들어간다.
@HiltViewModel
class ExampleViewModel @Inject constructor(private val exampleUseCase: ExampleUseCase) : ViewModel() {
fun doTest() {
exampleUseCase.execute()
}
}
ViewModel에서는 @HiltViewModel 주석을 달아주어야 한다.
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel: ExampleViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel.doTest()
}
}
결과가 정상적으로 나오는 것을 확인할 수 있다.