Development
์คํ๋ง ์ค๋ช ํ - Dependency Inversion Principle
11/16/2024

Dependency Inversion Principle
๊ฐ์ฒด์งํฅ ์ค๊ณ์์น์ธ SOLID๋ ๊ฐ๋ฐ์์๊ฒ ์ข์ ์ํํธ์จ์ด ์ค๊ณ์ ๋ฐฉํฅ์ฑ์ ์ ๊ณตํฉ๋๋ค. ์์กด์ฑ ์ญ์ ์์น์ SOLID ์์น ์ค ํ๋๋ก, ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ์์กดํ์ง ์๊ณ ์ถ์ํ๋ ์ธํฐํ์ด์ค์ ์์กดํ๋๋ก ์ค๊ณํ์ฌ ํ๋ก๊ทธ๋จ์ ๊ต์ฒด๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
Top-down Approach
๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ฐ์น ์ค ํ๋๋ ํฐ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ์์ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐํ๋ ๊ฒ ์ ๋๋ค. ๋๋์ด์ง ์์ ๋ฌธ์ ๋ ๋ค์๊ธ ์ฌ๋ฌ ๋ ์์ ๋ฌธ์ ๋ก ๋๋์ด์ง ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ๋๋์ด์ง ์์ ๋ฌธ์ ๋ ํฐ ๋ฌธ์ ๋ฅผ ํ ๋ฒ์ ํด๊ฒฐํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๋จํ ๋ฟ ๋๋ฌ, ์ ๋์ํจ์ด ์ฆ๋ช ๋ ์ฑ ์ฌ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ๋ถํ ํ์ฌ ์ํํธ์จ์ด๋ฅผ ์ค๊ณํ ๋, ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ชจ๋์ ์ฃผ๋ก ํ๋ก๊ทธ๋จ์ ์ฃผ์ํ ์ ์ฑ ๊ฒฐ์ ์ด๋ ๋น์ฆ๋์ค ๋ชจ๋ธ์ ๋ด๋นํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด์ฑ์ ํ์ฑํฉ๋๋ค. ์ด๋ฌํ ๋ชจ๋์ ๊ณ ์์ค์ ๋ชจ๋์ด๋ผ๊ณ ์ด์ผ๊ธฐํฉ๋๋ค. ํ ํธ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ชจ๋์ ๊ตฌ์ฒด์ ์ธ ๋์๊ณผ ์ธ๋ถ์ ์ธ ๊ธฐ๋ฅ๋ง์ ๋ด๋นํ๊ฒ ๋ ๊ฒ์ด๋ฉฐ, ์ด๋ค์ ์ ์์ค์ ๋ชจ๋์ด๋ผ๊ณ ํฉ๋๋ค.

์ ๋ค์ด์ด๊ทธ๋จ์ ์์์ ์ค๋ช ํ ๋ถํ ์ ๋ณต ๊ธฐ๋ฒ์ ์ฌ์ฉํ ์ํํธ์จ์ด ํ๋ก๊ทธ๋จ์ ๊ฐ๋ตํ ๊ตฌ์กฐ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ํํธ์จ์ด๋ ๊ฑฐ๋ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ชจ๋์ ํธ์ถํจ์ผ๋ก์จ ๋์ํฉ๋๋ค. ๋ค์ด์ด๊ทธ๋จ์์ ๋ณผ ์ ์๋ ๊ฒ์ ๊ณ ์์ค์ ๋ชจ๋์ด ์ ์์ค์ ๋ชจ๋์ ํธ์ถํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๊ธ์์ ์์๋ดค๋ค์ถ์ด, ํธ์ถํ๋ค๋ ๊ฒ์ ๊ณง ์์กด๊ด๊ณ๋ฅผ ๋ง๋ค์ด๋ ๋๋ค. ๋ชจ๋ ๊ณ ์์ค์ ๋ชจ๋์ ์ ์์ค์ ๋ชจ๋์ ์์กดํฉ๋๋ค.
์์กดํ๋ฉด ๊ณง ๋ณ๊ฒฝ์ ์ํฅ์ ๋ฐ์ต๋๋ค. f4๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ f1์ f2์ ๋ณ๊ฒฝ์ ์ด๋ํ๊ณ , ์ด๋ ๋ค์๊ธ Main์ ๋ณ๊ฒฝ์ ์ด๋ํฉ๋๋ค. ์ ์์ค์ ๋ชจ๋ ํ๋๋ฅผ ๋ณ๊ฒฝํ ๋ ํ๋ก๊ทธ๋จ ์ ์ฒด์ ์ํฅ์ด ํผ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ ๊ณ ์์ค์ ๋ชจ๋์ด ์ ์์ค์ ๊ตฌ์ฒด์ ์ธ ๋ชจ๋์ ์๊ณ ์์ผ๋ฉฐ ์ง์ ํธ์ถํจ์ผ๋ก ๋์ํ๋ ๊ฐํ ๊ฒฐํฉ ์ํ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค. DIP๋ ์ด๋ฌํ ์ํฉ์ ์ง์ ํ๋ฉฐ, ์ด๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค.
Depends on Abstraction
์์์ ๋ค๋ฃจ๋ ์์๋ฅผ ์๊ฒ ๋ง๋ค์ด ์ธ ๊ฐ์ ๋ชจ๋์ด ์์กด์ฑ์ ๊ฐ๋ ์ํฉ์ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. Policy ํด๋์ค๋ ๊ณ ์์ค์ ๋ชจ๋๋ก ๋น์ฆ๋์ค ๋ก์ง์ ์ ์ํ๋ฉฐ, Mechanism ํด๋์ค๋ ์ค๊ฐ ๊ณ์ธต์ผ๋ก ๊ตฌ์ฒด์ ์ธ ๋์์ ์ํํ๊ณ , Utility๋ ์ ์์ค์์ ๊ณตํต๊ธฐ๋ฅ ์ ๊ณตํ๋ ๋๊ตฌ๋ก์จ ์ฌ์ฉ๋ฉ๋๋ค. Policy๋ Mechanism์ ์ฌ์ฉํ๊ณ , Mechanism์ Utility๋ฅผ ์ฌ์ฉํฉ๋๋ค.

์ด ๊ตฌ์กฐ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ๊ณผ ์ผ์นํ๋ ์ง๊ด์ ์ธ ๊ตฌ์กฐ๋ก ์ ์ ํด ๋ณด์ด์ง๋ง, ์ํํธ์จ์ด ์ค๊ณ์์๋ ๋ฌธ์ ๊ฐ ๋ ๋งํ ๋ถ๋ถ์ด ์กด์ฌํฉ๋๋ค. ์์กด์ฑ์ ์ ์ดํ๊ธฐ ๋๋ฌธ์ Policy์ ๊ฐ์ ๊ณ ์์ค ๊ณ์ธต์ด ์ ์์ค์ ๊ณ์ธต์ ๋ณํ์ ๋ฏผ๊ฐํ๊ฒ ๋ฐ์ํ๋ ์ํฉ์ด ๋ฐ์ํฉ๋๋ค. Utility์ ๋ณ๊ฒฝ์ Mechanism์ ๋ณ๊ฒฝ์ ์ด๋ํ๊ณ , ์ด๋ ๋ค์๊ธ Policy์ ๋ณ๊ฒฝ์ ์ด๋ํฉ๋๋ค. ์ด๋ ๋ฐ๋์งํ์ง ์์ ์ํฉ์ ๋๋ค.
์์กด์ฑ์ ๋ณธ์ง์ ์ผ๋ก ์๋๋ฐฉ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค. ์๋๋ฐฉ์ ๋ชจ๋ฅธ๋ค๋ฉด, ์์กดํ ์๋ ์์ต๋๋ค. DIP๋ ๋ชจ๋์ด ์ถ์์ ์์กดํ๊ฒ ๋ง๋๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ ์ค์ ๋ชจ๋์ ๋ชจ๋ฅด๊ฒ ๋ง๋ฆ์ผ๋ก์จ ์์กด์ฑ์ ์ ๊ฑฐํฉ๋๋ค.

์ ๋ค์ด์ด๊ทธ๋จ์ DIP๊ฐ ์ ์ฉ๋ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ๋๋ค. ์ด์ ๊ณ ์์ค ํด๋์ค๋ ์ ์์ค ํด๋์ค๋ฅผ ์ง์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋ชจ๋ ์ ์์ค์ ํด๋์ค๋ค์ ๊ทธ๋ค์ด ๋งก์ ์ญํ ์ ํด๋นํ๋ ์ถ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ก ๊ฐ์ ๋๋ฉฐ, ๊ณ ์์ค ํด๋์ค๋ ํด๋น ์ธํฐํ์ด์ค๋ง์ ์์กดํฉ๋๋ค. ์ด๋ ๊ฒ ์ถ์์ ํตํด ์ฐ๊ฒฐ๋ ๊ฒฐํฉ ๊ด๊ณ๋ฅผ ์ฝํ ๊ฒฐํฉ์ด๋ผ๊ณ ํฉ๋๋ค.
์์ ๊ฐ์ ์ค๊ณ๋ฅผ ํตํด ์์กด์ฑ์ ์ ์ด๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. ์ด์ ๋ DetailedMechanism ์ด ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ, ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ๋ณ๊ฒฝ์ ์ด๋ํ์ง ์์ต๋๋ค. DetailedUtility์ ๋ณ๊ฒฝ๋ ๋ง์ฐฌ๊ฐ์ง ์ ๋๋ค. ๋ฌผ๋ก UtilityInterface๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ DetailedMechanism๊ณผ DetailedUtility์ ์ํฅ์ ์ฃผ๊ฒ ์ง๋ง, ์ธ์ ํ ํด๋์ค๋ค์๋ง ์ํฅ์ ์ฃผ๊ณ ๊ทธ ์ธ๋ถ์ ๋ค๋ฅธ ํด๋์ค๋ค์๋ ์ํฅ์ด ํผ์ ธ๋๊ฐ์ง ์์ต๋๋ค.
์์กด์ฑ ์ญ์
DIP๋ฅผ ์ ์ฉํ๊ธฐ ์ ๊ตฌ์กฐ์์ Policy๋ Mechanism์ ํธ์ถํ๊ณ , Mechanism์ Utility๋ฅผ ํธ์ถํ์ฌ ๋์ํฉ๋๋ค. ๊ณ ์์ค ๋ชจ๋์ด ์ ์์ค ๋ชจ๋์ ์ง์ ํธ์ถํ ๋, ์ ์ด์ ํ๋ฆ์ ์์กด์ฑ์ ๋ฐฉํฅ๊ณผ ๋์ผํฉ๋๋ค. Policy๋ Mechanism์ ์์กดํ๊ณ , Mechanism์ Utility์ ์์กดํฉ๋๋ค.
ํ ํธ DIP๋ฅผ ์ ์ฉํ ์ํคํ ์ฒ์์ ์ ์ด์ ํ๋ฆ์ ๊ธฐ์กด๊ณผ ๋์ผํ์ง๋ง, ์์กด์ฑ์ ๋ฐฉํฅ์ ์ ์ด์ ํ๋ฆ๊ณผ ๋ฐ๋๊ฐ ๋์์ต๋๋ค. ๋ ์ด์ Policy๊ฐ Mechanism์ ์์กดํ๋ ๊ฒ์ด ์๋๋ผ, Policy๊ฐ ๊ฐ๊ณ ์๋ MechanismInterface์ DetailedMechanism์ด ์์กดํฉ๋๋ค. ์ด๋ ๊ฒ ์์กด์ฑ์ ๋ฐฉํฅ์ด ๋ฐ๋๊ฐ ๋ ๊ฒ์ ์์กด์ฑ ์ญ์ (Dependency Inversion) ์ด๋ผ๊ณ ํฉ๋๋ค.
Pluggable Architecture

์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ฌ๋ฌ ๊ตฌ์ฒด ํด๋์ค๊ฐ ์กด์ฌํ๋ค๋ฉด

์๋ก ๋ค๋ฅธ ์ค๋ธ์ ํธ๋ผ๋ฆฌ ๋ฐ๊ฟ ๋ผ์์ง ์ ์๋ค.
DIP๊ฐ ์ ์ฉ๋์ด ์๋ ๊ตฌ์กฐ์์๋ ํ๋ก๊ทธ๋๋ฐ์ ์์ ๋ชจ๋์ด ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค๋ฅผ ํ์ ๋ชจ๋์ด ๊ตฌํํ๋ ํํ๋ก ์ด๋ฃจ์ด์ง๋๋ค. ์ด ๋ ํ์ ๋ชจ๋์ ์์ ๋ชจ๋์ ๋ํ ํ๋ฌ๊ทธ์ธ์ฒ๋ผ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ค์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ๋๊ณ ๋ฐฐํฌ๋ ์ ์์ผ๋ฉฐ, ๊ธฐ์กด ์์ค์ฝ๋์ ๋ณ๊ฒฝ ์์ด ๋ฐ๊ฟ๋ผ์ธ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
๋ง๋ฌด๋ฆฌ
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ๋ค๋ฉด ๊ฐ๋ฐ์๋ค์ ์ํํธ์จ์ด ์์คํ ์ ์์ค์ฝ๋ ์์กด์ฑ์ ๋ฐฉํฅ์ ๊ฒฐ์ ํ ์ ์๋ ๊ถํ์ ์ป์ ์ ์์ต๋๋ค. ์ด๋ ๊ณ ์์ค ์ ์ฑ ์ด ๋ ์ด์ ์ ์์ค ์ ์ฑ ์ ์์กดํ๊ฒ ๋ง๋ค์ง ์๊ณ , ๋ฐ๋๋ก ์ ์์ค ์ ์ฑ ์ด ๊ณ ์์ค ์ ์ฑ ์ด ์๊ตฌํ๋ ๋ฐ์ ๋ง์ถ์ด ๊ฐ๋ฐํ๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ด ๊ณผ์ ์์ ์์กด์ฑ ์ ์ด์ ์์ค์ ๊ฒฐ์ ํ ์ ์์ผ๋ฉฐ, ์์ ๋ชจ๋์ด ์๊ตฌํ๋ ์คํ๋ง ๋ง์ถ์ด ๊ตฌํํ๋ค๋ฉด ์ธ์ ๋ ๋ฐ๊ฟ๋ผ์ธ ์ ์๋ ์ ์ฐํจ์ ๊ฐ๊ฒ ๋ ์ ์์ต๋๋ค.
๋ค์ ๊ธ์์๋ DIP๋ฅผ ์คํํ๊ธฐ ์ํ ๋ฐฉ์ ์ค ํ๋์ธ Dependency Injection์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.