#1 ์์กด์ฑ ์ฃผ์ (Dependency Injection)์ด๋?
#1-1 Dependent์ Dependency
fun main() {
val car = Car()
car.startCar()
}
class Car {
private val engine = Engine()
private val airbag = Airbag()
private val battery = Battery()
fun startCar() {
engine.startEngine()
airbag.startAirbag()
battery.startBattery()
println("${this::class.simpleName} is ready")
}
}
Car ํด๋์ค๋ Engine, Battery, Airbag ํด๋์ค์ ์์กด(= Car๊ฐ ์์ผ๋ฉด ์๋ฆฝ ๋ถ๊ฐ)ํ๊ณ ์๋ค. ์ด ๊ด๊ณ์์ Car๋ Engineใ Airbagใ Battery์ Dependent๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, Engineใ Airbagใ Battery๋ Car์ Dependency๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ ์ฒด ์์ค ์ฝ๋
/* ~ ์คํ ๋ฐฉ๋ฒ ~
* 1. https://play.kotlinlang.org์ ์ ์
* 2. ์ฌ๊ธฐ์ ์๋ ์ฝ๋ ๋ณต์ฌ
* 3. ์ ์ํ ํ์ด์ง์ ๋ถ์ฌ ๋ฃ๊ธฐ
* 4. ์ ์ํ ํ์ด์ง์ ์๋ Run ๋ฒํผ ํด๋ฆญ
*
* ~ ์คํ ๊ฒฐ๊ณผ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ~
* Crankshaft is ready
* Cylinder is ready
* Piston is ready
* Engine is ready
* Airbag is ready
* Battery is ready
* Car is ready
*/
fun main() {
val car = Car()
car.startCar()
}
class Car {
private val engine = Engine()
private val airbag = Airbag()
private val battery = Battery()
fun startCar() {
engine.startEngine()
airbag.startAirbag()
battery.startBattery()
println("${this::class.simpleName} is ready")
}
}
class Engine {
private val piston = Piston()
fun startEngine() {
piston.startPiston()
println("${this::class.simpleName} is ready")
}
}
class Airbag {
fun startAirbag() {
println("${this::class.simpleName} is ready")
}
}
class Battery {
fun startBattery() {
println("${this::class.simpleName} is ready")
}
}
class Piston {
private val crankshaft = Crankshaft()
private val cylinder = Cylinder()
fun startPiston() {
crankshaft.startCrankshaft()
cylinder.startCylinder()
println("${this::class.simpleName} is ready")
}
}
class Crankshaft {
fun startCrankshaft() {
println("${this::class.simpleName} is ready")
}
}
class Cylinder {
fun startCylinder() {
println("${this::class.simpleName} is ready")
}
}
#1-2 ๊ฐ์ ์ Dependency
class Engine {
private val piston = Piston()
fun startEngine() {
piston.startPiston()
println("${this::class.simpleName} is ready")
}
}
์ด๋ฒ์ Engine ํด๋์ค๋ฅผ ์ดํด๋ณธ๋ค. Engine์ Pistone ํด๋์ค์ Dependent, Pistone์ Engine์ Dependency๋ค. ๊ทธ๋ ๋ค๋ฉด, Car์ Piston์ ๊ด๊ณ๋ ์ด๋จ๊น? ์๋ก๊ฐ ์๋ก์๊ฒ ์ง์ ์ ์ธ Dependent ๋ฐ Dependency๋ ์๋์ง๋ง, ๊ฐ์ ์ ์ธ Dependent ๋ฐ Dependency๋ผ๊ณ ๋ ๋ณผ ์ ์์ ๊ฒ์ด๋ค.
#1-3 ์ ์ฒด ์์กด์ฑ ๊ทธ๋ํ

๋ณธ ๊ฒ์๊ธ์์ ๋ค๋ฃฐ ํด๋์ค๋ค์ ์์กด ๊ด๊ณ๋ฅผ, ์์กด์ฑ ๊ทธ๋ํ๋ก ํํํ๋ฉด ์์ ๊ฐ๋ค.
#1-4 ์์กด์ฑ ์ฃผ์
์์ ์๋ Car, Engine, Piston์ ์์์ฒ๋ผ ์์กด์ฑ์ด '๋ฐ์ ํ๊ฒ ๊ฒฐํฉ'(= ๊ฐ ํด๋์ค ๋ด๋ถ์ ๋ ๋ค๋ฅธ ํด๋์ค๊ฐ ์ ์๋จ)๋์ด ์์ผ๋ฉด ํ
์คํธ, ๋ฒ๊ทธ ์์ , ์ฝ๋ ํ์ฅ์ด ๋งค์ฐ ์ด๋ ต๋ค. ์ด๋ ๊ฐ ํด๋์ค๋ผ๋ฆฌ๋ ๋์จํ๊ฒ ๊ฒฐํฉ๋๋ฉด์, ํด๋์ค ํ๋ํ๋์ ๋ด๋ถ์์ ๋์ ์์ง๋ ฅ์ ์ง๋๋ค๋ผ๋ ๊ฐ์ฒด ์งํฅ์ ๊ธฐ๋ณธ ์ฒ ์น์ ์ ธ๋ฒ๋ฆฌ๋ ํจํด์ด๊ธฐ๋ ํ๋ค. ์ด ํจํด์ ํด๊ฒฐํ๊ธฐ ์ํด์, ์์กด์ฑ ์ฃผ์
(Dependency Injection)์ด๋ผ๋ ์๋ก์ด ํจํด์ด ๋ฑ์ฅํ๋ค.
Dependency ์ฆ, Car ์
์ฅ์์์ Dependency์๋ Engine์ Car ํด๋์ค์ ์ฃผ์
(Injection)ํ๊ณ Engine ์
์ฅ์์์ Dependency์๋ Piston์ Engine ํด๋์ค์ ์ฃผ์
(Injection)ํ๋ ๊ฒ. ์ด๊ฒ์ด ์์กด์ฑ ์ฃผ์
์ด๋ค. '์ฃผ์
'์ด๋ผ๋ ๋จ์ด์์ ์ ์ ์๋ฏ์ด, ์ธ๋ถ์์ ๋ด๋ถ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ฃ๋๋ค๋ ์ด๋ฏธ์ง ๊ทธ๋๋ก์ ๊ฐ๋
์ด ๋ง๋ค. ์ด๋ ต๊ฒ ์๊ฐํ ๊ฒ ์์ด, ํด๋์ค ๋ด๋ถ๊ฐ ์๋๋ผ ์ธ๋ถ์ Denpendency๋ฅผ ์ฎ๊ฒจ๋ค๋์ผ๋ฉด ๊ทธ๊ฒ ์์กด์ฑ ์ฃผ์
์ด๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด์.
#2 ์์กด์ฑ ์ฃผ์ ์ 3๊ฐ์ง ๊ตฌํ ๋ฐฉ์
#2-1 Constructor Injection (์์ฑ์ ์ฃผ์ )
fun main() {
val crankshaft = Crankshaft()
val cylinder = Cylinder()
val piston = Piston(crankshaft, cylinder)
val engine = Engine(piston)
val airbag = Airbag()
val battery = Battery()
val car = Car(engine, airbag, battery)
car.startCar()
}
class Car(
private val engine: Engine,
private val airbag: Airbag,
private val battery: Battery
) {
fun startCar() {
engine.startEngine()
airbag.startAirbag()
battery.startBattery()
println("${this::class.simpleName} is ready")
}
}
์์ฑ์๋ ํด๋์ค์ ์ธ๋ถ๋ก๋ถํฐ ๋ฌด์ธ๊ฐ๋ฅผ ์ ๋ฌํด์ค ์ ์๋ ๋ํ์ ์ธ ์ํต ์ฐฝ๊ตฌ๋ค. ์์ฑ์ ์ฃผ์
(Constructor Injection)์ Dependent์ ์์ฑ์๊ฐ Dependency๋ฅผ ์ธ์๋ก์ ๋ฐ๊ฒ๋ ๋ง๋๋ ๋ฐฉ์์ ๋งํ๋ค. ์๋๋ก์ด๋ ํ๋ก์ ํธ์์ ๊ฐ์ฅ ๊ถ์ฅ๋๋ Dependency Injection ์ ํ์ด๊ธฐ๋ ํ๋ค.
์ ์ฒด ์์ค ์ฝ๋
/* ~ ์คํ ๋ฐฉ๋ฒ ~
* 1. https://play.kotlinlang.org์ ์ ์
* 2. ์ฌ๊ธฐ์ ์๋ ์ฝ๋ ๋ณต์ฌ
* 3. ์ ์ํ ํ์ด์ง์ ๋ถ์ฌ ๋ฃ๊ธฐ
* 4. ์ ์ํ ํ์ด์ง์ ์๋ Run ๋ฒํผ ํด๋ฆญ
*
* ~ ์คํ ๊ฒฐ๊ณผ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ~
* Crankshaft is ready
* Cylinder is ready
* Piston is ready
* Engine is ready
* Airbag is ready
* Battery is ready
* Car is ready
*/
fun main() {
val crankshaft = Crankshaft()
val cylinder = Cylinder()
val piston = Piston(crankshaft, cylinder)
val engine = Engine(piston)
val airbag = Airbag()
val battery = Battery()
val car = Car(engine, airbag, battery)
car.startCar()
}
class Car(
private val engine: Engine,
private val airbag: Airbag,
private val battery: Battery
) {
fun startCar() {
engine.startEngine()
airbag.startAirbag()
battery.startBattery()
println("${this::class.simpleName} is ready")
}
}
class Engine(private val piston: Piston) {
fun startEngine() {
piston.startPiston()
println("${this::class.simpleName} is ready")
}
}
class Airbag {
fun startAirbag() {
println("${this::class.simpleName} is ready")
}
}
class Battery {
fun startBattery() {
println("${this::class.simpleName} is ready")
}
}
class Piston(
private val crankshaft: Crankshaft,
private val cylinder: Cylinder
) {
fun startPiston() {
crankshaft.startCrankshaft()
cylinder.startCylinder()
println("${this::class.simpleName} is ready")
}
}
class Crankshaft {
fun startCrankshaft() {
println("${this::class.simpleName} is ready")
}
}
class Cylinder {
fun startCylinder() {
println("${this::class.simpleName} is ready")
}
}
#2-2 Method Injection (ํจ์ ์ฃผ์ )
fun main() {
val crankshaft = Crankshaft()
val cylinder = Cylinder()
val piston = Piston()
piston.setDependencies(crankshaft, cylinder)
val engine = Engine()
engine.setPiston(piston)
val airbag = Airbag()
val battery = Battery()
val car = Car()
car.setDependencies(engine, airbag, battery)
car.startCar()
}
class Car {
private lateinit var engine: Engine
private lateinit var airbag: Airbag
private lateinit var battery: Battery
fun setDependencies(
engine: Engine,
airbag: Airbag,
battery: Battery
) {
this.engine = engine
this.airbag = airbag
this.battery = battery
}
fun startCar() {
engine.startEngine()
airbag.startAirbag()
battery.startBattery()
println("${this::class.simpleName} is ready")
}
}
ํด๋์ค์ dependency๋ค์ ์ด๊ธฐํํ๋ ํจ์(Method)๋ฅผ ๋๋ ๋ฐฉ์์ด๋ค.
์ ์ฒด ์์ค ์ฝ๋
/* ~ ์คํ ๋ฐฉ๋ฒ ~
* 1. https://play.kotlinlang.org์ ์ ์
* 2. ์ฌ๊ธฐ์ ์๋ ์ฝ๋ ๋ณต์ฌ
* 3. ์ ์ํ ํ์ด์ง์ ๋ถ์ฌ ๋ฃ๊ธฐ
* 4. ์ ์ํ ํ์ด์ง์ ์๋ Run ๋ฒํผ ํด๋ฆญ
*
* ~ ์คํ ๊ฒฐ๊ณผ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ~
* Crankshaft is ready
* Cylinder is ready
* Piston is ready
* Engine is ready
* Airbag is ready
* Battery is ready
* Car is ready
*/
fun main() {
val crankshaft = Crankshaft()
val cylinder = Cylinder()
val piston = Piston()
piston.setDependencies(crankshaft, cylinder)
val engine = Engine()
engine.setPiston(piston)
val airbag = Airbag()
val battery = Battery()
val car = Car()
car.setDependencies(engine, airbag, battery)
car.startCar()
}
class Car {
private lateinit var engine: Engine
private lateinit var airbag: Airbag
private lateinit var battery: Battery
fun setDependencies(
engine: Engine,
airbag: Airbag,
battery: Battery
) {
this.engine = engine
this.airbag = airbag
this.battery = battery
}
fun startCar() {
engine.startEngine()
airbag.startAirbag()
battery.startBattery()
println("${this::class.simpleName} is ready")
}
}
class Engine {
private lateinit var piston: Piston
fun setPiston(piston: Piston) {
this.piston = piston
}
fun startEngine() {
piston.startPiston()
println("${this::class.simpleName} is ready")
}
}
class Airbag {
fun startAirbag() {
println("${this::class.simpleName} is ready")
}
}
class Battery {
fun startBattery() {
println("${this::class.simpleName} is ready")
}
}
class Piston {
private lateinit var crankshaft: Crankshaft
private lateinit var cylinder: Cylinder
fun setDependencies(
crankshaft: Crankshaft,
cylinder: Cylinder
) {
this.crankshaft = crankshaft
this.cylinder = cylinder
}
fun startPiston() {
crankshaft.startCrankshaft()
cylinder.startCylinder()
println("${this::class.simpleName} is ready")
}
}
class Crankshaft {
fun startCrankshaft() {
println("${this::class.simpleName} is ready")
}
}
class Cylinder {
fun startCylinder() {
println("${this::class.simpleName} is ready")
}
}
#2-3 Field Injection (๋ฉค๋ฒ ๋ณ์ ์ฃผ์ )
fun main() {
val crankshaft = Crankshaft()
val cylinder = Cylinder()
val piston = Piston()
piston.crankshaft = crankshaft
piston.cylinder = cylinder
val engine = Engine()
engine.piston = piston
val airbag = Airbag()
val battery = Battery()
val car = Car()
car.engine = engine
car.airbag = airbag
car.battery = battery
car.startCar()
}
class Car {
public lateinit var engine: Engine
public lateinit var airbag: Airbag
public lateinit var battery: Battery
fun startCar() {
engine.startEngine()
airbag.startAirbag()
battery.startBattery()
println("${this::class.simpleName} is ready")
}
}
ํด๋์ค์ ํ๋กํผํฐ๋ฅผ public์ผ๋ก ์ค์ ํ๋ ๋ฐฉ์์ด๋ค.
์ ์ฒด ์์ค ์ฝ๋
/* ~ ์คํ ๋ฐฉ๋ฒ ~
* 1. https://play.kotlinlang.org์ ์ ์
* 2. ์ฌ๊ธฐ์ ์๋ ์ฝ๋ ๋ณต์ฌ
* 3. ์ ์ํ ํ์ด์ง์ ๋ถ์ฌ ๋ฃ๊ธฐ
* 4. ์ ์ํ ํ์ด์ง์ ์๋ Run ๋ฒํผ ํด๋ฆญ
*
* ~ ์คํ ๊ฒฐ๊ณผ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ~
* Crankshaft is ready
* Cylinder is ready
* Piston is ready
* Engine is ready
* Airbag is ready
* Battery is ready
* Car is ready
*/
fun main() {
val crankshaft = Crankshaft()
val cylinder = Cylinder()
val piston = Piston()
piston.crankshaft = crankshaft
piston.cylinder = cylinder
val engine = Engine()
engine.piston = piston
val airbag = Airbag()
val battery = Battery()
val car = Car()
car.engine = engine
car.airbag = airbag
car.battery = battery
car.startCar()
}
class Car {
public lateinit var engine: Engine
public lateinit var airbag: Airbag
public lateinit var battery: Battery
fun startCar() {
engine.startEngine()
airbag.startAirbag()
battery.startBattery()
println("${this::class.simpleName} is ready")
}
}
class Engine {
public lateinit var piston: Piston
fun startEngine() {
piston.startPiston()
println("${this::class.simpleName} is ready")
}
}
class Airbag {
fun startAirbag() {
println("${this::class.simpleName} is ready")
}
}
class Battery {
fun startBattery() {
println("${this::class.simpleName} is ready")
}
}
class Piston {
public lateinit var crankshaft: Crankshaft
public lateinit var cylinder: Cylinder
fun startPiston() {
crankshaft.startCrankshaft()
cylinder.startCylinder()
println("${this::class.simpleName} is ready")
}
}
class Crankshaft {
fun startCrankshaft() {
println("${this::class.simpleName} is ready")
}
}
class Cylinder {
fun startCylinder() {
println("${this::class.simpleName} is ready")
}
}
#3 ์ ์ฒด ์์ค ์ฝ๋ ๋ชจ์
์์กด์ฑ ์ฃผ์ ์ ๊ตฌํํ๊ธฐ ์ + ์์กด์ฑ ์ฃผ์ ์ 3๊ฐ์ง ์ ํ
#4 ์์ฝ
์์กด์ฑ์ ์ฃผ์ ์ '๋ ธ์ถ'์ ๋ฌธ์ ๋ค.
#5 ์ด์ด์ง๋ ๊ธ
[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
์์กด์ฑ ์ฃผ์ ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ Dagger2์ ๋ํด ์์๋ณธ๋ค.
'๊นจ์ ๊ฐ๋ ๐ > ๊ธฐํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Kotlin] Coroutines Flow - Cold Flow์ Hot Flow (SharedFlow) (0) | 2024.08.07 |
|---|---|
| Unit Testing - Test double (0) | 2024.06.30 |
| REST API (REpresentational State Transfer Application Programming Interface) (1) | 2024.05.26 |
| API (Application Programming Interface) (0) | 2023.12.18 |
| API, Framework, SDK, Tool, Project, Architecture, IDE, Library, Package์ ๊ด๊ณ (2) | 2023.12.12 |