Hilt는 프로젝트에서 수동 종속 항목 삽입을 실행하는 상용구를 줄이는 Android용 종속 항목 삽입 라이브러리 입니다.
Koin : Runtime시 주입을 하는 방식인 Service Locatort 패턴을 사용합니다.
Hilt : 컴파일 타임에 주입에 대한 검증을 마치고 어플리케이션 시작 시 주입 시점 단 한번에 반영되는 형태로 구성되어 있습니다.
해당 annotation은 우리가 사용하려는 애플리케이션, 구성 요소에 붙여줘야하는 모든 모듈의 진입점입니다. Hilt를 사용하기 위해서 반드시 붙여줘야하며 @AndroidEntryPoint와 유사하지만 애플리케이션 클래스에서만 작동합니다.
MyApplication.kt
@HiltAndroidApp
class MyApplication : Application(){
// code
}
생성된 이 Hilt 구성요소는 Application 객체의 수명 주기에 연결되어 이와 관련한 종속 항목을 제공합니다. 또한 상위 구성요소로 다른 구성요소는 이 상위 구성요소에서 제공하는 종속 항목에 액세스할 수 있습니다.
Activity, Fragment, View, Service, BroadCast Receiver 등에 사용되는 annotation입니다.
Android 클래스에 @AndroidEntryPoint를 사용하면 해당 클래스에 종속된 Android 클래스에도 똑같이 적용해줘야합니다. 또한 Adapter와 같은 구성요소에서 종속 항목을 가지고 오려면 @Inject를 사용하여 필드 삽입을 실행해야합니다.
MainActivity.kt
@AndroidEntryPoint
class MainActivity : AppCompatActivity(){
@Inject lateinit var analytics : AnalyticsAdapter
...
}
InstallIn는 모듈에 컴포넌트를 추가하는 annotation입니다. @Module이나 @EntryPoint 주석이 있어야만 사용할 수 있으며 이 모듈에 추가할 컴포넌트를 선언할 수 있습니다.
@Module
@InstallIn(SingletonComponent::class)
object MainObject {
@Provides
@Singleton
fun repository() = Repository()
}
생성자 삽입이 불가능한 경우가 있습니다.
인터페이스를 사용하는 경우
외부 라이브러리의 클래스와 같이 소유하지 않은 유형을 사용하는 경우
이러한 경우에는 생성자 삽입이 불가능해 모듈에서 다른 방법을 통해 의존성을 주입해야합니다.
그 방법이 바로 위에 코드에 적혀있는 @Provides 입니다. 해당 annotation을 사용하면 Hilt에게 종속항목을 알려줍니다.
Entry Point는 Hilt가 Inject하는 진입점입니다. Activity/Fragment 같이 Android Framework에 의해 제공되는 Component들은 @AndroidEntryPoint를 통해 진입점을 지정할 수 있고, 일반 객체들도 @Inject constructor를 정의하여 진입점을 만들어 Inject할 수 있습니다.
하지만 Hilt가 지원하지 않는 Class에 Inject할 경우가 존재하고 이를 해결하기 위해 EnrtryPoint를 설정해야합니다.
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
}
Binds의 경우 Hilt에 아래 정보를 알려줍니다.
함수 Return type : 제공하는 인스턴스
함수 매개변수(Parameter) : 인스턴스의 종속 항목
함수 Body : 인스턴스를 제공하는 방법
WorkManager도 이 어노테이션을 통해 쉽게 사용할 수 있습니다. WorkerInject는 WorkManger와 함께 worker를 주입하는데 사용할 수 있는 HiltWorkerFactory를 생성하게 됩니다. 이 어노테이션과 @Assisted 어노테이션을 사용하여 생성자에 Context와 WorkerParameter를 넣어주기만 하면됩니다.
class MyWorker @WorkerInject constructor(
private val repository: Repository,
@Assisted private val context: Context,
@Assisted private val workerParameters: WorkerParameters
) : Worker(context, workerParameters)
그리고 해당 작업을 실행하려면 실행하고자 하는 지점에 HiltWorkerFactory를 주입하면됩니다.
@HiltAndroidApp
class FooApplication : Application(), Configuration.Provider {
@Inject
lateinit var workerFactory: HiltWorkerFactory
override fun getWorkManagerConfiguration(): Configuration {
return Configuration.Builder().setWorkerFactory(workerFactory).build()
}
}
https://developer.android.com/training/dependency-injection/hilt-android?hl=ko
https://medium.com/hongbeomi-dev/dagger-hilt-%EC%B2%AB-%EA%B1%B8%EC%9D%8C-daaa925deca4