#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