Hilt - DI

HEETAE HEO·2022년 7월 4일
0
post-thumbnail

Hilt

Hilt는 프로젝트에서 수동 종속 항목 삽입을 실행하는 상용구를 줄이는 Android용 종속 항목 삽입 라이브러리 입니다.

  • Koin : Runtime시 주입을 하는 방식인 Service Locatort 패턴을 사용합니다.

  • Hilt : 컴파일 타임에 주입에 대한 검증을 마치고 어플리케이션 시작 시 주입 시점 단 한번에 반영되는 형태로 구성되어 있습니다.

@HiltAndroidApp

해당 annotation은 우리가 사용하려는 애플리케이션, 구성 요소에 붙여줘야하는 모든 모듈의 진입점입니다. Hilt를 사용하기 위해서 반드시 붙여줘야하며 @AndroidEntryPoint와 유사하지만 애플리케이션 클래스에서만 작동합니다.

MyApplication.kt

@HiltAndroidApp
class MyApplication : Application(){
	// code 
}

생성된 이 Hilt 구성요소는 Application 객체의 수명 주기에 연결되어 이와 관련한 종속 항목을 제공합니다. 또한 상위 구성요소로 다른 구성요소는 이 상위 구성요소에서 제공하는 종속 항목에 액세스할 수 있습니다.

AndroidEntryPoint

Activity, Fragment, View, Service, BroadCast Receiver 등에 사용되는 annotation입니다.

Android 클래스에 @AndroidEntryPoint를 사용하면 해당 클래스에 종속된 Android 클래스에도 똑같이 적용해줘야합니다. 또한 Adapter와 같은 구성요소에서 종속 항목을 가지고 오려면 @Inject를 사용하여 필드 삽입을 실행해야합니다.

코드

MainActivity.kt

@AndroidEntryPoint
class MainActivity : AppCompatActivity(){
	@Inject lateinit var analytics : AnalyticsAdapter
    ...
}

InstallIn

InstallIn는 모듈에 컴포넌트를 추가하는 annotation입니다. @Module이나 @EntryPoint 주석이 있어야만 사용할 수 있으며 이 모듈에 추가할 컴포넌트를 선언할 수 있습니다.

코드

@Module
@InstallIn(SingletonComponent::class)
object MainObject {

	@Provides
    @Singleton
    fun repository() = Repository()
    
}

생성자 삽입이 불가능한 경우가 있습니다.

  1. 인터페이스를 사용하는 경우

  2. 외부 라이브러리의 클래스와 같이 소유하지 않은 유형을 사용하는 경우

이러한 경우에는 생성자 삽입이 불가능해 모듈에서 다른 방법을 통해 의존성을 주입해야합니다.

그 방법이 바로 위에 코드에 적혀있는 @Provides 입니다. 해당 annotation을 사용하면 Hilt에게 종속항목을 알려줍니다.

EntryPoint

Entry Point는 Hilt가 Inject하는 진입점입니다. Activity/Fragment 같이 Android Framework에 의해 제공되는 Component들은 @AndroidEntryPoint를 통해 진입점을 지정할 수 있고, 일반 객체들도 @Inject constructor를 정의하여 진입점을 만들어 Inject할 수 있습니다.

하지만 Hilt가 지원하지 않는 Class에 Inject할 경우가 존재하고 이를 해결하기 위해 EnrtryPoint를 설정해야합니다.


@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

  
}

Binds

Binds의 경우 Hilt에 아래 정보를 알려줍니다.

함수 Return type : 제공하는 인스턴스
함수 매개변수(Parameter) : 인스턴스의 종속 항목
함수 Body : 인스턴스를 제공하는 방법

WorkerInject

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()
    }

}

references

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

profile
Android 개발 잘하고 싶어요!!!

0개의 댓글