06
22

์•ž์œผ๋กœ ๋ญ˜ ํ•˜๋“  ์•„ํ‚คํ…์ณ๋ฅผ ์ œ๋Œ€๋กœ ์ ์šฉํ•˜๋ ค๋ฉด DI๊ฐ€ ๊ผญ ํ•„์š”ํ•˜๊ณ  ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒŒ Hilt ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

์˜ค๋Š˜๋ถ€ํ„ฐ Hilt๋ฅผ ๋ฝ€๊ฐœ๋ณด๊ฒ ๋‹ค.

 

Hilt๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๊ธฐ ์จ๋†จ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ •ํ•ด์ง„ ์ปดํฌ๋„ŒํŠธ๋“ค๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ์žˆ์–ด์„œ Dagger๋ณด๋‹ค๋Š” ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋‚ฎ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.(์ข€ ๋” ์ถ”์ƒํ™”๋œ ๋Š๋‚Œ)

์ปดํฌ๋„ŒํŠธ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ƒ์œ„์ปดํฌ๋„ŒํŠธ๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

# `@HiltAndroidApp`

https://dagger.dev/hilt/application

 

Hilt Application

Note: Examples on this page assume usage of the Gradle plugin. If you are not using the plugin, please read this page for details. Hilt Application All apps using Hilt must contain an Application class annotated with @HiltAndroidApp. @HiltAndroidApp kicks

dagger.dev

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

 

Android Entry Points

Note: Examples on this page assume usage of the Gradle plugin. If you are not using the plugin, please read this page for details. Android types Once you have enabled members injection in your Application, you can start enabling members injection in your o

dagger.dev

์ด๊ฑด ์ปดํฌ๋„ŒํŠธ์— ๋ถ™์—ฌ์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ ํด๋ž˜์Šค๋ฅผ ์ฃผ์ž…(@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์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ์•ˆ์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์„ฑ๋Šฅ์„ ์ค‘์š”์‹œํ•œ๋‹ค๋ฉด ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ต‰์žฅํžˆ ์„ฌ์„ธํ•˜๊ฒŒ ๋‹ค๋ค„์•ผํ•œ๋‹ค.

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”!

 

๋ฐ˜์‘ํ˜•
COMMENT