@InstallIn 어노테이션은 Dagger-Hilt에서 사용되는 어노테이션으로, Hilt 모듈어디에 설치할 것인지 지정하는 역할을 합니다. 이 어노테이션은 Dagger-Hilt에서 DI (Dependency Injection) 설정을 쉽게 해주는 중요한 요소입니다.

 

 

기본 개념

Dagger-Hilt에서는 의존성 주입을 위해 여러 모듈을 정의하고, 이 모듈이 어떤 컴포넌트(범위)에 포함될지 지정해야 합니다. 이때 @InstallIn 어노테이션을 사용하여, 특정 모듈을 어떤 컴포넌트에 설치할 것인지 정의할 수 있습니다. @InstallIn은 기본적으로 @Component 또는 @Subcomponent와 같은 Dagger의 컴포넌트 개념에 대응됩니다.

 

사용 방법

Dagger-Hilt에서는 주로 다음과 같은 컴포넌트를 사용하여 의존성을 주입합니다:

  • SingletonComponent: 애플리케이션의 전체 생애 주기 동안 하나의 인스턴스만 유지되는 컴포넌트입니다.
  • ActivityComponent: 액티비티의 생애 주기 동안 의존성 주입을 관리하는 컴포넌트입니다.
  • FragmentComponent: 프래그먼트의 생애 주기 동안 의존성 주입을 관리하는 컴포넌트입니다.
  • ViewModelComponent: ViewModel의 생애 주기 동안 의존성 주입을 관리하는 컴포넌트입니다.

이 외에도 다양한 생애 주기별 컴포넌트가 존재합니다.

 

예시

1. @InstallIn(SingletonComponent::class)

SingletonComponent에 설치된 모듈은 애플리케이션 전역에서 한 번만 생성되어 사용됩니다. 주로 애플리케이션 단위로 한 번만 생성해야 하는 객체들에 대해 사용합니다.

 
@Module
@InstallIn(SingletonComponent::class)  // SingletonComponent에 설치
object NetworkModule {

    @Provides
    fun provideApiService(): ApiService {
        return Retrofit.Builder()
            .baseUrl("https://api.example.com")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }
}

 

이렇게 설정하면 ApiService는 애플리케이션의 전체 생애 주기 동안 하나의 인스턴스로만 존재하게 됩니다.

2. @InstallIn(ActivityComponent::class)

ActivityComponent에 설치된 모듈은 액티비티의 생애 주기에 맞춰 의존성을 관리합니다. 즉, 액티비티가 존재하는 동안에만 해당 객체가 존재합니다.

@Module
@InstallIn(ActivityComponent::class)  // ActivityComponent에 설치
object ActivityModule {

    @Provides
    fun provideSomeDependency(): SomeDependency {
        return SomeDependency()
    }
}
 

이렇게 설정하면 SomeDependency는 액티비티가 존재하는 동안에만 사용됩니다.

3. @InstallIn(ViewModelComponent::class)

ViewModelComponent에 설치된 모듈은 ViewModel의 생애 주기 동안에 의존성을 관리합니다. ViewModel이 생성되고 파괴될 때 해당 의존성도 주입되고 파괴됩니다.

 
@Module
@InstallIn(ViewModelComponent::class)  // ViewModelComponent에 설치
object ViewModelModule {

    @Provides
    fun provideGameRepository(): GameRepository {
        return GameRepositoryImpl()
    }
}

이렇게 설정하면 GameRepository는 ViewModel의 생애 주기 동안에만 사용됩니다.

요약

  • @InstallIn 어노테이션은 Hilt 모듈을 특정 컴포넌트에 설치하여 해당 컴포넌트의 생애 주기에 맞는 의존성 관리를 할 수 있게 합니다.
  • SingletonComponent, ActivityComponent, FragmentComponent, ViewModelComponent와 같은 다양한 컴포넌트를 사용하여 의존성의 생애 주기를 조절할 수 있습니다.
  • 이 방식은 Hilt의 의존성 주입을 더 효율적으로 관리할 수 있게 해주며, 주입할 객체의 범위를 명확하게 정의할 수 있게 해줍니다.

+ Recent posts