DI, (Dependency Injection)

DI (Dependency Injection, ์˜์กด์„ฑ ์ฃผ์ž…)

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋””์ž์ธ ํŒจํ„ด

๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ์™ธ๋ถ€์—์„œ ์ฃผ์ž… ๋ฐ›๋Š” ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ

์˜์กด์„ฑ ์ฃผ์ž…์ด๋ž€ ์™ธ๋ถ€์—์„œ ์˜์กด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธ

์˜์กด์„ฑ์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž… ๋ฐ›์•„ ์˜์กด์„ฑ์„ ์—†์• ๊ณ  ๊ฐ์ฒด๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค.

์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ์„ธ๊ฐ€์ง€ ์œ ํ˜•

  • Constructor Injection โ†’ ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ ์ฃผ์ž…

  • Method(Setter) Injection -> ๊ฐ์ฒด(ํด๋ž˜์Šค) ์ƒ์„ฑ ํ›„ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…

  • Interface Injection -> ์ข…์†์„ฑ์„ ์ฃผ์ž…ํ•  ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ–๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ๋ฐ›์„ ํด๋ž˜์Šค(๊ฐ์ฒด๊ฐ€) ๊ตฌํ˜„ํ•˜๋„๋ก ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹

DI ์žฅ์ 

  • ์˜์กด ๊ฐ์ฒด๋ฅผ ๊ฐˆ์•„ ๋ผ์šธ ์ˆ˜ ์žˆ์–ด ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ™•์žฅ์„ฑ ๋†’์•„์ง„๋‹ค.

  • ์™ธ๋ถ€์˜ ์˜์กด ๊ฐ์ฒด๋ฅผ Mock ์œผ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ด ์‰ฌ์›Œ์ง„๋‹ค.

  • ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์˜์กดํ•˜์ง€ ์•Š์•„์„œ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ์ด ๋˜์–ด๋„ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์˜ํ–ฅ์„ ๋œ ์ฃผ๋ฏ€๋กœ ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ ์—ฐํ•œ ์ฝ”๋“œ๋ž€?

  • ๋ณ€๊ฒฝ์ด๋‚˜ ํ™•์žฅ์— ๋Œ€ํ•ด์„œ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

  • ์œ ์ง€๋ณด์ˆ˜์„ฑ ๐Ÿ‘, ํ™•์žฅ์„ฑ ๐Ÿ‘

  • ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด ์ฝ”๋“œ ๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์•ผ ํ•œ๋‹ค.

DI Container

DI๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด ์ƒ์„ฑ, ์˜์กด์„ฑ ์ฃผ์ž… ๋“ฑ์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์™ธ๋ถ€ ์—ญํ• 

DI Container๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ Context, ๋˜๋Š” Container๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ DI Container๋Š” Spring Framework

IoC (Inversion of Control, ์ œ์–ด์˜ ์—ญ์ „)

์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™ DI Pattern์€ IoC๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•

์ œ์–ด์˜ ์—ญ์ „์„ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํ๋ฆ„์˜ ์ œ์–ด๊ถŒ์„ ์™ธ๋ถ€(ํ”„๋ ˆ์ž„์›Œํฌ)์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ!

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ค๊ณ„์˜ ๊ธฐ๋ณธ ์›์น™SOLID ์˜ ๋‹ค์„ฏ ๋ฒˆ์งธ ์›์น™ Dependency Inversion "๋‚ฎ์€ ์ˆ˜์ค€์˜ ๊ตฌํ˜„์— ์˜์กดํ•˜์ง€ ๋ง๊ณ  ๋†’์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป"

Dependency Inversion vs Dependency Injection

Why do we call it Dependency โ€œInversionโ€?

Well, it appears that in traditional software development, the best practice was to build software in a layered architecture, which enabled the construction of increasingly complex systems.

In this architecture, higher-level components depended directly upon lower-level components in order to achieve a complex task.

Last updated