์น๊ตฌ๋ค๊ณผ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ dagger hilt์ ๋ํ ํ์์ฑ์ ๋๋ผ๊ณ ์ด ํฌ์คํ ์ ์์ฑํ๋ค
dagger hilt๋?
dagger hilt๋ ์๋๋ก์ด๋์์ ํด๋์ค๊ฐ ์์กด์ฑ์ ์ฃผ์ ํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
dagger hilt๋ฅผ ์์๋ณด๊ธฐ ์ ์ ์ผ๋จ ์์กด์ฑ์ด ๋ฌด์์ธ์ง ๋ถํฐ ์์๋ณด์.
์์กด์ฑ์ด๋?
์์กด์ฑ์ด๋ ํด๋์ค๊ฐ ์์กด ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ ํ์์ ๋ปํ๋ค.
์์
class B {
val id = "dltntlro"
}
class A {
val data = B()
}
Aํด๋์ค ๋ด๋ถ์ Bํด๋์ค ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด ์์(์์กด์ ์)์ ๋ณผ ์ ์๋ค
์ด๋ฌํ ์ํฉ์ด ๋ฐ์ํ๋ฉด Aํด๋์ค๊ฐ ํธ์ถ๋ ๋๋ง๋ค Bํด๋์ค๋ ๊ณ์ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๊ฒ ๋๋ค.
์ฃผ์ ์ด๋?
์ฃผ์ ์ด๋ ํด๋์ค ์ธ๋ถ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋งํ๋ค.
์์ 2
class B {
val id = "dltntlro"
}
class A(bClass: B) {
val data = bClass
}
์์ 2์์๋ Aํด๋์ค ๋ด๋ถ๊ฐ ์๋๋ผ Aํด๋์ค์ ๋งค๊ฐ๋ณ์๋ก Bํด๋์ค๋ฅผ ์ฃผ์ ํ๋ค.
์์กด์ฑ ์ฃผ์ ์ด๋ ํด๋์ค ์ธ๋ถ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํด ์ฃผ์ ํ๋ ๊ฒ์ด๋ค.
์์กด์ฑ ์ฃผ์ ์ ์ฅ์
- ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ด ๋๋ค
- ์ฝ๋ ๋ณ๊ฒฝ์ด ์์ ๋กญ๋ค
dagger hilt
Google์์ ๋ฐํํ ์๋๋ก์ด๋ ์ ์ฉ ์์กด์ฑ ์ฃผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฅผ ๋ปํ๋ค.
hlit๋ dagger2๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด dagger2๋ณด๋ค ๋ฌ๋์ปค๋ธ๊ฐ ๋ฎ๊ณ , ์์กด์ฑ ์ฃผ์ ๊ตฌ์ถ ์๊ฐ์ ์ค์ผ ์ ์๋ค.
์ด์ ๋ถํฐ dagger hilt๋ฅผ ์๋๋ก์ด๋์์ ์ฐ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ๋ค.
add Dependency(2022.3.29 ๊ธฐ์ค)
project/build.gradle
buildscript {
...
dependencies {
...
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.38.1'
}
}
app/build.gradle
plugins {
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
}
android {
...
}
dependencies {
implementation "com.google.dagger:hilt-android:2.38.1"
kapt "com.google.dagger:hilt-compiler:2.38.1"
}
hilt ์ฌ์ฉํ๊ธฐ
@HiltAndroidApp
hilt๋ฅผ ์ฌ์ฉํ๋ android app์ ํ์์ ์ผ๋ก ์์ด์ผ ํ ์ด๋ ธํ ์ด์ ์ด๊ณ ,
์์กด์ฑ ์ฃผ์ ์ ์์์ ์ ์ง์ ํ๋ค
@AndroidEntryPoint
class App : AppCompatActivity() { ... }
@HiltAndroidApp์ด ๋ค์ด๊ฐ ํด๋์ค๋ menifast์ name์ ์ถ๊ฐํด ์ค์ผ ํ๋ค
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package=" ... ">
<application
...
android:name=".App">
<activity
...
@AndroidEntryPoint
@AndroidEntryPoint์ ์ถ๊ฐํด์ ์๋์ผ๋ก ์๋ช ์ฃผ๊ธฐ์ ๋ฐ๋ผ ์ ์ ํ๊ฒ hilt์์๋ก ์ธ์คํด์คํ ๋์ด ์ฒ๋ฆฌ๋๋ค.
@AndroidEntryPoint
class HiltActivity : AppCompatActivity() { ... }
hlit๊ฐ ์ง์ํ๋ ์๋๋ก์ด๋ ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
- Activity
- Fragment
- View
- Service
- BroadcastReceiver
@Inject
@Inject์ผ๋ก ์์กด์ฑ์ ์ฃผ์ ๋ฐ์ผ๋ ค๋ ๋ณ์์ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ ์ ์๋ค.
class MainActivity : AppCompatActivity() {
@Inject lateinit var viewModel: MainViewModel
}
@Inject๋ง๊ณ ๋ ์์กด์ฑ์ ์์ฑํ ์์๋ ๋ฐฉ๋ฒ์ด ์๋ค.
- @Inject ์ ์์ฑ์(constructor)
- Hilt ๋ชจ๋๋ค (@Module, @Provides, @Binds)
@Inject constructor
ํด๋์ค์ ์์ฑ์์์ @Inject๋ฅผ ์ฌ์ฉํ์ฌ ์์กด์ฑ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด๋ค.
class MainAdapter @Inject constructor(
private val service: MainService
) { ... }
์์ฑ์์ ํ๋ผ๋ฏธํฐ๋ก ์์กด์ฑ์ ์ฃผ์ ๋ฐ์ ์ ์๋ค.
Hilt ๋ชจ๋
์์ฑ์์ ํ๋ผ๋ฏธํฐ๋ก ์์กด์ฑ ์ฃผ์ ์ ํ๊ธฐ๊ฐ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.(์: retrofit2, okhttp, room database ๋ฑ)
์ด๋ฌํ ๋ชจ๋๋ค์ hilt์๊ฒ ์์กด์ฑ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค๋ค.
@InstallIn
@InstallIn(component)ํ์์ผ๋ก ์ฌ์ฉํด ์ด๋ค ์ปดํฌ๋ํธ์ installํ ์ง ์ ํด์ผ ํ๋ค.
@InstallIn(ActivityComponent::class)
object MainModule { ... }
hlit์์ ์ ๊ณตํ๋ ์ปดํฌ๋ํธ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค
๊ฐ ์ปดํฌ๋ํธ๋ค์ ์์ฑ์์ ๋ถํฐ ํ๊ดด๋ ๋๊น์ง ์ฃผ์ ์ด ๊ฐ๋ฅํ๋ค.
@Provides
๊ฐ๋ฐ์๊ฐ ์์ฑ์๋ฅผ ์ฝ์ ํ ์ ์์๋ ์ฌ์ฉ๋๋ ์ด๋ ธํ ์ด์
object MainModule {
@Provides
fun provideMainService(): AnalyticsService {
return Retrofit.Builder()
.baseUrl("https://example.com")
.build()
.create(MainService::class.java)
}
}
viewModel์ ์์กด์ฑ ์์ฑ ๋ฐฉ๋ฒ
@HiltViewModel๊ณผ @Inject๋ฅผ ์ฌ์ฉํ๋ค.
@HiltViewModel
class MainViewModel @Inject constructor(
private val repository: MainRepository
) : ViewModel() { ... }
์ฌ๊ธฐ๊น์ง ์์กด์ฑ ์ฃผ์ ์ ๋ํด ๋ด๊ฐ ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํด ๋ณด์๋ค.
๋ค๋ฅธ ๋ธ๋ก๊ทธ์ ๋ ๋ง์ ์ ๋ณด๋ค์ด ์์ ๊ฑฐ๋ ์ฐธ๊ณ ๋ฐ๋๋ค.
๋ด๊ฐ ์์ฑํ ๋ด์ฉ๋ค์ ์ฌ์ค๊ณผ ๋ค๋ฅผ ์ ์์ผ๋ ์ํด ๋ฐ๋๋ค.
ํน์ ์ง์ ํ ๋ด์ฉ์ด ์์ผ๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์
'๐ฑ| Android > ๐ | ๊ธฐ๋ก' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android, Kotlin] editText์ toggle icon์ด ๋ฐ๋๋ก ๋์์ ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ (2) | 2022.08.31 |
---|---|
[Android/Kotlin] retrofit2 ์ ๋ฆฌ (0) | 2022.05.13 |
[Android] ํ๋ฉด ์ด๋ ๋ฐฉ๋ฒ ์ ๋ฆฌ (0) | 2022.04.12 |
[Android Kotlin] radio button ์์ (0) | 2022.04.11 |
[Android] Clean Architecture ๊ธฐ๋ก (0) | 2022.04.01 |