Dagger-Hilt란?

KIMGEUNTAE·2022년 12월 22일
2

Dagger-Hilt

Hilt는 Google에서 제공하는 DI 라이브러리 Dagger를 기반으로 만들어짐
Dagger2에 비해서 좀 더 이해하기 쉽고 사용하기가 쉬움
그리고 구글에서 적극적으로 지원하고 있어서 Compose에도 맞고 내 생각에도 아직은 알파 베타만 나오지만 지원을 하고 있으니 꼭 파고들어야 할듯

의존성 주입에 필요한 요소들

  • Application class
    : Hilt를 사용하는 모든 앱은 @HiltAndroidApp 어노테이션을 Application Class에 반드시 추가해야 하며 의존성 주입의 시작점을 지정 함
    Hilt는 Application 생명 주기를 따르며 컴파일 단계 시 DI에 필요한 구성요소들을 초기화 하기 위함

    @HiltAndroidApp
    class GeunTaeHobbyApplication : Application()

    클래스를 만들어 설절을 하고 AndroidManifest.xml 에 이름을 설정
    <application
          android:name=".GeunTaeHobbyApplication"
          ...
    </application>

  • AndroidEntryPoint :
    종속 주입이 필요한 Activity에는 @AndroidEntryPoint 주석으로 선언하여
    Hilt 주입에 필요한 구성요소를 생성함 주입의 시작점을 알림

    @AndroidEntryPoint
    class MainActivity : AppCompatActivity() {
    ...
    }

Dagger-Hilt에 사용되는 개념

* injection
* Modules
* Binds
* Provides
* Qualifiers
* Components
* ViewModel

Inject Constructor

1.

  • 클래스의 생성자에서 @Inject 어노테이션을 사용하여 의존성을 생성하는 방법이며
    생성자 constructor()@Inject 어노테이션으로 의존성 인스턴스를 생성하고, 생성자의 파라미터로 의존성을 주입받을 수도 있으며 생성 시 어떤 클래스 객체가 필요한지 Hilt도 개발자도 알 수가 있음

class HomeAssetDataSource @Inject constructor(
    private val assetLoader: AssetLoader
) : HomeDataSource {
  ...
    }
}

Field Injection

1.

  • 객체가 Hilt에 의해 주입 받을 수 있는 클래스 라는 것을 알리기 위해 붙여줌

// 해당 클래스에 생성하지 않아도 객체를 주입 받아 사용이 가능 한 것
@Inject lateinit var homeAssetDataSource: HomeAssetDataSource

Method Injection

1.

  • 파라미터에 주입해서 쓰는 것이며 Dagger2랑 똑같이 주입에서 대부분 쓰이는 주입은 생성자 주입이랑 필드 주입을 많이 쓰임

// 파라미터에 주입해서 쓰는 것
  @Inject
  fun directToDatabase(databaseService: DatabaseService) {
  atabaseService.log("Method Injection")
}

Binds

1.

  • Binds 방식은 Provide와는 다르게 interface타입의 객체에 Hilt에게 알려주기 위한 용도 이며 외부라이브러리에는 사용이 불가하며 추상적으로 사용

//interface 타입의 객체를 어떻게 만드는지 Hilt에게 알려주기 위한 용도
 @Binds
 abstract fun bindCartItemDataSource(
 dataSource: CartItemLocalDataSource
 ): CartItemDataSource

Modules

1.

@Module@InstallIn 선언은 아래와 같은 형태로 선언되며 @InstallIn 안에 들어가는 Hilt 컴포넌트들과 자세한 내용은 아래에서 설명을 이어가겠습니다.

  • Dagger2와는 다르게 Hilt 모듈은 @Module을 하고 추가로 @InstallIn(component) 어노테이션을 지정하여 어떤 컴포넌트에 install 할지를 반드시 정해야 함

그리고 @InstallIn(component)는 생명주기를 내부적으로 자동으로 관리해주기 때문에 환경을 제공해줌

밑에는 공식에서 가져온 것

해당 주기에 맞게 설정을 하면 됨

2. Scope

  • 매번 객체를 주입 할 때 마다 객체를 새롭게 생성하는 것이 아니라 해당 Scope 내에서 사용 할 수 있도록 하는 것

그리고

Provides

1.

  • Binds는 안되지만 Provides는 외부에서 모듈을 주입 받는 것이 가능
    Room DB, Retrofit, Gson, Application, Context 등이 가능
    인자에 application을 넣어주면 Hilt가 알아서 넣어준다고 함

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

    @Provides
    @Singleton
    fun providesAssetLoader(@ApplicationContext appContext: Context): AssetLoader =
        AssetLoader(appContext)

    @Provides
    @Singleton
    fun provideTodoAssetDataSource(assetLoader: AssetLoader): HomeAssetDataSource {
        return HomeAssetDataSource(assetLoader)
    }

    @Provides
    @Singleton
    fun provideTodoAssetRepository(assetDataSource: HomeAssetDataSource): HomeRepository {
        return HomeRepository(assetDataSource)
    }

}

Qualifiers

1.

  • Dagger2 에서는 @Named("Identifier") Annotation을 썻던 거랑 비슷 한거 같은 타입에 객체를 구별하게 해주는 것

@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class CallInterceptor

 @ResponseInterceptor
 @Provides
 fun provideResponseNetworkService(): NetworkService {
     return NetworkService.Builder()
         .host("google.com")
         .protocol("HTTPS")
         .interceptor(ResponseInterceptorImpl())
          .build()
  }

 @CallInterceptor
 @ResponseInterceptor
 @Inject lateinit var networkService: NetworkService

ViewModel

1.

  • @HiltViewModel 어노테이션과 @Inject 어노테이션을 사용하면 간단하게 ViewModel 의존성 주입을 활성화 할 수 있음
    @HiltViewModel에 의존성을 주입하면 기존에 쓰는 ViewModel에 팩토리 패턴을 만들어 준 것을 삭제 해도 됨 지원을 해주기 때문에

그리고

옛날 버전에는 @HiltViewModel 아니라 Inject을 넣어서 사용 했음 버전이 올라가면서 삭제됨


@HiltViewModel
class CartViewModel @Inject constructor(
    private val cartRepository: CartRepository
) : ViewModel() {

   ...
}

참고

https://0391kjy.tistory.com/55
https://developer88.tistory.com/349
https://salmonpack.tistory.com/41?category=1118477
https://developer.android.com/training/dependency-injection/hilt-android?hl=ko

profile
Study Note

0개의 댓글