DIP (Dependency Inversion Principle)

์ธํ„ฐํŽ˜์ด์Šค ์—ญ์ „์ด ์ผ์–ด๋‚ฌ๋ƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, ์ƒ์œ„ ๋ ˆ๋ฒจ์˜ ์ •์ฑ…์€ ํ•˜์œ„ ๋ ˆ๋ฒจ์˜ ์ƒ์„ธ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ๋‘˜ ๋‹ค ์ถ”์ƒ ํƒ€์ž…(Abstract Type)์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.

Object Oriented์˜ ํ•ต์‹ฌ

๊ฐ์ฒด์ง€ํ–ฅ์˜ ํ•ต์‹ฌ์€ IoC๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ๋ ˆ๋ฒจ์˜ ๋ชจ๋“ˆ์„ ํ•˜์œ„ ๋ ˆ๋ฒจ์˜ ๋ชจ๋“ˆ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ์ œ์–ด์˜ ํ๋ฆ„์„ ์—ญ์ „์‹œ์ผœ ์ƒ์œ„ ๋ ˆ๋ฒจ์˜ ๋กœ์ง์ด ํ•˜์œ„ ๋ ˆ๋ฒจ์˜ ๋ณ€๊ฒฝ์— ์˜ํ•ด์„œ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค.

    • ์™œ? ํ•˜์œ„ ๋ ˆ๋ฒจ์˜ ๋ณ€๊ฒฝ์€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

    • ํ•˜์œ„ ๋ ˆ๋ฒจ์˜ ๋ชจ๋“ˆ์€ OCP๋ฅผ ์ค€์ˆ˜ํ•˜๋ฉฐ ์ƒˆ๋กœ์šด ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Œ.

๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ํ•ต์‹ฌ์€ '์˜์กด์„ฑ ๊ด€๋ฆฌ(dependency management)' ์ด๋‹ค.

Structured Design

๊ตฌ์กฐ์  ๋””์ž์ธ์„ ํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ, Top-down ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ•˜๊ฒŒ ๋œ๋‹ค.

  1. main์—์„œ ์‹œ์ž‘ํ•ด์„œ main์ด ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ์„œ๋ธŒ ๋ฃจํ‹ด๋“ค์„ ์„ค๊ณ„

  2. ์„œ๋ธŒ๋ฃจํ‹ด์ด ํ˜ธ์ถœํ•ด์•ผ ํ•  ์„œ๋ธŒ๋ฃจํ‹ด์„ ์„ค๊ณ„

  3. ๊ทธ๋ฆฌ๊ณ  ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ์„œ๋ธŒ ๋ฃจํ‹ด์„ ๋ฐœ๊ฒฌํ•  ๋•Œ๊นŒ์ง€ ์ด๋ฅผ ๊ณ„์† ํ•˜ํ–ฅ(down)์œผ๋กœ ๋ฐ˜๋ณต

  4. ๊ทธ ํ›„์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ

์ด ๋ฐฉ์‹์—์„œ๋Š” ์†Œ์Šค์ฝ”๋“œ์˜ ์˜์กด์„ฑ๊ณผ ๋Ÿฐ ํƒ€์ž„ ์‹œ์ ์˜ ์˜์กด์„ฑ์ด Top-down์œผ๋กœ ๋™์ผํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ์ฆ‰, ๋งจ ๋ฐ‘์— ์žˆ๋Š” ๋ชจ๋“ˆ์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด ์ƒ์œ„๋กœ ๊ณ„์†ํ•ด์„œ ๋ณ€๊ฒฝ์ด ์œ ๋ฐœ๋œ๋‹ค.

Dependency Inversion

์ปดํŒŒ์ผ ํƒ€์ž„์˜ ์˜์กด์„ฑ์„ ์—ญ์ „์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

A(์ƒ์œ„ ๋ชจ๋“ˆ), B(ํ•˜์œ„ ๋ชจ๋“ˆ) ๊ด€๊ณ„์ผ ๋•Œ,

  • A์™€ B ์‚ฌ์ด์— polymorphic interface๋ฅผ ์‚ฝ์ž…

  • A๋Š” uses interface

  • B๋Š” implements the interface

์ด๋ ‡๊ฒŒ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ๋†“๋Š”๋‹ค๋ฉด, A๋Š” B์˜ ๋ณ€๊ฒฝ์— ์˜ํ–ฅ์ด ์—†์œผ๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค์— ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ๋˜์–ด ์˜์กด์„ฑ ๊ด€๋ฆฌ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

Plugins

์‹œ์Šคํ…œ์ด ์กด์žฌํ•  ๋–„ ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„๋“ค์„ ํ”Œ๋Ÿฌ๊ทธ์ธ(plugin)์ด๋ผ๊ณ  ํ•œ๋‹ค. ์‹œ์Šคํ…œ์ด๋ผ๋Š” ํ˜ธ์ถœ์ž๊ฐ€ ์–ด๋–ค ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ˜ธ์ถœ๋ ์ง€๋Š” ๋ชจ๋ฅด๋ฉฐ, ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์ด ๊ฐˆ์•„๋ผ์›Œ์งˆ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

  • Boundary๋ฅผ Plugin Interface๋กœ ๋‹ค๋ฃฌ๋‹ค.

  • ์˜์กด์„ฑ ์—ญ์ „์ด ์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ฒฝ๊ณ„๋ฅผ ๋งŒ๋“œ๋Š” ์ˆ˜๋‹จ

ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜

์‹œ์Šคํ…œ์„ Main Partition/App Partition์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฒฝ๊ณ„(Boundary)๋ฅผ ๋‘๋Š” ๊ฒƒ.

  • App Partition

  • Main Partition


  • ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ํ•ต์‹ฌ์€ ์ƒ์œ„ ๋ ˆ๋ฒจ์˜ ์ •์ฑ…์„ ํ•˜์œ„ ๋ ˆ๋ฒจ์˜ ์ƒ์„ธ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ

  • ์˜์กด์„ฑ ์—ญ์ „(DIP)/ IoC๋ฅผ ํ†ตํ•ด ๋ณ€ํ™”์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์ž.

  • ์˜์กด์„ฑ ๊ด€๋ฆฌ์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ์ฒด์ง€ํ–ฅ์˜ ํ•ต์‹ฌ

Last updated

Was this helpful?