ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
The Dependency Injection Quest: How I Turned Spaghetti Code Into a Lightsaber ๐Ÿš€
Dev.toDev.to
Backend

Constructor Injection ๋„์ž…์„ ํ†ตํ•œ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ๊ฐ„ 45๋ถ„์—์„œ 2๋ถ„์œผ๋กœ ๋‹จ์ถ•

The Dependency Injection Quest: How I Turned Spaghetti Code Into a Lightsaber ๐Ÿš€

Timevolt2026๋…„ 6์›” 17์ผ6๋ถ„beginner

Context

ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์˜์กด์„ฑ์„ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” Tight Coupling ๊ตฌ์กฐ๋กœ ์ธํ•ด ํ…Œ์ŠคํŠธ ์‹œ ์‹ค์ œ ์™ธ๋ถ€ API์™€ DB ์—ฐ๊ฒฐ์ด ๊ฐ•์ œ๋˜๋Š” ์ œ์•ฝ ๋ฐœ์ƒ. ์ด๋กœ ์ธํ•ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณ€๊ฒฝ ์‹œ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜ ๋ณ‘๋ชฉ ์ง€์  ํ˜•์„ฑ.

Technical Solution

  • Concrete Class๊ฐ€ ์•„๋‹Œ Interface ๊ธฐ๋ฐ˜์˜ Abstraction์— ์˜์กดํ•˜๋Š” Dependency Inversion Principle ์ ์šฉ
  • ๋‚ด๋ถ€ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋กœ์ง์„ ์ œ๊ฑฐํ•˜๊ณ  ์™ธ๋ถ€์—์„œ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›๋Š” Constructor Injection ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์กฐ ๋ณ€๊ฒฝ
  • ์˜์กด์„ฑ ํ•„๋“œ๋ฅผ final๋กœ ์„ ์–ธํ•˜์—ฌ ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•˜๋Š” Immutable ๊ตฌ์กฐ ์„ค๊ณ„
  • Service Locator ํŒจํ„ด์˜ ์€๋‹‰๋œ ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ๋ช…์‹œ์  ์˜์กด์„ฑ ๊ณ„์•ฝ ์ •์˜
  • Composition Root์—์„œ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ๊ตฌํ˜„์ฒด๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์œ ์—ฐํ•œ ์„ค๊ณ„ ๋„์ž…

- ํด๋ž˜์Šค ๋‚ด๋ถ€์— 'new' ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•œ ํ˜‘๋ ฅ ๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ - ์˜์กด ๊ฐ์ฒด๋ฅผ Interface๋กœ ์ถ”์ƒํ™”ํ•˜๊ณ  ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›๋„๋ก ๋ฆฌํŒฉํ† ๋ง - ์˜์กด์„ฑ ์ฃผ์ž… ํ•„๋“œ์— final ์ œ์–ด์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ถˆ๋ณ€์„ฑ ํ™•๋ณด - Mock/Fake ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด ์™ธ๋ถ€ ์ธํ”„๋ผ ์—†์ด ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•

์›๋ฌธ ์ฝ๊ธฐ