์์ฆ Hilt๋ฅผ ์ฌ์ฉ ์ค์ธ๋ฐ, ์๊พธ ๋ฌด์์์ ์ผ๋ก `@Provides`, `@Binds`๋ฅผ ๋ถ์ด๋ ๊ฒ ๊ฐ์ ์ด๋ฒ์ ์ข ์์ธํ ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ๊ฒ ๋ค.
Hilt์ ๋ํ ํฌ์คํ ์ ์ด์ ์ ์ธ ๊ฐ์ ๋ ํ๋๋ฐ, ๊ทธ๊ฑฐ๋์ ๋ณ๊ฐ๋ก ์ฌ๋ฆฐ๋ค. Hilt๋ ์ปดํ์ผ ํ์์ Hilt ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ๋ง๋ ๋ค. ๊ทธ๋์ ์ด๋ ธํ ์ด์ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ ์ปดํ์ผ๋ฌํํ ์๋ฆฐ๋ค. ์ด๋ ์์กด์ฑ ์ ๊ณต ๋ฐฉ์์ผ๋ก @Provides์ @Binds๊ฐ ์๋ค. ์ด์ธ์ ๊ฒ๋ ์์ง๋ง ์ด๋ฒ์๋ ์ด ๋๊ฐ๋ง ๋ณด๊ฒ ๋ค.
# `@Provides`
์๋ ๋ฉ์๋ ๋ณธ๋ฌธ์์ ๊ฐ์ฒด ์์ฑ, ๋ฐํ์ด ๊ฐ๋ฅํ๋ค. ๊ฐ์ฒด ์์ฑ ๋ฐฉ๋ฒ์ ์ ์ํ ์ ์๋ ๊ณณ์ ๋ถ์ด๊ณ , ๊ทธ๋์ abstract๋ก ์ ์ํ ๋ชจ๋์๋ ๋ชป๋ถ์ธ๋ค... ์ด๊ธฐํ๋ก์ง์ด ์ง์ ์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ์ @Provides๋ก ์ง์ ํด์ ์ฌ์ฉํ๋ค.
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Provides
@Singleton
fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl(BuildConfig.MOCK_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
}
object๋ก ์ ์ธ๋ ๋ชจ๋์์ ์กด์ฌํ๋ฉฐ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํด์ ๋ฐํํ๋ค.
๋ณต์กํ ์ด๊ธฐํ๋ก์ง์๋ ์ฌ์ฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ก์ปฌ DB์ธ Room DB์ ์ ๊ทผํด์ผ๋๋ค๋ฉด Room Builder๋ฅผ ํตํด AppDatabase ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์์ผ๋๋๋ฐ, ์ด๋๊ฐ ์๋ง์ @Provides ์ฌ์ฉ์ฒ๋ผ๊ณ ํ ์ ์๋ค.
@Provides
@Singleton
fun provideDatabase(@ApplicationContext context: Context): AppDatabase {
return Room.databaseBuilder(context, AppDatabase::class.java, "test_db")
.addCallback(object : RoomDatabase.Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
Executors.newSingleThreadExecutor().execute {
val database = provideDatabase(context)
val initialData = listOf(/* ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ค๋ค */)
database.dataDao().insertAll(initialData)
}
}
})
.build()
}
@Provides๊ฐ ๋ถ์ ๋ชจ๋์ ๋นผ๋จน๋ค ๋ณด๋ฉด ๋ณผ ์ ์๋ ํด๋์ค ์ค Factory๊ฐ ๋ถ์ ๊ฑธ ๋ณธ์ ์ด ์์ ๊ฒ์ด๋ค. @Provides์ด๋ ธํ ์ด์ ์ด ๋ถ์ด์์ผ๋ฉด Hilt๊ฐ ์ปดํ์ผํ์์ ํด๋น ๋ฉ์๋๋ฅผ ๋ถ์ํด์ ํฉํ ๋ฆฌ ํด๋์ค๋ฅผ ์์ฑํ๋ค. ๋ฐํ์ ๋ ๊ฐ์ฒด ์์ฑํ ์ค๋น๋ฅผ ํ๋ ๊ฒ์ด๋ค.
# `@Binds`
abstract ํด๋์ค๋ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ๋ฐ์ธ๋ฉํ ๋ ์ฌ์ฉํ๋ค. ์ถ์ํ ๋์ด์๋ ๊ณณ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋์ ๋ณธ๋ฌธ์ด ์๊ณ ํ๋ผ๋ฏธํฐ๋ก ๊ตฌํ์ฒด ํด๋์ค๋ฅผ ๋ฐ๊ฒ๋๋ค. ๋จ์ ์ธํฐํ์ด์ค - ๊ตฌํ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋ ํํ๋ค.
interface TestRepository
class TestRepositoryImpl @Inject constructor() : TestRepository
// ์ธํฐํ์ด์ค๋ ๊ตฌํ์ฒด๊ฐ ์ด๋ฏธ ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ๋ค. ์ด๊ฑฐ๊น์งํ๋ฉด ๋๋ฌด ๊ธธ์ด์ง๋ค.
@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
@Binds
abstract fun bindTestRepository(testRepositoryImpl: TestRepositoryImpl): TestRepository
}
์ถ์ํด๋์ค๋ก ์ ์ธ๋ ๋ชจ๋์ด๋ค.
ํ ์ธํฐํ์ด์ค์ ๋ํ ์ฌ๋ฌ๊ฐ์ ๊ตฌํ์ฒด๊ฐ ์กด์ฌํ ์๋ ์๋ค. ์ด๋ด ๋๋ @Binds์ Qualifier๋ฅผ ๊ฐ์ด ์จ์ฃผ๋ฉด๋๋ค. @Named๋ฅผ ์ฌ์ฉํด๋ ๋๋ค. Qualifier๋ ๋ฌผ๋ก ๊ผญ Binds๊ฐ ์๋๋ผ๋ ์๋์ฒ๋ผ @Provides์์ ์ฌ์ฉํ ์๋ ์๋ค.
@Singleton
@Provides
fun provideNotificationApi(
@NormalRetrofit
retrofit: Retrofit
): NotificationApi = retrofit.create()
@Singleton
@Provides
fun provideTmapApi(
@TmapRetrofit
retrofit: Retrofit
): TmapRouteApi = retrofit.create()
์ฐจ์ด์ ์ ์ ๋ฆฌํด๋ณด๋ฉด Provides๋ ๊ฐ์ฒด ์์ฑ, ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฃผ์ ๊ณผ ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด๊ฐ ํ์ํ ๋ ์ฌ์ฉํ๊ณ , Binds๋ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์์ ๋ฐ์ธ๋ฉ์์ ์ฌ์ฉ๋๋ค. ๊ฐ์ฒด ์งํฅ์ , ์์กด์ฑ ์ญ์ ๊ฐ๋ ์์ ๋ณด๋ฉด Binds๊ฐ ๋ ํด๋ฆฐํ ํํ๋ค. ์ปดํ์ผ ํ์์ ๊ทธ๋ ค์ง Hilt ์์กด์ฑ ๊ทธ๋ํ์ ๋๋ฌ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ปดํ์ผํ์์ ๋ฐ์ธ๋ฉ ์ ๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์ ์ ์๋ค๋ ๊ฑด ๊ทธ๋งํผ ๋ฐํ์ ๋ ์ฑ๋ฅ์ด ์ข๋ค๋ ๋ง๊ณผ ๊ฐ๋ค. Provides๋ ๋ฐํ์ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธด ํด๋ ๊ฐ์ฒด ์์ฑ๊ณผ์ ์ ์ ์ดํ ์ ์์ด์ ์ข ๋ ์์ ๋กญ๋ค.
๋ฐํ์ ๋ ์ ํํ ์ด๋ค์ผ์ด ์ผ์ด๋๋์ง์ ๋ํด์๋ ์๋์ ๊ฐ์ด ์ ๋ฆฌํ ์ ์๊ฒ ๋ค.
- `@Provides`๋ Hilt๊ฐ ์์ฑํด์ค ํฉํ ๋ฆฌ์ get()์ผ๋ก ํธ์ถ๋์ด ์ค์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. ๊ฐ์ฒด ์์ฑ๊ณผ์ ์์ @Provides ๋ฌ์๋ ๋ฉ์๋๊ฐ ์คํ๋๋ ๊ฒ์ด๋ค.
- `@Binds`๋ ์ด๋ฏธ ์ปดํ์ผ ํ์์ Hilt ์์กด์ฑ ๊ทธ๋ํ์ ๋ฐ์ธ๋ฉ ์ ๋ณด๊ฐ ๋ค ์ฌ๋ผ๊ฐ ์๋ ์ํ๋ค. ๋ฐ๋ผ์ ๊ทธ๋ฅ ๋ก์ง ์คํ ์์ด ๋ฐ๋ก ๊ตฌํ์ฒด ์ธ์คํด์ค๋ฅผ ๊ฝ์์ค๋ค.
์ผ๋ง์ ์ Paging3๋ฅผ ์ํคํ ์ณ์ ๋ง๊ฒ ๊ฐ๊ณตํ์ด์ผํ๋๋ฐ Paging์ด Repository์ ๊ฐ์ ์์ค์์ ์๊ธฐ ์ ์ DataSource์ธ์ค ์๊ณ ๋ณ ์ด์ํ ์ง์ ํ๋ค๊ฐ PagingSource๋ฅผ ์์ฑํด์ฃผ๋ Factory๋ฅผ ๋ง๋ค์ด์ @Bindsํด์ค์ ์ด์๋ค. ๋์ค์ ๊ทธ๊ฒ ์๋ชป๋ ํจํด์์ ์๊ณ ์ ์ํ๊ฒ ๊ณ ์ณค๋ค.
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์!
'Android ๐ฅ๏ธ > DI๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Android 15 ๋์ ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ณํ... ๊ทธ๋ฆฌ๊ณ toml์์๋ณด๊ธฐ + Hilt ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐํ๊ธฐ (0) | 2024.07.16 |
---|---|
Hilt(3) - ๋ฉํฐ ๋ฐ์ธ๋ฉ (0) | 2024.07.05 |
Hilt(2) - ๋ฐ์ธ๋ฉ๊ณผ ์์กด์ฑ ์ฃผ์ (0) | 2024.07.05 |
Hilt(1) (0) | 2024.06.22 |
DI ์ ๋ฌธ - ์ข ์ ํญ๋ชฉ ์ฝ์ (0) | 2024.03.07 |