์์ผ๋ก ๋ญ ํ๋ ์ํคํ ์ณ๋ฅผ ์ ๋๋ก ์ ์ฉํ๋ ค๋ฉด DI๊ฐ ๊ผญ ํ์ํ๊ณ ๊ทธ๋ ๊ฒ ํ๊ธฐ ์ํด ํ์ํ ๊ฒ Hilt ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
์ค๋๋ถํฐ Hilt๋ฅผ ๋ฝ๊ฐ๋ณด๊ฒ ๋ค.
Hilt๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฌ๊ธฐ ์จ๋จ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํด์ง ์ปดํฌ๋ํธ๋ค๋ก๋ง ์ด๋ฃจ์ด์ ธ์์ด์ Dagger๋ณด๋ค๋ ๋ฌ๋์ปค๋ธ๊ฐ ๋ฎ๋ค๊ณ ํ ์ ์๋ค.(์ข ๋ ์ถ์ํ๋ ๋๋)
์ปดํฌ๋ํธ ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด ํ์ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ์ ์ ๊ทผ๊ฐ๋ฅํ์ง๋ง ์์์ปดํฌ๋ํธ๋ ํ์ ์ปดํฌ๋ํธ์ ์ ๊ทผํ ์ ์๋ ๊ฑธ ์ ์ ์๋ค.
# `@HiltAndroidApp`
https://dagger.dev/hilt/application
Hilt์ ์์์ ์ด ๋๋ ์ด๋ ธํ ์ด์ ์ด๋ค. ์ด๊ฑธ ApplicationClass์ ์ง์ ํ๋ฉด ์ต์์ ์ปดํฌ๋ํธ์ธ `SingletonComponent`๊ฐ ๋น๋ ์ ์์ฑ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฑด ๊ณง ์ปจํ ์ด๋ ์ญํ ์ ํ๋ค. ์ปดํฌ๋ํธ์ ์์กด์ฑ์ ์ฃผ์ ํ๋ ๊ฑธ ๋ฐ์ธ๋ฉ์ด๋ผ๊ณ ํํํ๋๋ฐ ์ฃผ์ ๋ ์์กด์ฑ์ ์ ์ ๊ฐ ์์ฒญํ๋ ๋ฐฉํฅ์ผ๋ก ์๋น๋๋ค.
# ๋ฐ์ธ๋ฉ - `@Inject, @Provides, @Module`
Hilt์ปดํฌ๋ํธ๊ฐ ์์กด์ฑ ์ฃผ์ ์ ๋ฐ์ผ๋ ค๋ฉด @Inject๋ก ์ ์ธํ๋ฉด ๋๋ค.
@Inject
lateinit var test: Test
์ด๋ ๊ฒ๋ง ํ๋ฉด ์ฃผ์ ์ด ๋ ๊น? ์ฃผ์ ์ ํ๋๋ผ๋ ์ด๊ธฐํ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ๋ฐ๋ก ์ฃฝ์ด๋ฒ๋ฆด๊ฒ์ด๋ค. ๊ทธ๋์ Testํด๋์ค์๋ ์์ฑ์์ @Inject๋ฅผ ๋ถ์ฌ์ฃผ๋ ์์ ์ด ํ์ํ๋ค.
class Test @Inject constructor(){
}
์ด๋ ๊ฒ ์ ์ธํ๋ฉด ์ด์ Testํด๋์ค๋ Hilt์ปดํฌ๋ํธ์ ๋ถ์ฌ๋๋ค๋ ์๋ฏธ๋ผ์ ์ฒ์ @Injectํ ๋ถ๋ถ์์ ์ฌ์ฉํ ์ ์๋ค.
์ด๊ฑด ํด๋์ค๋ฅผ ์ง์ ์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด์ ์ฌ๋ฆฐ๊ฑฐ๊ณ , ๋ชจ๋์ ์ฌ์ฉํด์ ์ฃผ์ ํ๋ ๋ฐฉ์๋ ์๋ค. ๋ชจ๋์ด๋ผ ํ๋ฉด ๋ณดํต ๊ด๋ จ ๋ฐ์ดํฐ, ํจ์(์ญํ )์ ํ ๋ฐ ๋ชจ์์ ๊ด๋ฆฌํ๋ ๋จ์๋ค. ์ญํ ์ ๊ฐ๊ฐ ๋๋ ๋ฉํฐ๋ชจ๋์ ์๊ฐํด๋ณด๋ฉด ๋ฐ๋ก ๊ฐ์ด ์ฌ ๊ฒ์ด๋ค.
@Module
@InstallIn(SingletonComponent::class)
object ApplicationModule {
}
๋ชจ๋์ ์ ์ญ์์ ์ฌ์ฉ๋ ๊ฑฐ๋๊น `@InstallIn`์ผ๋ก SingletonComponent์ ์ค์นํ๋ค๊ณ ๋ช ์ํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์๊น ์ง์ ์ฃผ์ ํ๋ ๊ฑธ ๋ชจ๋๋ก ๊ฐ์ ธ์ค๋๋ฐ ์ด๋ @Provides ์ด๋ ธํ ์ด์ ์ ๋ถ์ธ๋ค.
@Module
@InstallIn(SingletonComponent::class)
object ApplicationModule {
@Provides
fun provideTest(): Test{
return Test() //Bindingํ ํํ
}
@Singleton // ์ด๋ ๊ฒ ์ ์ธํ๋ฉด ์ธ์ ํธ์ถํด๋ ๋์ผํ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค
@Provides
fun provideTestSingleton(): Test{
return Test()
}
}
๊ฐ์ฒด๋ฅผ Provide ํด์ฃผ๋ ํํ๊ธฐ ๋๋ฌธ์ ์ด ๊ฒฝ์ฐ์๋ Testํด๋์ค์์ ์์ฑ์๋ฅผ @Injectํด์ฃผ์ง ์์๋ ๋๋ค.
# `@AndroidEntryPoint`
https://dagger.dev/hilt/android-entry-point.html
์ด๊ฑด ์ปดํฌ๋ํธ์ ๋ถ์ฌ์ฃผ๋ ์ด๋ ธํ ์ด์ ์ด๋ค. ์๋๋ก์ด๋ ํด๋์ค๋ฅผ ์ฃผ์ (@Inject)ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ด๋ ธํ ์ด์ ์ด๊ณ `Activity, Fragment, Service, BroadcastReceiver(์๋ ์ฑ๊ธํค๋ง ๊ฐ๋ฅ), View`์ ๋ถ์ธ๋ค. ์ปดํฌ๋ํธ๋ผ๊ณ ํ์ผ๋ฉด์ ์ ContentProvider๋ ์๋๊ณ ๋ฌผ์ด๋ณผ ์ ์๋ค. ๋ง ๊ทธ๋๋ก ์ง์ ์ ์ ๋ถ์ฌ์ฃผ๋ ์ด๋ ธํ ์ด์ ์ธ๋ฐ `ContentProvider`์ ๊ฒฝ์ฐ๋ Dagger๊ฐ ์ ์ํ Entrypoint์ onCreate ์์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๋ถ๋ถ์์ Fragment๋ ๊ทธ๋๋ก ์ ์ฉ๋๋ค. Activity์์ Fragment๊ฐ ๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค `@AndroidEntryPoint`๋ฅผ ๋ถ์ฌ์ค์ผ๋๋ค.
ํด๋์ค๊ฐ ์์ฑ(onCreate)๋๊ณ AndroidEntryPoint๋ก ์ธ์์ ํด์ผ Hilt์ปดํฌ๋ํธ์ ์ ๊ทผํด์ @Inject๋ก ์์กด์ฑ์ ์ฃผ์ ๋ฐ์์ฌ ์ ์๋ค.
๊ทผ๋ฐ @Inject๋ก ๊ฐ๊ณ ์ค๋ ๋ถ๋ถ์์ ์ค์ํ ๊ฒ ์๋ค.
@AndroidEntryPoint(FragmentActivity. class)
public final class FooActivity extends Hilt_FooActivity {
@Inject Foo foo;
@Override
public void onCreate(Bundle savedInstanceState) {
super. onCreate(savedInstanceState); // The foo field is injected in super. onCreate()
}
}
`super.onCreate` ๊ฐ ํธ์ถ ๋ ๋ ์ฃผ์ ๋๊ธฐ ๋๋ฌธ์, ์ด๊ฒ ํธ์ถ๋๊ธฐ ์ ์ @Inject๋ก ์ ์ธ๋ ๋ฉค๋ฒ์ ์ ๊ทผํ๋ฉด ๋ฐํ์์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ๋๋ค. Hilt๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปดํ์ผํ์ ์์ฃผ๋ผ ์ปดํ์ผ ์์ ์์๋ ๋ฐ๊ฒฌ๋์ง์๋ ์ค๋ฅ๋ค. ๊ณต์๋ฌธ์์ ์๋ ๋ํ๋ฅผ ๋ณด๋ฉด ํ๋ฒ์ ์ดํดํ ์ ์๋ค.
Component | Scope(Annotation) | Created at | Destroyed at |
SingletonComponent | @Singleton | Application#onCreate() | Application process is destroyed |
ActivityRetainedComponent | @ActivityRetainedScoped | Activity#onCreate()1 | Activity#onDestroy()1 |
ViewModelComponent | @ViewModelScoped | ViewModel created | ViewModel destroyed |
ActivityComponent | @ActivityScoped | Activity#onCreate() | Activity#onDestroy() |
FragmentComponent | @FragmentScoped | Fragment#onAttach() | Fragment#onDestroy() |
ViewComponent | @ViewScoped | View#super() | View destroyed |
ViewWithFragmentComponent | @ViewScoped | View#super() | View destroyed |
ServiceComponent | @ServiceScoped | Service#onCreate() | Service#onDestroy() |
Hilt ์ปดํฌ๋ํธ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ฐํ์์๋ฌ๊ฐ ๋ฐ์ํด ์ฑ ํฌ๋์๊ฐ ๋ฐ์ํ๋ค.
๊ฐ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ง๋ ์ค์ฝํ๋ฅผ ๋ณด๋ฉด `@Inject`๋ ์ค์ฝํ์ ํด๋นํ์ง์๋ ๊ฑธ ๋ณผ ์ ์๋ค. ๋ฐ๋ผ์ ๊ทธ๋ ๊ฒ ๋ฐ์ธ๋ฉํ ๊ฑด ๋งค๋ฒ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , ์ง์ ํ ์ค์ฝํ ์์ ์๋ ์ปดํฌ๋ํธ๋ Hilt์ปดํฌ๋ํธ ์๋ช ์ฃผ๊ธฐ ์์์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฌ์ฉํ๋๋ฐ ์ฑ๋ฅ์ ์ค์์ํ๋ค๋ฉด ์ด๋ ์ฌ์ฉ๋๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ต์ฅํ ์ฌ์ธํ๊ฒ ๋ค๋ค์ผํ๋ค.
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์!
'Android ๐ฅ๏ธ > DI๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
@Provides ์ @Binds (0) | 2024.08.02 |
---|---|
Android 15 ๋์ ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ณํ... ๊ทธ๋ฆฌ๊ณ toml์์๋ณด๊ธฐ + Hilt ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐํ๊ธฐ (0) | 2024.07.16 |
Hilt(3) - ๋ฉํฐ ๋ฐ์ธ๋ฉ (0) | 2024.07.05 |
Hilt(2) - ๋ฐ์ธ๋ฉ๊ณผ ์์กด์ฑ ์ฃผ์ (0) | 2024.07.05 |
DI ์ ๋ฌธ - ์ข ์ ํญ๋ชฉ ์ฝ์ (0) | 2024.03.07 |