개발일지

Android in A..Z - Hilt (Module) 본문

Android (안드로이드)/Hilt

Android in A..Z - Hilt (Module)

강태종 2021. 3. 18. 05:03

Hilt Module

생성자를 사용할 수 없는 Class를 주입해야 하는 경우 @Inject 생성자를 정의할 수 없습니다. (Interface, Builder를 통해 생성되는 Class, 외부 라이브러리 클래스 등)

=> Hilt Module을 통해 Class를 어떻게 얻는지 정의하여 의존성을 주입할 수 있습니다.


@Module, @Installin

@Module로 지정된 Class는 Hilt에게 인스턴스를 제공하는 방법을 알려줍니다.

@Module로 지정된 Class는 @Installin을 지정하여 각 모듈이 어떤 Scope에서 사용되는지 알려야 합니다.

 

@Provides

외부 라이브러리에서 제공되거나 Builder 패턴으로 제공되는 경우 @Provides를 통해 인스턴스를 제공하는 방법을 알려줄 수 있습니다.

@Module
@InstallIn(SingletonComponent::class)
class DatabaseModule {
    @Singleton
    @Provides
    fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase {
        return AppDatabase.getInstance(context)
    }

    @Provides
    fun provideSummonerEntityDao(appDatabase: AppDatabase): SummonerEntityDao {
        return appDatabase.summonerEntityDao()
    }
}

 

@Binds

인터페이스를 제공하는 경우 @Inject 생성자를 만들 수 없지만 @Binds를 통해 인스턴스를 제공하는 방법을 알려줄 수 있습니다.

 

  • abstract fun으로 알려주며 해당 함수를 가진 Module은 abstract class여야 합니다.
  • 함수 매개변수가 반활된 인스턴스입니다.
  • 함수 반환형이 어떤 인터페이스의 인스턴스를 제공하는지 Hilt에게 알려줍니다.
interface AnalyticsService {
  fun analyticsMethods()
}

// Constructor-injected, because Hilt needs to know how to
// provide instances of AnalyticsServiceImpl, too.
class AnalyticsServiceImpl @Inject constructor(
  ...
) : AnalyticsService { ... }

@Module
@InstallIn(ActivityComponent::class)
abstract class AnalyticsModule {

  @Binds
  abstract fun bindAnalyticsService(
    analyticsServiceImpl: AnalyticsServiceImpl
  ): AnalyticsService
}

@Qualifier

동일한 유형에 대한 여러 결합을 제공해야 하는 경우가 있을 수도 있습니다. 예를들어 데이터를 Server에 저장하는 방법(ServerDataSource)과 Local에 저장하는 방법(LocalDatabase)이 있다고 가정했을 때 두가지 경우를 사용할 경우 Hilt는 어떤 DataSource를 제공할지 알 수 없습니다.

@Qulifier와 annotation class를 사용하여 해결할 수 있습니다.

@Qualifier
annotation class LocalDatabase

@Qualifier
annotation class ServerDatabase

interface DataSource {
    fun select()
    fun update()
    fun delete()
}

class LocalDataSource @Inject constructor() : DataSource {
    override fun select() {

    }

    override fun update() {

    }

    override fun delete() {

    }
}

class ServerDataSource @Inject constructor() : DataSource {
    override fun select() {

    }

    override fun update() {

    }

    override fun delete() {

    }
}

@Module
@InstallIn(SingletonComponent::class)
abstract class DataSourceModule() {
    @Binds
    @LocalDatabase
    abstract fun provideLocalDatabase(localDataSource: LocalDataSource): DataSource

    @Binds
    @ServerDatabase
    abstract fun provideServerDatabase(serverDataSource: ServerDataSource): DataSource
}
@AndroidEntryPoint
class MainFragment : BaseFragment<FragmentMainBinding>(R.layout.fragment_main) {
    @Inject
    @LocalDatabase
    lateinit var database: DataSource
}

Git (예제코드)

github.com/KangTaeJong98/Example/tree/main/Android/Hilt

 

KangTaeJong98/Example

My Example Code. Contribute to KangTaeJong98/Example development by creating an account on GitHub.

github.com

 

'Android (안드로이드) > Hilt' 카테고리의 다른 글

Android in A..Z - Hilt (Entry Point)  (0) 2021.03.30
Android in A..Z - Hilt (Component)  (0) 2021.03.18
Android in A..Z - Hilt (개념)  (0) 2021.03.18
Comments