Dagger - YunByungKwan/Fundamental GitHub Wiki

  • Activity/Fragment๋Š” Dagger๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ Activity/Fragment์—์„œ๋Š” ํ•„๋“œ ์‚ฝ์ž…๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฐธ๊ณ ๋กœ, ํ•„๋“œ ์‚ฝ์ž…์€ ์ƒ์„ฑ์ž ์‚ฝ์ž…์„ ํ•  ์ˆ˜ ์—†๋Š” Androidํ”„๋ ˆ์ž„์›Œํฌ ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • DaggerActivity ํ˜น์€ DaggerFragment๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ, AppComponet.inject()๋ฅผ ํ˜ธ์ถœํ• ๋•Œ Activity๋Š” super.onCreate() ์ „์— ํ˜ธ์ถœ Fragment๋Š”
  • @Inject: Dagger๊ทธ๋ž˜ํ”„์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์„๋•Œ ๋ถ™์ธ๋‹ค.
  • @Provides๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์†Œ์œ ํ•˜์ง€ ์•Š์€ ํด๋ž˜์Šค(Retrofit ์ธ์Šคํ„ด์Šค)๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ Dagger์—๊ฒŒ ์•Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  • @Binds๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.(Android Developer์‚ฌ์ดํŠธ์— ๋‚˜์™€ ์žˆ์Œ)
  • ๋ชจ๋“ˆ์€ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์˜๋ฏธ๋ก ์ ์œผ๋กœ ์บก์Аํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • @Inject์™€ ํ•จ๊ป˜ ์ƒ์„ฑ์ž ์‚ฝ์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํด๋ž˜์Šค์— ๋ฒ”์œ„ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๊ณ  Dagger ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” @Provides ๋ฉ”์„œ๋“œ์— ๋ฒ”์œ„ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • @ContributesAndroidInjector: ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ ๋ฉ”์„œ๋“œ์˜ returnํƒ€์ž…์— ๋Œ€ํ•œ AndroidInjector๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. SubComponent๊ฐ€ ์—†์„๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ธ ๊ฒƒ ๊ฐ™๋‹ค.

Android์—์„œ Dagger๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

  • Component Module Scope๋ฅผ ๋ชจ๋‘ ์ง์ ‘ ๊ธฐ์ˆ ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ ธ์„œ ์ด๋ ‡๊ฒŒ ์ž˜ ์•ˆ์“ด๋‹ค.
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        val mainComponent: MainComponent = (application as MyApplication).appComponent.mainComponent().create()
        // Member-Injection
        mainComponent.inject(this@MainActivity)
        // Provision
        var coffee2: Coffee = mainComponent.coffee()
    }
    ...
    interface MainComponent {
        fun inject(activity: MainActivity)
    }
    
  • DispatchingAndroidInjector๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•
    • AndroidInjectionModule ์ถ”๊ฐ€
    • ActivityBindingModule ์ถ”๊ฐ€
    • AndroidInjector <Activity ๋˜๋Š” Fragment> ์ƒ์†(SubComponent interface์— ์ƒ์†)
    • AndroidInjector.Factory<Activity ๋˜๋Š” Fragment> ์ƒ์†
    • Application ๋‹จ์œ„ ํด๋ž˜์Šค์—์„œ HasAndroidInjector๋ฅผ ์ƒ์†ํ•˜๊ณ  androidInjector()๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ
    • ๊ฐ Activity/Fragment์—์„œ AndroidInjection.inject()๋กœ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์™„๋ฃŒ
  • ์•ˆ๋“œ๋กœ์ด๋“œ ๊ธฐ๋ฐ˜ํด๋ž˜์Šค(DaggerApplication, DaggerActivity, DaggerFragment)๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•
    • Component์— AndroidSupportInjectionModule ์ถ”๊ฐ€
    • AppComponent์—์„œ AndroidInjector ์ƒ์†
    • Member-Injection Method inject() ์ œ๊ฑฐ

Dagger์— ๋Œ€ํ•ด ์„ค๋ช…

Dagger๋Š” ์˜์กด์„ฑ์ฃผ์ž… ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. Dagger๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด์„œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

@Provides์™€ @Binds์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…

@provides๋Š” ~~~์ž…๋‹ˆ๋‹ค. @Binds๋Š” ~~~์ž…๋‹ˆ๋‹ค.