κΉ¨μ•Œ κ°œλ… πŸ“‘/기타

μ˜μ‘΄μ„± κ·Έλž˜ν”„(Dependency graph), 데이터 흐름도(Data-flow diagram)

interfacer_han 2025. 12. 11. 16:30

#1 μ˜μ‘΄μ„± κ·Έλž˜ν”„

 

https://en.wikipedia.org/wiki/Dependency_graph#/media/File:Dependencygraph.png

μ˜μ–΄λ‘œλŠ” Dependency graphλ‹€. 각 λ…Έλ“œλŠ” 클래슀, ν™”μ‚΄ν‘œλŠ” 클래슀 κ°„μ˜ 쒅속성을 λ‚˜νƒ€λ‚Έλ‹€.

 

κ·Έλž˜ν”„ μ½λŠ” 법

예λ₯Ό λ“€μ–΄, μœ„μ˜ κ·Έλž˜ν”„μƒμ—μ„œ AλŠ” B에 μ’…μ†λœλ‹€. μ’…μ†μ˜ 사전적 μ˜λ―ΈλŠ” 'μžμ£Όμ„±μ΄ 없이 μ£Όκ°€ λ˜λŠ” 것에 λ”Έλ € λΆ™μŒ'이닀. μ’…속은 'μ•Œμ•„μ•Ό ν•œλ‹€'λΌλŠ” λ§λ‘œλ„ ν‘œν˜„ν•  수 μžˆλ‹€. λ”°λΌμ„œ AλŠ” B에 λŒ€ν•΄ μ•Œμ•„μ•Ό ν•œλ‹€. 반면, BλŠ” Aλ₯Ό λͺ°λΌλ„ λœλ‹€. Bλ₯Ό 섀계할 땐 Aμ—μ„œ 뭘 μ–΄λ–»κ²Œ ν• μ§€ μ „ν˜€ μ‹ κ²½ μ“°μ§€ μ•Šμ•„λ„ λœλ‹€λŠ” 것이닀 (λŒ€μ‹ , BλŠ” D에 λŒ€ν•΄ μ’…μ†μ μ΄λ―€λ‘œ Dλ₯Ό μ°Έμ‘°ν•˜λ©° 섀계해야 ν•œλ‹€). Aλ₯Ό 섀계할 땐 Bλ₯Ό μ•Œμ•„μ•Ό ν•œλ‹€. 'μ•Œμ•„μ•Ό ν•˜λŠ” μͺ½'μ—μ„œ 'λͺ°λΌλ„ λ˜λŠ” μͺ½'으둜 ν™”μ‚΄ν‘œλ₯Ό 이은 것이닀.

 

μ‰½κ²Œ μ½λŠ” 법

ν™”μ‚΄ν‘œμ— "depends on"이라고 μ“°μ—¬ μžˆλ‹€κ³  μƒμƒν•˜κ³  κ·ΈλŒ€λ‘œ 읽으면 λœλ‹€. "A depends on B" = "AλŠ” B에 μ˜μ‘΄ν•œλ‹€."

 

#1-1 μ˜ˆμ‹œ

μ˜μ‘΄μ„± μ£Όμž…(Dependency Injection)에 λŒ€ν•΄ 닀룬 κ²Œμ‹œκΈ€μ— μžˆλŠ” μ½”λ“œμ™€ κ·Έλž˜ν”„λ₯Ό κ°€μ Έμ™”λ‹€.

 

μ½”λ“œ

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 'μ˜μ‘΄μ„± μ—­μ „ 법칙'과의 μ—°κ΄€

 

SOLID 원칙

#1 ν”„λ‘œκ·Έλž¨μ˜ 운λͺ…κ³Ό μ„€κ³„μΈκ°„μ˜ 운λͺ…은 λͺ…ν™•ν•˜λ‹€. 특이점이 μ˜€μ§€ μ•ŠλŠ”λ‹€λŠ” κ°€μ •ν•˜μ—, 인간은 μ–Έμ  κ°„ λ°˜λ“œμ‹œ μ£½λŠ”λ‹€. ν”„λ‘œκ·Έλž¨μ˜ 운λͺ…도 λͺ…ν™•ν•˜λ‹€. ν•œ 번 개발된 ν”„λ‘œκ·Έλž¨μ€, λ―Έλž˜μ— λ°˜λ“œμ‹œ λ³€

kenel.tistory.com

μ˜μ‘΄μ„± κ·Έλž˜ν”„μ— μžˆλŠ” ν™”μ‚΄ν‘œμ˜ λ°©ν–₯이, 'μ—­μ „'μ΄λΌλŠ” λ‹¨μ–΄μ—μ„œ μ˜€λŠ” λŠ¬μ•™μŠ€λ₯Ό 잘 ν‘œν˜„ν•œλ‹€κ³  μƒκ°ν•œλ‹€ (μœ„ κ²Œμ‹œκΈ€ 속 DIP의 'What (μ •ν™•ν•œ μ„€λͺ…)' μ°Έμ‘°).

 

#2 데이터 흐름도

https://en.wikipedia.org/wiki/Data-flow_diagram#/media/File:Data-flow-diagram-example.svg

μ˜μ–΄λ‘œλŠ” Data-flow diagram이닀. λ­”κ°€ λͺ¨μ–‘이 λ‚œν•΄ν•œ 것 κ°™μ§€λ§Œ μ „ν˜€ μ‹ κ²½μ“°μ§€ μ•Šμ•„λ„ λœλ‹€.

 

κ·Έλž˜ν”„ μ½λŠ” 법

ν™”μ‚΄ν‘œκ°€ 데이터가 μ΄λ™ν•˜λŠ” κ²½λ‘œλΌλŠ” κ²ƒλ§Œ μ•Œλ©΄ λœλ‹€. κ·Έ μ™Έμ—λŠ” λ”±νžˆ μ•Œ ν•„μš”κ°€ μ—†λ‹€. 더 μžμ„Έν•œ μ •λ³΄λŠ” μœ„ν‚€λ°±κ³Όμ—μ„œ 읽자.

 

#2-1 μ˜ˆμ‹œ

https://github.com/android/nowinandroid/blob/main/docs/ArchitectureLearningJourney.md

ꡬ글 κ³΅μ‹μ˜ (데이터 흐름 외에도 μ—¬λŸ¬ 정보가 짬뽕 된) '데이터 흐름도'(?)λ‹€. 점선이 λ°μ΄ν„°μ˜ 흐름(데이터 λ³΄λ‚΄λŠ” μͺ½μ—μ„œ λ°›λŠ” μͺ½μœΌλ‘œ 이음)이고 싀선은 이벀트의 흐름(이벀트 μš”μ²­ν•˜λŠ” μͺ½μ—μ„œ μš”μ²­μ„ μˆ˜ν–‰ν•˜λŠ” μͺ½μœΌλ‘œ 이음)이닀. κ·Έλ ‡λ‹€. 이 데이터 νλ¦„λ„μ˜ μ‘΄μž¬λŠ”, μœ„μ—μ„œ κ·Έλž˜ν”„ μ½λŠ” 법을 λ”±νžˆ μ•Œ ν•„μš”κ°€ μ—†λ‹€κ³  λ§ν•œ μ΄μœ λ‹€. μš°λ¦¬κ°€ 데이터 μ‚¬μ΄μ–Έν‹°μŠ€νŠΈλ„ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— ν˜•μ‹μ— 얽맀일 ν•„μš”κ°€ μ „ν˜€ μ—†λ‹€. λ§Œμ•½ κ΅¬κΈ€μ˜ 마음이 κ°‘μžκΈ° λ°”λ€Œμ–΄, 흐름도 속 λ°μ΄ν„°μ˜ 흐름을 두 쀄 μ μ„ μœΌλ‘œ ν‘œκΈ°ν•˜κ³  μ΄λ²€νŠΈλŠ” μ§€κ·Έμž¬κ·Έ μ„ μœΌλ‘œ ν‘œκΈ°ν•˜λŠ” μ—…λ°μ΄νŠΈλ₯Ό 해도 μ•„λ¬΄λž˜λ„ μ’‹λ‹€λŠ” 것이닀.

 

κ·Έλž˜μ„œ 사싀 λͺ…μ‹œμ μœΌλ‘œ "이런 게 λ°”λ‘œ 데이터 νλ¦„λ„μž…λ‹ˆλ‹€!"라고 μ„€λͺ…ν•  κ°€μΉ˜λ„ μ—†λ‹€κ³  μƒκ°ν•œλ‹€. λ‹€λ§Œ, κ΅¬νƒœμ—¬ κ·Έλ ‡κ²Œ ν•œ μ΄μœ λŠ” μ•„λž˜μ— μžˆλŠ” μ£Όμ˜ν•  점 λ•Œλ¬Έμ΄λ‹€.

 

#2-2 μ£Όμ˜ν•  점

μ˜μ‘΄μ„± κ·Έλž˜ν”„λ₯Ό 보고 데이터 흐름을 μΆ”μΈ‘ν•˜κ±°λ‚˜, μ—­μœΌλ‘œ 데이터 흐름도λ₯Ό 보고 μ˜μ‘΄μ„± 관계λ₯Ό μΆ”μΈ‘ν•΄μ„  μ•ˆ λœλ‹€. 두 κ·Έλž˜ν”„μ—μ„œ λ‹€λ£¨λŠ” λ…Έλ“œμ˜ μ’…λ₯˜λ‚˜ λ°°μΉ˜λŠ” μ„œλ‘œ λΉ„μŠ·ν•˜μ§€λ§Œ, μ—„μ—°νžˆ λ‹€λ₯Έ μ„±κ²©μ˜ κ·Έλž˜ν”„λ‹€. κ°€λ Ή #2-1에 μžˆλŠ” 데이터 흐름도λ₯Ό λ‹€μ‹œ 보자. DataSource → RepositoryλΌλŠ” 데이터 흐름을 보고, Repository → DataSourceλΌλŠ” μ˜μ‘΄μ„± 관계λ₯Ό μΆ”μΈ‘ν•˜λŠ” 게 μ˜³μ€ 일일까? μ•„λ‹ˆλ‹€. μ•„λž˜μ™€ 같이,

 

이런 μ˜μ‘΄μ„± κ΅¬μ‘°μΌμ§€λŠ” 아무도 λͺ¨λ₯Έλ‹€.