일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Kotlin
- Rxjava
- Compose
- Gradle
- 코드포스
- MiTweet
- 암호학
- textfield
- 코루틴
- relay
- GitHub
- Coroutine
- architecture
- android
- 백준
- pandas
- MyVoca
- Codeforces
- activity
- TEST
- livedata
- boj
- androidStudio
- Hilt
- ProGuard
- 쿠링
- 프로그래머스
- Python
- Coroutines
- AWS
- Today
- Total
이동식 저장소
[Hilt] Modules 본문
Hilt module은 Dagger의 module에 ``@InstallIn`` 어노테이션을 추가한 형태이다. 잠깐 복습: ``@InstallIn`` 어노테이션을 사용하면 module을 어느 component에 설치할 지, 즉 해당 module에 정의된 의존성을 어느 범위에서 사용할 수 있는지 지정할 수 있다.
``@InstallIn``
모듈에 ``@InstallIn`` 어노테이션을 붙일 수 있다. Hilt를 사용할 때는 모든 module에 ``@InstallIn``을 붙여야 한다. ``@InstallIn``이 없는 모듈은 어떠한 Hilt component에도 속하지 않고, 어쩌면 컴파일 에러가 날 수도 있다.
모듈을 ``SingletonComponent``에 설치하는 예시이다.
@Module
@InstallIn(SingletonComponent::class) // FooModule을 SingletonComponent에 설치한다.
object FooModule {
@Provides
fun provideBar(): Bar {...}
}
모듈이 특정 component에 설치되면 기본적으로 사용할 수 있는 바인딩이 주어진다. 예를 들어 ``SingletonComponent`` 안에서는 ``Application`` 바인딩을 사용할 수 있다.
@Module
@InstallIn(SingletonComponent::class)
object FooModule {
// SingletonComponent에 설치된 모듈 안에서는
// Application을 제공받을 수 있다.
@Provides
fun provideBar(application: Application): Bar {...}
}
모듈의 바인딩마다 scope를 정할 수 있다. Scope란 바인딩이 같은 객체를 제공하는 범위를 말한다. 예를 들어 ``ActivityScoped``된 바인딩은 하나의 activity 객체에 항상 같은 객체를 제공한다. 물론 다른 activity에는 다른 객체를 제공한다.
다음 코드를 보자. ``Singleton``에 scope된 ``provideBar()``는 앱 전체에서 항상 같은 객체를 제공한다.
@Module
@InstallIn(SingletonComponent::class) // FooModule을 SingletonComponent에 설치한다.
object FooModule {
@Provides
@Singleton
fun provideBar(): Bar {...}
}
하나의 모듈을 여러 component에 설치
모듈은 여러 component에 설치될 수 있다. 예를 들어 어떤 모듈을 ``ViewComponent``와 ``ViewWithFragmentComponent``에 설치할 수 있다. 물론 공통 조상 모듈에 설치해도 되지만, component의 위계질서를 무시하려는 의도가 아니라면 자제하는 편이 좋다.
모듈을 여러 component에 설치할 때 다음의 규칙을 지켜야 한다.
- 모듈에 정의된 바인딩은 모든 component가 지원하는 범위에만 scope될 수 있다. 예를 들어 ``ViewComponent``와 ``ViewWithFragmentComponent``는 모두 ``@ViewScoped``를 지원하지만, ``@ActivityScoped``는 지원하지 않는다.
- 모듈에 정의된 바인딩은 모든 component가 해당 바인딩에 접근할 수 있을 때에만 객체를 주입할 수 있다. 예를 들어 ``ViewComponent``와 ``ViewWithFragmentComponent``에 속한 바인딩은 ``View``를 주입할 수 있지만, ``ViewModel``은 주입할 수 없다.
- 하나의 모듈을 child와 ancestor component에 모두 설치할 필요는 없다. 조상 component에만 설치하면 child component에서도 접근할 수 있기 때문이다.
모듈을 여러 component에 설치하는 문법은 다음과 같다.
@Module
@InstallIn({
ViewComponent::class,
ViewWithFragmentComponent::class
}
)
object FooModule {
@Provides
@Singleton
fun provideBar(): Bar {...}
}
'Primary > Android' 카테고리의 다른 글
[Android] 디버깅할 때 앱이 느리다면 (0) | 2022.09.25 |
---|---|
[Hilt] Entry Points (0) | 2022.09.10 |
[Hilt] ViewModels (0) | 2022.08.29 |
[Hilt] Android Entry Points (0) | 2022.08.11 |
[Hilt] Application (0) | 2022.08.11 |