Constructor Injection ๋์ ์ ํตํ ํ ์คํธ ์คํ ์๊ฐ 45๋ถ์์ 2๋ถ์ผ๋ก ๋จ์ถ
The Dependency Injection Quest: How I Turned Spaghetti Code Into a Lightsaber ๐
AI ์์ฝ
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 ๊ฐ์ฒด๋ฅผ ํ์ฉํด ์ธ๋ถ ์ธํ๋ผ ์์ด ๋ ๋ฆฝ์ ์ธ ๋จ์ ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ถ
ํ๊ทธ