μ’ μ νλͺ© μ½μ (DI)μ΄λ?
μ’ μ νλͺ© μ½μ (Dependency Injection, DI)μ μννΈμ¨μ΄ κ°λ°μμ λ리 μ¬μ©λλ κ°λ μΌλ‘, Android μ± κ°λ°μμλ μ€μν μν μ νλ€. DIλ₯Ό νμ©νλ©΄ μ½λμ μ¬μ¬μ©μ±μ λμ΄κ³ , 리ν©ν°λ§μ μ©μ΄νκ² νλ©°, ν μ€νΈλ₯Ό μ½κ² λ§λ€ μ μλ€. νΉν, Android μ± κ°λ°μμλ DIλ₯Ό μ¬λ°λ₯΄κ² νμ©νλ©΄ μ± μν€ν μ²λ₯Ό λμ± νννκ² κ΅¬μΆν μ μλ€.
μ’ μ νλͺ© μ½μ μ νμμ±
μΌλ°μ μΌλ‘ ν΄λμ€λ λ€λ₯Έ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό νμλ‘ νλ€. μλ₯Ό λ€μ΄, μλμ°¨(Car) ν΄λμ€κ° μμ§(Engine) ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό νμλ‘ νλ€κ³ κ°μ ν΄ λ³΄κ² λ€.
1. μ’ μ νλͺ©μ μ§μ μμ±νλ κ²½μ° (DI λ―Έμ¬μ©)
class Car {
private val engine = Engine()
fun start() {
engine.start()
}
}
fun main() {
val car = Car()
car.start()
}
μ΄ λ°©λ²μ λ¨μν΄ λ³΄μ΄μ§λ§, λͺ κ°μ§ λ¬Έμ κ° μλ€.
- Car ν΄λμ€κ° Engine ν΄λμ€μ κ°νκ² κ²°ν©λμ΄ μμ΄, Engineμ λ³κ²½νλ €λ©΄ Carλ μμ ν΄μΌ νλ€.
- Engineμ Mockingνκ±°λ κ΅μ²΄νκΈ° μ΄λ €μ ν μ€νΈνκΈ° νλ μ½λκ° λλ€.

2. μ’ μ νλͺ© μ½μ μ μ¬μ©νλ κ²½μ°
DIλ₯Ό μ μ©νλ©΄ Car ν΄λμ€κ° μ§μ Engineμ μμ±νμ§ μκ³ , μμ±μλ₯Ό ν΅ν΄ μΈλΆμμ Engineμ μ£Όμ λ°λλ‘ λ³κ²½ν μ μλ€.
class Car(private val engine: Engine) {
fun start() {
engine.start()
}
}
fun main() {
val engine = Engine()
val car = Car(engine)
car.start()
}
μ΄ λ°©λ²μ μ¬μ©νλ©΄:
- Engineμ λ€λ₯Έ ꡬν체(ElectricEngine λ±) λ₯Ό μ½κ² μ£Όμ ν μ μμ΄ νμ₯μ±μ΄ λμμ§λ€.
- ν μ€νΈ μ κ°μ§ κ°μ²΄(Mock)λ₯Ό μ£Όμ ν μ μμ΄ λ€μν ν μ€νΈκ° κ°λ₯νλ€.

Androidμμ DIλ₯Ό μ μ©νλ λ°©λ²
1. μμ±μ μ½μ (Constructor Injection)
ν΄λμ€μ μμ±μλ₯Ό ν΅ν΄ μ’ μ νλͺ©μ μ£Όμ νλ λ°©μμΌλ‘, κ°μ₯ μΌλ°μ μΈ λ°©λ²μ΄λ€.
class Car @Inject constructor(private val engine: Engine) {
fun start() {
engine.start()
}
}
μ΄ λ°©μμ λλΆλΆμ μΌλ° ν΄λμ€μμ μ μ©ν μ μμ§λ§, Activityλ Fragmentμ²λΌ μμ€ν μμ μΈμ€ν΄μ€ννλ ν΄λμ€μλ μ μ©ν μ μλ€.
2. νλ μ½μ (Field Injection)
Activityλ Fragmentμ κ°μ΄ μ§μ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ κ²½μ°, νλ μ½μ μ νμ©ν μ μλ€.
class Car {
@Inject
lateinit var engine: Engine
fun start() {
engine.start()
}
}
μ’ μ νλͺ© μλ μ½μ κ³Ό DI λΌμ΄λΈλ¬λ¦¬
μλμΌλ‘ μ’ μ νλͺ©μ κ΄λ¦¬νλ©΄ μ½λκ° λ³΅μ‘ν΄μ§ μ μκΈ° λλ¬Έμ, μλμΌλ‘ μ’ μ νλͺ©μ κ΄λ¦¬νλ DI λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²μ΄ μΌλ°μ μ΄λ€.
1. Dagger
Daggerλ Googleμ΄ μ 곡νλ κ°λ ₯ν DI λΌμ΄λΈλ¬λ¦¬λ‘, μ»΄νμΌ νμμ μ’ μ νλͺ© κ·Έλνλ₯Ό μμ±νμ¬ λ°νμ μ±λ₯μ΄ μ°μνλ€.
2. Hilt (Android 곡μ DI λΌμ΄λΈλ¬λ¦¬)
Hiltλ Dagger κΈ°λ°μ Android μ μ© DI λΌμ΄λΈλ¬λ¦¬λ‘, Jetpackκ³Ό μλ²½νκ² ν΅ν©λμ΄ μλ€.
@HiltAndroidApp
class MyApplication : Application()
@AndroidEntryPoint
class MyActivity : AppCompatActivity() {
@Inject lateinit var car: Car
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
car.start()
}
}
Hiltλ₯Ό μ¬μ©νλ©΄ κ°λ¨ν μ΄λ Έν μ΄μ λ§μΌλ‘ DIλ₯Ό μ μ©ν μ μμ΄ μ½λκ° κΉλν΄μ§λ€.
μ’ μ νλͺ© μ½μ vs μλΉμ€ λ‘μΌμ΄ν°
μλΉμ€ λ‘μΌμ΄ν°(Service Locator)λ DIμ λμμΌλ‘, μ’ μ νλͺ©μ μ μμ μΌλ‘ κ΄λ¦¬νλ ν¨ν΄μ΄λ€.
object ServiceLocator {
fun getEngine(): Engine = Engine()
}
class Car {
private val engine = ServiceLocator.getEngine()
fun start() {
engine.start()
}
}
κ·Έλ¬λ, μλΉμ€ λ‘μΌμ΄ν°λ λ€μκ³Ό κ°μ λ¨μ μ΄ μλ€.
- ν μ€νΈνκΈ° μ΄λ ΅λ€: μ μμ μΌλ‘ κ΄λ¦¬λκΈ° λλ¬Έμ νΉμ μ’ μ νλͺ©μ κ΅μ²΄νκΈ° μ΄λ ΅λ€.
- λ°νμ μ€λ₯ λ°μ κ°λ₯μ±: μ’ μ νλͺ©μ΄ μ¨κ²¨μ Έ μμ΄, νμν κ°μ²΄κ° μ¬λ°λ₯΄κ² μ£Όμ λμ§ μμΌλ©΄ μ€ν μ€μ μ€λ₯κ° λ°μν μ μλ€.
λ°λΌμ, DIκ° λ μμ νκ³ μ μ§λ³΄μκ° μ¬μ΄ λ°©λ²μΌλ‘ κΆμ₯λλ€.
κ²°λ‘
μ’ μ νλͺ© μ½μ (DI)μ μ½λμ μ¬μ¬μ©μ±, μ μ§λ³΄μμ±, ν μ€νΈ μ©μ΄μ±μ ν₯μμν€λ μ€μν κ°λ μ΄λ€. Android μ± κ°λ°μμλ Hiltμ κ°μ DI λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ©΄ λ³΄λ€ μ½κ² DIλ₯Ό μ μ©ν μ μλ€.
μ°Έκ³ μλ£ : https://developer.android.com/training/dependency-injection?hl=ko
'π€ μλλ‘μ΄λ > μν€ν μ²' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ’ μ νλͺ© μ½μ (DI)μ΄λ?
μ’ μ νλͺ© μ½μ (Dependency Injection, DI)μ μννΈμ¨μ΄ κ°λ°μμ λ리 μ¬μ©λλ κ°λ μΌλ‘, Android μ± κ°λ°μμλ μ€μν μν μ νλ€. DIλ₯Ό νμ©νλ©΄ μ½λμ μ¬μ¬μ©μ±μ λμ΄κ³ , 리ν©ν°λ§μ μ©μ΄νκ² νλ©°, ν μ€νΈλ₯Ό μ½κ² λ§λ€ μ μλ€. νΉν, Android μ± κ°λ°μμλ DIλ₯Ό μ¬λ°λ₯΄κ² νμ©νλ©΄ μ± μν€ν μ²λ₯Ό λμ± νννκ² κ΅¬μΆν μ μλ€.
μ’ μ νλͺ© μ½μ μ νμμ±
μΌλ°μ μΌλ‘ ν΄λμ€λ λ€λ₯Έ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό νμλ‘ νλ€. μλ₯Ό λ€μ΄, μλμ°¨(Car) ν΄λμ€κ° μμ§(Engine) ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό νμλ‘ νλ€κ³ κ°μ ν΄ λ³΄κ² λ€.
1. μ’ μ νλͺ©μ μ§μ μμ±νλ κ²½μ° (DI λ―Έμ¬μ©)
class Car {
private val engine = Engine()
fun start() {
engine.start()
}
}
fun main() {
val car = Car()
car.start()
}
μ΄ λ°©λ²μ λ¨μν΄ λ³΄μ΄μ§λ§, λͺ κ°μ§ λ¬Έμ κ° μλ€.
- Car ν΄λμ€κ° Engine ν΄λμ€μ κ°νκ² κ²°ν©λμ΄ μμ΄, Engineμ λ³κ²½νλ €λ©΄ Carλ μμ ν΄μΌ νλ€.
- Engineμ Mockingνκ±°λ κ΅μ²΄νκΈ° μ΄λ €μ ν μ€νΈνκΈ° νλ μ½λκ° λλ€.

2. μ’ μ νλͺ© μ½μ μ μ¬μ©νλ κ²½μ°
DIλ₯Ό μ μ©νλ©΄ Car ν΄λμ€κ° μ§μ Engineμ μμ±νμ§ μκ³ , μμ±μλ₯Ό ν΅ν΄ μΈλΆμμ Engineμ μ£Όμ λ°λλ‘ λ³κ²½ν μ μλ€.
class Car(private val engine: Engine) {
fun start() {
engine.start()
}
}
fun main() {
val engine = Engine()
val car = Car(engine)
car.start()
}
μ΄ λ°©λ²μ μ¬μ©νλ©΄:
- Engineμ λ€λ₯Έ ꡬν체(ElectricEngine λ±) λ₯Ό μ½κ² μ£Όμ ν μ μμ΄ νμ₯μ±μ΄ λμμ§λ€.
- ν μ€νΈ μ κ°μ§ κ°μ²΄(Mock)λ₯Ό μ£Όμ ν μ μμ΄ λ€μν ν μ€νΈκ° κ°λ₯νλ€.

Androidμμ DIλ₯Ό μ μ©νλ λ°©λ²
1. μμ±μ μ½μ (Constructor Injection)
ν΄λμ€μ μμ±μλ₯Ό ν΅ν΄ μ’ μ νλͺ©μ μ£Όμ νλ λ°©μμΌλ‘, κ°μ₯ μΌλ°μ μΈ λ°©λ²μ΄λ€.
class Car @Inject constructor(private val engine: Engine) {
fun start() {
engine.start()
}
}
μ΄ λ°©μμ λλΆλΆμ μΌλ° ν΄λμ€μμ μ μ©ν μ μμ§λ§, Activityλ Fragmentμ²λΌ μμ€ν μμ μΈμ€ν΄μ€ννλ ν΄λμ€μλ μ μ©ν μ μλ€.
2. νλ μ½μ (Field Injection)
Activityλ Fragmentμ κ°μ΄ μ§μ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ κ²½μ°, νλ μ½μ μ νμ©ν μ μλ€.
class Car {
@Inject
lateinit var engine: Engine
fun start() {
engine.start()
}
}
μ’ μ νλͺ© μλ μ½μ κ³Ό DI λΌμ΄λΈλ¬λ¦¬
μλμΌλ‘ μ’ μ νλͺ©μ κ΄λ¦¬νλ©΄ μ½λκ° λ³΅μ‘ν΄μ§ μ μκΈ° λλ¬Έμ, μλμΌλ‘ μ’ μ νλͺ©μ κ΄λ¦¬νλ DI λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²μ΄ μΌλ°μ μ΄λ€.
1. Dagger
Daggerλ Googleμ΄ μ 곡νλ κ°λ ₯ν DI λΌμ΄λΈλ¬λ¦¬λ‘, μ»΄νμΌ νμμ μ’ μ νλͺ© κ·Έλνλ₯Ό μμ±νμ¬ λ°νμ μ±λ₯μ΄ μ°μνλ€.
2. Hilt (Android 곡μ DI λΌμ΄λΈλ¬λ¦¬)
Hiltλ Dagger κΈ°λ°μ Android μ μ© DI λΌμ΄λΈλ¬λ¦¬λ‘, Jetpackκ³Ό μλ²½νκ² ν΅ν©λμ΄ μλ€.
@HiltAndroidApp
class MyApplication : Application()
@AndroidEntryPoint
class MyActivity : AppCompatActivity() {
@Inject lateinit var car: Car
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
car.start()
}
}
Hiltλ₯Ό μ¬μ©νλ©΄ κ°λ¨ν μ΄λ Έν μ΄μ λ§μΌλ‘ DIλ₯Ό μ μ©ν μ μμ΄ μ½λκ° κΉλν΄μ§λ€.
μ’ μ νλͺ© μ½μ vs μλΉμ€ λ‘μΌμ΄ν°
μλΉμ€ λ‘μΌμ΄ν°(Service Locator)λ DIμ λμμΌλ‘, μ’ μ νλͺ©μ μ μμ μΌλ‘ κ΄λ¦¬νλ ν¨ν΄μ΄λ€.
object ServiceLocator {
fun getEngine(): Engine = Engine()
}
class Car {
private val engine = ServiceLocator.getEngine()
fun start() {
engine.start()
}
}
κ·Έλ¬λ, μλΉμ€ λ‘μΌμ΄ν°λ λ€μκ³Ό κ°μ λ¨μ μ΄ μλ€.
- ν μ€νΈνκΈ° μ΄λ ΅λ€: μ μμ μΌλ‘ κ΄λ¦¬λκΈ° λλ¬Έμ νΉμ μ’ μ νλͺ©μ κ΅μ²΄νκΈ° μ΄λ ΅λ€.
- λ°νμ μ€λ₯ λ°μ κ°λ₯μ±: μ’ μ νλͺ©μ΄ μ¨κ²¨μ Έ μμ΄, νμν κ°μ²΄κ° μ¬λ°λ₯΄κ² μ£Όμ λμ§ μμΌλ©΄ μ€ν μ€μ μ€λ₯κ° λ°μν μ μλ€.
λ°λΌμ, DIκ° λ μμ νκ³ μ μ§λ³΄μκ° μ¬μ΄ λ°©λ²μΌλ‘ κΆμ₯λλ€.
κ²°λ‘
μ’ μ νλͺ© μ½μ (DI)μ μ½λμ μ¬μ¬μ©μ±, μ μ§λ³΄μμ±, ν μ€νΈ μ©μ΄μ±μ ν₯μμν€λ μ€μν κ°λ μ΄λ€. Android μ± κ°λ°μμλ Hiltμ κ°μ DI λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ©΄ λ³΄λ€ μ½κ² DIλ₯Ό μ μ©ν μ μλ€.
μ°Έκ³ μλ£ : https://developer.android.com/training/dependency-injection?hl=ko