본문 바로가기
개발 log (개발)/mobile

'Hilt' 의존성 주입

by abbear25 2020. 7. 14.

Gradle 추가

 

루트 경로

dependencies {
	classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
}

앱 경로

apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'

dependencies {
    //hilt used
    implementation "com.google.dagger:hilt-android:$hilt_version"
    kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
    //hilt test
    androidTestImplementation "com.google.dagger:hilt-android-testing:$hilt_version"
    kaptAndroidTest "com.google.dagger:hilt-android-compiler:$hilt_version"
}

컴파일 옵션 추가

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    ...
    
    defaultConfig {
        ...
        testInstrumentationRunner "com.example.android.hilt.CustomTestRunner"
    }

 

 

@HiltAndroidApp 추가

Hilt사용을 위해서는 Application에 해당 어노테이션을 반드시 추가

@HiltAndroidApp
class AppApplication : Application(){

}

 

@AndroidEntryPoint

Activity, Fragment, View, Service, BroadcaseReceiver에 종속 항목을 삽입할 수 있도록 지정

만약 상속하는 class 또는 해당 fragment를 사용하는 activity 있다면 동일하게 어노테이션을 필수로 지정

 

@Inject

종속 항목 삽입 (의존성을 주입받으려는 변수에 지정)

위의 AndroidEntryPoint로  종속 주입이 가능한 상태일 때만 사용가능 (onCreate() 또는 View#super() 순간 인스턴스 생성)

 

필드 주입

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {

  @Inject lateinit var analytics: AnalyticsAdapter
  ...

 

생성자 주입

class AnalyticsAdapter @Inject constructor(
	private val service: AnalyticsService) { 
    ...

 

@Module, @InstallIn, @Binds, @Provides

인터페이스 또는 외부 라이브러리 클래스는 생성자 삽입 불가능할 경우 사용

 

@InstallIn

어떤 표준 Component에 Module을 install할지 지정

 

@Binds

 인터페이스의 인스턴스를 제공해야할 때, 자신의 일부를 Hilt에게 알림

 만약에 Activity와 Service에서 동일 객체를 동시에 사용한다면 추가 바인딩 필요

//1. 인터페이스
interface AnalyticsService {
  fun analyticsMethods()
}

//2. 구현체, Hilt를 통한 생성자 주입을 위하여 생성자 추가
class AnalyticsServiceImpl @Inject constructor(
  ...
) : AnalyticsService { ... }

//3. 모듈 구현
@Module
@InstallIn(ActivityComponent::class) //activity에 사용될 것을 알림
abstract class AnalyticsModule {
  
  @Binds //인스턴스를 제공할 때 사용할 구현을 Hilt에 알림
  abstract fun bindAnalyticsService(
    analyticsServiceImpl: AnalyticsServiceImpl
  ): AnalyticsService
}

 

@Provides

 함수의 인스턴스를 제공해야할 때, 자신을 Hilt에게 알림

 Hilt는 해당 유형의 인스턴스를 제공할 때마다 함수 본문 실행

@Module
@InstallIn(ActivityComponent::class)
object AnalyticsModule {

  @Provides
  fun provideAnalyticsService(): AnalyticsService {
      return Retrofit.Builder()
               .baseUrl("https://example.com")
               .build()
               .create(AnalyticsService::class.java)
  }
}

 

@Qualifier

동일한 모듈이 있는 경우, 모호성을 피하기위해 지정자 사용

@Qualifier
annotation class InMemoryLogger

@Qualifier
annotation class DatabaseLogger

@InstallIn(ApplicationComponent::class)
@Module
abstract class LoggingDatabaseModule {

    @DatabaseLogger
    @Singleton
    @Binds
    abstract fun bindDatabaseLogger(impl: LoggerLocalDataSource): LoggerDataSource
}

@InstallIn(ActivityComponent::class)
@Module
abstract class LoggingInMemoryModule {

    @InMemoryLogger
    @ActivityScoped
    @Binds
    abstract fun bindInMemoryLogger(impl: LoggerInMemoryDataSource): LoggerDataSource
}

 

 

https://developer.android.com/training/dependency-injection/hilt-android?hl=ko

 

Hilt를 사용한 종속 항목 삽입  |  Android 개발자  |  Android Developers

Hilt는 프로젝트에서 수동 종속 항목 삽입을 실행하는 상용구를 줄이는 Android용 종속 항목 삽입 라이브러리입니다. 수동 종속 항목 삽입을 실행하려면 모든 클래스와 종속 항목을 수동으로 구성�

developer.android.com

 

반응형