Back to list

#04-A. @InstallIn과 생명주기, @Qualifier

목차3

개요

이전 글에서 다루지 못하였던 주제들에 대한 정리. 이번 글에서는:

  • @InstallIn과 컴포넌트 생명주기
  • @Qualifier

@InstallIn과 컴포넌트 생명주기

Hilt에서 @Module을 사용할 때, 반드시 @InstallIn Annotation과 함께 사용되어야 한다. 이 Annotation은 해당 모듈이 관리하는 의존성들의 생명주기를 결정한다.

  • SingletonComponent
    • 앱 전체에 걸친 수명주기를 갖는다. 앱이 켜질 때 단 한번 생성되고, 종료될 때 함께 파괴된다.
    • 앱 전역에서 하나만 존재해야 하는 자원에 붙는다.
  • ViewModelComponent
    • ViewModel의 수명 주기와 동일하다.
    • ViewModel은 다른 컴포넌트와는 다른, 독특한 수명주기를 가지고 있으므로 이 옵션의 존재는 당연해보인다.
  • ActivityComponent
  • Activity의 수명 주기를 따른다.
  • SAA(Single Activity Architecture) 구조를 추구하는 오늘날의 아키텍처에서는 여러 번 사용될 일이 없다.
@Module
@InstallIn(SingletonComponent::class) // 앱 전역에서 단일 인스턴스로 관리됨
object NetworkModule {
    // NOTE
    // InstallIn과 상관 없이, 단일 인스턴스로 공유하고 싶다면 @Singleton 스코프 명시 필요
}

@Qualifier

@Qualifier“같은 타입이지만 서로 다른 객체” 를 Hilt가 구별할 수 있도록 붙이는 이름표 개념이다. 예를들어 네트워크 통신 과정에서, 종종 ‘인증된 클라이언트’와 ‘비인증된 클라이언트’를 구분해야 하는데 둘 모두 동일한 HttpClient의 구현체이다. 따라서 Hilt가 HttpClient의 주입을 시도할 때, “어떤 HttpClient의 구현체”를 주입해야하는지 명확하지 않은 경우가 생길 수 있다.

이 경우, 우선 아래와 같이 2개의 이름표를 마련해둘 수 있다:

  @Qualifier
  @Retention(AnnotationRetention.BINARY)
  annotation class AuthHttpClient      // 인증 클라이언트용

  @Qualifier
  @Retention(AnnotationRetention.BINARY)
  annotation class DefaultHttpClient   // 비인증 클라이언트용

모듈에서는 각 HttpClient의 생성 메서드(팩토리)를 둔다:

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

  @Provides
  @Singleton
  @DefaultHttpClient
  fun provideDefaultHttpClient(): HttpClient {
      return HttpClient(CIO) { ... }
  }

 @Provides
  @Singleton
  @AuthHttpClient
  fun provideAuthHttpClient(): HttpClient {
      return HttpClient(CIO) { ... }
  }
}

마지막으로, 실제 API 호출 시에는 @Inject Ctor를 사용하되, 아래처럼 “어떤 HttpClient가 필요한지”를 명시해준다:

  class AppApi @Inject constructor(
      @param:AuthHttpClient private val client: HttpClient,
      @param:DefaultHttpClient private val defaultClient: HttpClient
  ) { ... }

여기서, 그냥 @AuthHttpClient만 사용할 경우, 이 Annotation이 val을 위한 것인지, HttpClient를 위한 것인지 명확히 해달라는 경고문을 보게 된다 — 이를 Kotlin 언어의 ‘Annotation 적용 대상 모호성(Use-site Target)’ 문제라고 함. 이때, 앞에 param:을 붙여주면 “이 Annotation은 생성자 파라미터 타입에 적용하라”는 메시지를 명시할 수 있어 경고가 사라지게 된다.

컴파일 에러는 아니지만, 특히 AI가 작업할 때 이 부분을 빼먹을 가능성이 높으니 주의.

Comments

링크가 복사되었습니다