Mobile/Android(Kotlin)
[Android] Concept of DI Hilt. Dive into Hilt Components.
개발왕 금골드
2022. 11. 22. 23:17
반응형
Component Hierarchy
- 기존 Dagger와 달리 Hilt 사용자는 Dagger의 Components를 직접 정의하거나 인스턴스화하지 않는다.
- 대신 Hilt는 사용자를 위해 생성되는 미리 정의된 Components를 제공한다.
- Hilt는 안드로이드 애플리케이션의 다양한 라이프 사이클에 맞춰 자동으로 통합되는 Components(및 해당 Scope Annotaion) 세트가 제공된다.
- 아래 Diagram은 Hilt Component의 계층 구성도를 보여준다. 각 Component의 주석은 해당 Component의 수명으로 바인딩 범위를 지정하는 데 사용되는 범위 지정 주석이다.
- Component의 화살표는 하위 Components를 가리킨다. 일반적으로 하위 Components의 바인딩은 상위 Components의 바인딩에 종속될 수 있다.
- @InstallIn Module 내 바인딩 범위를 지정할 때 바인딩의 범위는 Components의 범위와 일치해야 한다.
Components used for Injection
- @AndroidEntryPoint와 같은 Hilt API를 사용하여 Android class를 주입할 때 표준 Hilt Components가 Injector로 사용된다.
- Injector로 사용되는 Components는 해당 Android class에 표시되는 바인딩을 결정한다.
Component lifetimes
- Components가 생성되고 삭제된 시점 사이로 scoped bindings의 생명주기를 제한한다.
- 생명주기는 members가 주입한 값을 사용할 수 시기를 나타낸다.
- 아래 표는 각 Component에 대한 Scoping과 제한된 생명주기를 나타낸다.
- Dagger는 기본적으로 unscoped이다. 그렇기 때문에 binding이 요청될 때마다 Dagger가 새로운 Binding Instance를 생성한다.
- 그러나, Dagger 역시 component를 scoped로 지정할 수 있다. scoped binding은 지정된 component의 Instance당 한 번만 생성되며 해당 binding에 대한 모든 요청은 동일한 Instance를 공유한다.
- 모듈에서 생성된 binding 역시 범위를 지정할 수 있다. 범위 주석이 달린 binding 선언만 범위가 지정된다.
@Module
@InstallIn(FragmentComponent.class)
object FooModule {
// This binding is "unscoped".
@Provides
fun provideUnscopedBinding() = UnscopedBinding()
// This binding is "scoped".
@Provides
@FragmentScoped
fun provideScopedBinding() = ScopedBinding()
}
- 범위 지정은 생성된 코드의 크기와 런타임 성능 모두에 비용이 든다. 때문에 일반적으로 정확히 필요한 경우에만 사용한다.
Component default bindings
참고자료 :
https://dagger.dev/hilt/components.html#component-hierarchy
반응형