๋ฉํฐ๋ชจ๋์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ข ์์ฑ ์ฝ์ (DI: Dependency Injection)์ ํด์ค์ผํ๋๋ฐ ์ด๋ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ Hilt๋ค.
์ข ์์ฑ ์ฝ์ ์ ์์กด์ฑ ์ฃผ์ ์ด๋ผ๊ณ ๋ ํ๋๋ฐ ํน์ ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํด์ผ๋ ๋ ์ธ๋ถ์์ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค. ์ฆ ๊ฐ์ฒด ๋ผ๋ฆฌ๋ ๊ฐ์ฒด ์์ฑ๊ณผ ๋ฌด๊ดํ๊ณ , ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ถ๊ณผ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ๋ถ๋ถ์ด ๋ถ๋ฆฌ๋ ๊ฒ์ด๋ผ๊ณ ์ดํดํ๋ค.
DI ๊ด๋ จํด์ Hilt๋ ์ด๋ฒ ๊ฒ์๊ธ ๋ง๊ณ ๋ฐ๋ก ๋ค๋ค์ ๋ ๊น๊ฒ ์ฐ๊ตฌํด๋ณด๋๋ก ํ๊ฒ ๋ค.
Hilt ํ๊ตฌ
์๋ ์ฌ์ฉ๋๋ Dagger๋ฅผ ํ์ฉํด ํ๋ก์ ํธ์ ๋ชจ๋ Android ๊ตฌ์ฑ์์์ ์ปจํ ์ด๋๋ฅผ ์ ๊ณตํ๊ณ , ํด๋น ์ปจํ ์ด๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ Hilt๊ฐ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ค.
Dagger๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น๋๋ Hilt๊ฐ ์ข์ ์ ์ ์๋์ ๊ฐ๋ค
- ๊ฐ์ฒด์์ฑ ๋ฐฉ๋ฒ๊ณผ ์ฃผ์ ์์น๋ง ์ ์ํ๋ฉด ๋๋ฏ๋ก ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ๊ฐ์
- ๋น๋ ์์กด์ฑ ๋ถ๋ฆฌ
- ๋ฆฌํฉํ ๋ง, ํ ์คํธ ํธ์์ฑ
- ์๋๋ก์ด๋ ํด๋์ค๋ฅผ ์ฌ์ฉํจ์ ๋ฐ๋ผ ํ์คํ ๋ ์ปดํฌ๋ํธ
๋ง์ง๋ง ์ค์ Activity, Fragment์ ๊ฐ์ ์๋๋ก์ด๋ ํด๋์ค์ ์๋์ผ๋ก ๋ง๋ ์์กด์ฑ์ ์ฃผ์
ํด์ค๋ค๋ ์๋ฏธ๋ค. ์ด๋ ์ฌ์ฉ๋๋ ์ด๋
ธํ
์ด์
์ด @AndroidEntryPoint
.
ํ๋ก์ ํธ์ Hilt ์ถ๊ฐ
Project
์์ค build.gradleํ์ผ์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋ค. buildscript ์ฝ๋๋ธ๋ญ์ ํญ์ plugins ๋ธ๋ญ ์์ ์์ด์ผํ๋ค. ์ฝ๋๋ฉ์๋ 2.28-alpha๋ฒ์ ์ธ๋ฐ ํ์ฌ stable๋ก 2.44๊น์ง ๋์์ผ๋ 2.44๋ก ์ง์ ํ๋ค.
buildscript {
ext.hilt_version = '2.44'
dependencies {
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
}
}
app๋ชจ๋์์ gradle ํ๋ฌ๊ทธ์ธ์ ์ฐ๊ธฐ์ํด์ kapt๋ฅผ app์์ค build.gradle์ ๋ฃ์ด์ค๋ค.
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
๋์ผ ํ์ผ ํ๋จ์ dependencies์ ์ด๊ฒ๊น์ง ์ถ๊ฐํ ๋ค syncํด์ฃผ๋ฉด ์ธํ ๋์ด๋ค.
dependencies {
//hilt
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
}
์ด๊ฑธ ์ถ๊ฐํ์ง ์๊ณ sync ๋จผ์ ํ๋ฉด ๋น์ฐํ ๊ฐ์ ธ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฃผ์๊ฐ ์์ผ๋ hilt๊ฐ ์๋ค๊ณ ๋์จ๋ค.(์ฝ์ง๊ฒฝํ)
๊ฐ๋จํ ์ฌ์ฉ๋ฒ
์ฑ์ ์๋ช
์ฃผ๊ธฐ์ ์ฐ๊ฒฐ๋ ์ปจํ
์ด๋๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด @HiltAndroidApp
์ ๋ฌ๋ฉด ๋๋ค.
@HiltAndroidApp
class SuChelinApp: Application() {
}
์ด ์ปจํ
์ด๋๋ ์ต์์ ์ปจํ
์ด๋์ด๋ฏ๋ก ์ฌ๊ธฐ์ ์ ๊ณตํ๋ ์ข
์ํญ๋ชฉ์ ๋ค๋ฅธ ์ปจํ
์ด๋๊ฐ ์ ๊ทผํ ์ ์๋ค. ์ปจํ
์ด๋
๋ ์ข
์ํญ๋ชฉ์ ์ ๊ณตํ๋ ํด๋์ค๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋๊ตฌ๋ค.
Fragment๋ Activity์์ Hilt๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด @AndroidEntryPoint
๋ก ์ด๋
ธํ
์ด์
์ ๋ฌ๋ฉด ๋๋ค.
@AndroidEntryPoint
class LogsFragment : Fragment() {
}
์ด๋ฌ๋ฉด Activity, Fragment์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ฐ๋ผ๊ฐ๋ ์ข ์ํญ๋ชฉ ์ปจํ ์ด๋๊ฐ ์์ฑ๋๋ค. ๋ ์ธ์คํด์ค๋ฅผ ์ฝ์ ํ ์ ์๊ฒ ๋๋๋ฐ, ์๋ ์ฝ๋๋ฅผ ๋ณด์.
@AndroidEntryPoint
class LogsFragment : Fragment() {
@Inject lateinit var logger: LoggerLocalDataSource
@Inject lateinit var dateFormatter: DateFormatter
}
์ธ๋ถ์์ ์์ฑํด๋ ์ธ์คํด์ค๋ฅผ ๋ฐ์์ค๋ ์ฝ๋๋ค.
class LoggerLocalDataSource @Inject constructor(private val logDao: LogDao) {
...
}
์ด๋ฐ์์ผ๋ก ํ๋ฉด ํน์ ํด๋์ค์ ์ข ์๋์ง์์ ์ธ์คํด์ค๊ฐ ์ฃผ์ ๋๋ค.
์ธ์คํด์ค ๋ฒ์๋ @Singleton
์ ๋ถ์ฌ์ ์ ์ญ์ผ๋ก ๋ง๋ค์ด ํญ์ ๋์ผํ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ๊ฑฐ๋, ์ฑ๊ธํค์ผ๋ก ๋ง๋ค์ง์๊ณ ํญ์ ๋ค๋ฅด๊ฒ ๋ง๋ค ์ ์๋ค.
@Singleton
class LoggerLocalDataSource @Inject constructor(private val logDao: LogDao) {
...
}
Hilt ๋ชจ๋
์์ฑ์๊ฐ ์ฝ์ ๋ ์ ์๋ ์ ํ(์ธํฐํ์ด์ค์ ๊ฐ์)์ Hilt ๋ชจ๋์ ์ฌ์ฉํด์ผํ๋ค.
๋ชจ๋์ @Module
๊ณผ @InstallIn
์ด๋
ธํ
์ด์
์ ๋ฌ์๋ ํด๋์ค๋ค. @Module์ ๋ง ๊ทธ๋๋ก ๋ชจ๋์์ Hilt์ ์๋ฆฌ๋ ์ญํ ์ด๊ณ @InstallIn์ ์ด๋ค ์ปจํ
์ด๋์์ Hilt์์๋ฅผ ์ง์ ํด ๊ฒฐํฉ์ ์ฌ์ฉํ ์ง๋ฅผ Hilt์ ์๋ฆฐ๋ค.
์ง์ ํ ์์๋ Hilt ๊ตฌ์ฑ์์๋ ์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด๋๋ค.
์ด๊ฒ Hilt ๊ตฌ์ฑ์์ ๊ณ์ธต ๊ตฌ์กฐ๋ค. ์์ ์์์ ํ์์์๊ฐ ์ ๊ทผ ํ ์ ์๋ค.
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
const val BASEURL = ""
}
์ด ์ฝ๋๋ SingletonComponent๋ฅผ ์ง์ ํด์ ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ๋ค. ๋คํธ์ํฌ ํต์ ์ ์ด์ฐจํผ ๊ณ์ ํ ๊ฒ์ด๋ฏ๋ก ๋งค๋ฒ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๊ฒ๋ณด๋ค ์ฑ๊ธํค์ผ๋ก ๋ง๋ค์ด์ ์ ๊ทผ์ด ์ฝ๊ฒ ํ๋๊ฒ ๋ซ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ชจ๋ ์์ ํจ์์ @Provides๋ฅผ ๋ฌ๋ฉด ์ธ์คํด์ค ์์ฑ์ ํ์ํ ๊ฒ์ Hilt์ ์๋ฆด ์ ์๋ค.
@Module
object DatabaseModule {
@Provides
fun provideLogDao(database: AppDatabase): LogDao {
return database.logDao()
}
}
Hilt์๊ฒ provideLogDao๋ฉ์๋๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ LogDao ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ๋๋ฐ database.logDao()๋ฅผ ์คํํด์ผ๋๋ค๊ณ ์๋ฆฌ๋ ์ฝ๋๋ค.
์ถ์ํด๋์ค์ ์ธํฐํ์ด์ค ๋ฉ์๋๋ @Binds
๋ฅผ ๋ถ์ฌ ์ฌ์ฉํ๋ฉด๋๋ค
@InstallIn(ActivityComponent::class)
@Module
abstract class NavigationModule {
@Binds
abstract fun bindNavigator(impl: AppNavigatorImpl): AppNavigator
}
์ฐธ์กฐ:
https://developer.android.com/codelabs/android-hilt?hl=ko&authuser=1#0
https://developer.android.com/training/dependency-injection?authuser=1&hl=ko#choosing-right-di-tool
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ํด๋ ๋ฉ๋๋ค ^_^
'Android ๐ฅ๏ธ > ์ฝ์งโ๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฒ๊ทธ/์ค๋ฅ] Uri(Url) encoding/decoding - API ์ฌ์ฉ์ (0) | 2024.03.29 |
---|---|
๋ฉํฐ๋ชจ๋ ๋์ ๊ธฐ(3) - Kotlin DSL, buildSrc (0) | 2023.12.15 |
๋ฉํฐ๋ชจ๋ ๋์ ๊ธฐ(1) (0) | 2023.12.15 |
textview์์ selector ์ฌ์ฉํ๊ธฐ (0) | 2023.12.15 |
Compose๋ก Long Press ๊ตฌํํ๊ธฐ - detectTapGestures (0) | 2023.11.27 |