이동식 저장소

[Hilt] Modules 본문

Primary/Android

[Hilt] Modules

해스끼 2022. 8. 29. 11:20

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
Comments