๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/Android

[Android] Dagger2 - ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด ์ฃผ์ž… (@Binds)

interfacer_han 2024. 6. 25. 05:16

#1 ์ด์ „ ๊ธ€

 

[Android] Dagger2 - ๊ธฐ์ดˆ

#1 ์ด์ „ ๊ธ€ ์˜์กด์„ฑ ์ฃผ์ž… (Dependency Injection)#1 ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์ด๋ž€?#1-1 Dependent์™€ Dependencyfun main() { val car = Car() car.startCar() } class Car { private val engine = Engine() private val airbag = Airbag() private

kenel.tistory.com

์œ„ ๊ฒŒ์‹œ๊ธ€์˜ ์™„์„ฑ๋œ ์•ฑ์„ ์ผ๋ถ€ ์ˆ˜์ •ํ•ด์„œ, Interface๋ฅผ Dependency๋กœ ์ฃผ์ž…ํ•ด๋ณธ๋‹ค.

 

#2 ์ฝ”๋“œ ์ˆ˜์ • - ์ง๊ด€์ ์ธ ๋ฒ„์ „

#2-1 ๊ฐœ์š”

 

[Android] Dagger2 - ๋งค๊ฐœ๋ณ€์ˆ˜

#1 ์ด์ „ ๊ธ€ [Android] Dagger2 - @Provides#1 ์ด์ „ ๊ธ€ [Android] Dagger2 - ๊ธฐ์ดˆ#1 ์ด์ „ ๊ธ€ ์˜์กด์„ฑ ์ฃผ์ž… (Dependency Injection)#1 ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์ด๋ž€?#1-1 Dependent์™€ Dependencyfun main() { val car = Car() car.startCar

kenel.tistory.com

์œ„ ๊ฒŒ์‹œ๊ธ€์˜ ์•ฑ์„ ๊ตฌํ˜„ํ•  ์ค„ ์•ˆ๋‹ค๋ฉด, ์‰ฌ์šด ๊ตฌํ˜„ ๋ฐฉ์‹์ด๋‹ค. Battery ํด๋ž˜์Šค๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฐ”๊พธ๊ณ , ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” EcoFriendlyBattery ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  EcoFriendlyBattery๋ฅผ Dependency๋กœ ๋ฐ›๊ณ , Battery๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” Dependent์—๊ฒŒ ๋ฐ˜ํ™˜ํ•˜๋Š” @Provides ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค๋ฉด ๋์ด๋‹ค. ๋ณธ ๊ฒŒ์‹œ๊ธ€์—์„  @Component.Builder๋ฅผ ๋”ฐ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋ฐ, ์™œ๋ƒํ•˜๋ฉด ์•„๋ž˜์— ๋‚˜์™€ ์žˆ๋Š” ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„์—์„œ ๋ณด๋“ฏ, @Provides ๋ฉ”์†Œ๋“œ๊ฐ€ ์š”๊ตฌํ•˜๋Š” Dependency๊ฐ€ @Inject์— ์˜ํ•ด ์ž๋™ ์ฃผ์ž…๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

#2-2 ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„

์ด ๊ฒฝ์šฐ์˜ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋‹ค.

 

#2-3 Battery.kt ์ˆ˜์ •

// package com.example.interfacedependency

interface Battery {
    fun startBattery()
}

 

#2-4 EcoFriendlyBattery.kt ์ƒ์„ฑ

// package com.example.interfacedependency

import android.util.Log
import javax.inject.Inject

class EcoFriendlyBattery @Inject constructor() : Battery {
    override fun startBattery() {
        Log.i("interfacer_han", "${this::class.simpleName} is ready")
    }
}

 

#2-5 @Module ํด๋ž˜์Šค ๋ฐ @Provide ๋ฉ”์†Œ๋“œ ์ƒ์„ฑ

// package com.example.interfacedependency

import dagger.Module
import dagger.Provides

@Module
class BatteryModule {

    @Provides
    fun providesEcoFriendlyBattery(ecoFriendlyBattery: EcoFriendlyBattery): Battery {
        return ecoFriendlyBattery
    }
}

 

#2-6 @Component์— @Module ๋“ฑ๋ก

// package com.example.interfacedependency

import dagger.Component

@Component(modules = [BatteryModule::class])
interface CarComponent {
    fun getCar(): Car
}

 

#2-7 ์ž‘๋™ ํ™•์ธ (๋กœ๊ทธ ๋ฉ”์‹œ์ง€)

Crankshaft is ready
Cylinder is ready
Piston is ready
Engine is ready
Airbag is ready
EcoFriendly
Battery is ready
Car is ready

 

#3 ์ฝ”๋“œ ์ˆ˜์ • - @Binds ์‚ฌ์šฉ

#3-1 ๊ฐœ์š”

@Binds ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด #2๋ฅผ ์ˆ˜์ •ํ•ด๋ณธ๋‹ค. @Binds๋Š” dagger์—์„œ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ทธ ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ชฉ์ ์„ ๊ฐ€์ง„๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์ธ Dependency๋ฅผ ์–ด๋–ค ๊ตฌํ˜„์ฒด๋กœ ์ •ํ•  ์ง€ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

#3-2 ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„

#2-2์™€ ๊ตฌ์กฐ๊ฐ€ ๊ฐ™๋‹ค. ๊ตฌํ˜„ ๋ฐฉ์‹์ด ๋” ๊ฐ„๊ฒฐํ•ด์กŒ์„ ๋ฟ์ด๋‹ค.

 

#3-3 BatteryModule.kt ์ˆ˜์ •

...

@Module
abstract class BatteryModule {

    @Binds
    abstract fun bindsEcoFriendlyBattery(ecoFriendlyBattery: EcoFriendlyBattery): Battery
}

/*

@Module
class BatteryModule {

    @Provides
    fun providesEcoFriendlyBattery(ecoFriendlyBattery: EcoFriendlyBattery): Battery {
        return ecoFriendlyBattery
    }
}

*/

 

#2์™€ ์™„์ „ํžˆ ๋˜‘๊ฐ™์ด ์ˆ˜์ •ํ•˜๋˜, BatteryModule.kt๋งŒ ์œ„์™€ ๊ฐ™์ด ๋ฐ”๊พผ๋‹ค. @Binds ์–ด๋…ธํ…Œ์ด์…˜์€ ์„ค๊ณ„์ƒ ๋ฌธ๋ฒ•์ ์œผ๋กœ ๋ฐ˜๋“œ์‹œ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ์— ๋ถ™๋Š”๋‹ค. ์–ด์งธ์„œ์ผ๊นŒ? @Binds๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ Binding์ด ๋ชฉ์ ์ด๊ธฐ์—, ์‹ค์ œ๋กœ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๋น„(้ž)์ถ”์ƒ ๋ฉ”์†Œ๋“œ์™€ ํ•จ๊ป˜ํ•  ์ด์œ ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด(์—ฌ๊ธฐ์„œ๋Š” EcoFriendlyBattery)๋ฅผ (Battery์—) ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ฒŒ @Binds ๋ฉ”์†Œ๋“œ์˜ ์—ญํ• ์ด๋‹ค.

 

๋˜, ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ธฐ ์œ„ํ•ด์„  ์ถ”์ƒ ํด๋ž˜์Šค์—ฌ์•ผํ•˜๋ฏ€๋กœ @Module ํด๋ž˜์Šค๋ฅผ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ ๋‹ค. dagger ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์ถ”์ƒ @Module ํด๋ž˜์Šค ์•ˆ์—๋Š” ๋ฐ˜๋“œ์‹œ @Binds ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์„ ๊ฑฐ๋ผ๊ณ  ์ธ์‹ํ•˜๊ณ  ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

#3-4 ์ž‘๋™ ํ™•์ธ (๋กœ๊ทธ ๋ฉ”์‹œ์ง€)

Crankshaft is ready
Cylinder is ready
Piston is ready
Engine is ready
Airbag is ready
EcoFriendly
Battery is ready
Car is ready

 

#4 ์š”์•ฝ

@Binds๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.

 

#5 ์™„์„ฑ๋œ ์•ฑ

 

android-practice/dagger2/InterfaceDependency at master ยท Kanmanemone/android-practice

Contribute to Kanmanemone/android-practice development by creating an account on GitHub.

github.com