ํ๋ก ํธ์๋์ SOLID ์์น ์ดํด๋ณด๊ธฐ
ํ๋ก ํธ์๋์ SOLID ์์น ์ดํด๋ณด๊ธฐ ๊ด๋ จ
๊ตญ๋ด IT ๊ธฐ์ ์ ํ๊ตญ์ ๋์ด ์ธ๊ณ๋ฅผ ๋ฌด๋๋ก ํ ์ ๋๋ก ๋ฐ์ด๋ ๊ธฐ์ ๊ณผ ์์ด๋์ด๋ฅผ ์๋ํฉ๋๋ค. ์ด๋ค์ ๊ธฐ์ ๋ธ๋ก๊ทธ๋ฅผ ํตํด ์ด๋ฌํ ์ ๋ณด๋ฅผ ๊ณต๊ฐํ๊ณ ์์ต๋๋ค. ์์ฆIT๋ ๊ฐ ๊ธฐ์ ์ ํน์ ์๊ณ ์ ์ตํ ์ฝํ ์ธ ๋ฅผ ์๊ฐํ๋ ์๋ฆฌ์ฆ๋ฅผ ์ค๋นํ์ต๋๋ค. ์ด๋ค์ ์ด๋ป๊ฒ ์ฌ๊ณ ํ๊ณ , ์ด๋ค ๋ฐฉ์์ผ๋ก ์ผํ๋ ๊ฑธ๊น์?
์ด๋ฒ ๊ธ์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ํตํด ๋์งํธ ํ๋ก๋ํธ์ ์๋น์ค ์ ๋ต์ ์ค๊ณํ๋ 'pxd'์์ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋ค์ฏ ๊ฐ์ง ์ค๊ณ ์์น์ธ 'SOLID'๋ฅผ ์๊ฐํฉ๋๋ค.
์ต๊ทผ ํ ์คํธ ์ฝ๋ ์์ฑ, ๋ฆฌํฉํ ๋ง, ๊น๋ํ ์ฝ๋ฉ ๋ฑ์ ๋ํด ์๊ธฐํ๊ณ ์๊ฐํด ๋ณด๋ฉด์, ์ด๋ฐ ์์ ๋ค ์ด์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น์ฐํ ๊น๊ณ ๊ฐ์ผ ํ ๊ทผ๋ณธ์ ์ธ ์์น์ด ์ด๋ค ๊ฒ ์์๊น ์ฐพ์๋ณด์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋ค์ฏ ๊ฐ์ง ์ค๊ณ ์์น์ธ SOLID ์์น์ ๊ดํด ์๊ฒ ๋์๋๋ฐ์. ์ด ์์น์ ํ๋ก ํธ์๋ ์์ ๊ณผ ์ฐ๊ดํด์ ์ ๋ฆฌํ๋ ๊ธ์ ์์ฑํด๋ณด๋ ค ํฉ๋๋ค.
SOLID ์์น์ด๋?
SOLID ์์น์ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋ค์ฏ ๊ฐ์ง ์ค๊ณ ์์น์ ๋ํ๋ด๋ ์ฝ์ด์ ๋๋ค. ๊ฐ ์์น์ ์ํํธ์จ์ด๋ฅผ ๋ ๊ฒฌ๊ณ ํ๊ณ , ์ ์ง ๋ณด์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด ์ฃผ๋๋ฐ์. ์ด๋ฌํ ์์น์ ์ํํธ์จ์ด์ ์ฌ์ฌ์ฉ์ฑ, ์ ์ฐ์ฑ, ํ์ฅ์ฑ์ ๋์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. SOLID๋ ๋ค์ด๋ณด์ง ๋ชปํ๋๋ผ๋ SRP-๋จ์ผ์ฑ ์์์น (SOLID ์ค S)์ ๋ํด์ ๋ฆฌ์กํธ ๊ณต์๋ฌธ์์๋ ์ธ๊ธ๋ ๋งํผ ๋ค์ํ ๊ณณ์์ ์ธ๊ธ๋๋ ์์น์ ๋๋ค.
- SRP: Single Responsibility Principle(๋จ์ผ ์ฑ ์ ์์น)
- OCP: Open/Closed Principle(๊ฐ๋ฐฉ-ํ์ ์์น)
- LSP: Liskov Substitution Principle(๋ฆฌ์ค์ฝํ ์นํ ์์น)
- ISP: Interface Segregation Principle(์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น)
- DIP: Dependency Inversion Principle(์์กด๊ด๊ณ ์ญ์ ์์น)
์ด๋ฌํ ์์น๋ค์ ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ์ฝ๋์ ์ ์ง ๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์ด๊ธฐ ์ํ ์ค์ํ ๊ฐ๋ ์ด๊ณ , ์์ง ๊ฐ๋ฐ์๋ก ์ผํด๋ณธ ๊ฒฝํ์ด ๋ถ์กฑํ๋ค๋ฉด ์ฑ ์ ํตํด์๋ง ์ดํดํ๊ธฐ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ฐ ์์น๋ณ๋ก ํ๋ก ํธ์๋์์ ์ฌ์ฉ๋๋ ์์๋ฅผ ์ ์ฉํ๋ฉฐ ์ค๋ช ํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Solid ์์น
1. ๋จ์ผ ์ฑ ์ ์์น(Single Responsibility Principle, SRP)
ํด๋์ค๋, ์ค์ง ํ๋์ ๋ํด์๋ง ์ฑ ์์ ธ์ผ ํ๋ค.
๋ง์ฝ ํด๋์ค๊ฐ ์ฌ๋ฌ ๊ฐ์ง ์์ ์ ์ฑ ์์ ธ์ผ ํ๋ค๋ฉด ์ด๋ ๋ฒ๊ทธ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ๋์ ๋๋ค. ๋น์ ์ด ๋ง์ ๊ธฐ๋ฅ ์ค ํ ๊ฐ์ง๋ฅผ ๋ณ๊ฒฝํ ๋, ๋น์ ์ด ๋ชจ๋ฅด๋ ์ฌ์ด์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ํฅ์ ์ค ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
SRP์ ๋ชฉ์ ์ ํ๋๋ค์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๊ณ , ์ด๋ก ์ธํด ๋น์ ์ด ์ด๋ค ๊ธฐ๋ฅ์ ์์ ํ๋๋ผ๋, ์ฐ๊ด ์๋ ๊ธฐ๋ฅ์๋ ์ํฅ์ด ๊ฐ์ง ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ์ด ์์น์ ์ฃ๋ถ๋ฆฌ ์ฝ๋ฉ์ ์ ์ฉํ๋ฉด '์ฑ ์ = ๋์'์ผ๋ก ์คํดํ๊ณ ๋จ์ผํ ๋์์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ชผ๊ฐ๋ ํ๋์ ํ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋๋ฌด ๋ง์ด ์ชผ๊ฐ์ง๋ฉด ์ ์ฒด ๋ก์ง์ ์ดํดํ๊ธฐ ์ด๋ ต๊ณ ๊ณต์๊ฐ ๋ง์์ง๋ฏ๋ก ๋จ์ผํ ๋์์ ๊ฐ๋๋ก ์ฝ๋ฉํ๋ ๊ฒ์ ์์ํ ํจ์ ํ์ ์ผ๋ก ๋์ด์ผ ํฉ๋๋ค. ์ฆ, SRP ์์น์ ์งํค๋ฉฐ ์ปดํฌ๋ํธ๋ฅผ ์ค๊ณํ๋ ๊ฒ์ ์๊ตฌ ์ฌํญ์ ์ ๋ฌํ๋ ์ฑ ๋ฌด ๋จ์ ๋ก ์ค๊ณํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
๋ฒก์๋์ ๋ฌ๋ฆฌ ํ๋ก ํธ์๋๋ ์ง์ ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์ ๋ง๋ฟ์์๋ ์์ญ์ด๋ผ ์ข ๋ ๋ง์ ์ฐ๊ด์ด ์๋๋ฐ์. ๊ฐ ์์ญ์ ์๊ตฌ์ฌํญ์ ๋ช ํํ ํ๊ณ ์์ญ์ ์ ๊ตฌ๋ถํ์ฌ ์์กด์ฑ ์๋ ๋ ๋ฆฝ์ ์ธ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด, ๊ฐ ์ฑ ๋ฌด์ ๋ณ๊ฒฝ์ฌํญ์๋ ์ ์ฐํ๊ฒ ๋์ฒํ ์ ์๋๋ก ์ค๊ณํ๊ณ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ก๊ทธ์ธ ํผ ์ปดํฌ๋ํธ๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ์ปดํฌ๋ํธ๋ ์ฌ์ฉ์์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ฅผ ๋ ์ธ์ฆ ์์ฒญ์ ๋ณด๋ด๋ ์ญํ ์ ํฉ๋๋ค. ์ด ์ปดํฌ๋ํธ๋ ๋ก๊ทธ์ธ๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ๋ง์ ๋ด๋นํ๋ฉฐ, ๋ค๋ฅธ ๊ธฐ๋ฅ๊ณผ๋ ๋ถ๋ฆฌ๋ฉ๋๋ค.
๋ง์ฝ ์ด ๋ก๊ทธ์ธ ํผ ์ปดํฌ๋ํธ์ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ผ๋ก ์๋ฅผ ๋ค์ด, "๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ" ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด, ๋จ์ผ ์ฑ ์ ์์น์ ๋ฐ๋ผ ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ์ฌ ํด๋น ๊ธฐ๋ฅ์ ๋ด๋นํ๋๋ก ํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ก๊ทธ์ธ ํผ ์ปดํฌ๋ํธ๋ ์ฌ์ ํ ๋ก๊ทธ์ธ๊ณผ ๊ด๋ จ๋ ์ฑ ์๋ง์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์๋ก์ด ์ปดํฌ๋ํธ๋ "๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ" ๊ธฐ๋ฅ์ ๋ํ ์ฑ ์์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
์ด์ ๊ฐ์ด ๋จ์ผ ์ฑ ์ ์์น์ ์ ์ฉํ๋ฉด, ๊ฐ ์ปดํฌ๋ํธ๋ ๋ช ํํ๊ณ ํ์ ๋ ์ญํ ์ ์ํํ๊ฒ ๋์ด ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ํฅ์๋ฉ๋๋ค. ๋ํ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฏ๋ก ์ฝ๋์ ์์ ์ฑ๊ณผ ํ์ฅ์ฑ๋ ๋์์ง๋๋ค.
2. ๊ฐ๋ฐฉ-ํ์ ์์น(Open-Closed Principle, OCP)
ํด๋์ค๋ ํ์ฅ์๋ ๊ฐ๋ฐฉ์ ์ด์ด์ผ ํ๊ณ , ๋ณ๊ฒฝ์๋ ํ์์ ์ด์ด์ผ ํ๋ค.
ํด๋์ค์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ํด๋น ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๋ชจ๋ ์์คํ ์ ์ํฅ์ ์ฃผ๊ฒ ๋ฉ๋๋ค. ํด๋์ค์ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋ถ์ฌํ๊ณ ์ถ๋ค๋ฉด, ๊ฐ์ฅ ์ด์์ ์ธ ์ ๊ทผ๋ฐฉ๋ฒ์ ๊ธฐ์กด ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋ ์๋ก์ด ํจ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค.
OCP์ ๋ชฉ์ ์ ํด๋์ค์ ์กด์ฌํ๋ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝ ์์ด ํด๋น ํด๋์ค์ ๊ธฐ๋ฅ์ ํ์ฅ์ํค๋ ๊ฒ์ ๋๋ค. ์ด๋ก ์ธํด ์ฌ์ฉ ์ค์ธ ํด๋์ค์ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ๋ฒ๊ทธ ๋ฐ์์ ํผํ ์ ์์ต๋๋ค.
์์๋ก ์ด๋ ํ ์๋น์ค ์ด์ ๋์ค ์ถ๊ฐ/๋ณ๊ฒฝ/์ญ์ ๋๋ ์๋น์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์ ๋, OCP๋ฅผ ์ ์ฉํ์ง ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด
sections.map((section) => {
if(section.type === "one"){
return section.items.map((item) => <Component1 item={item} />);
} else if(type === "two"){
return section.items.map((item) => <Component2 item={item} />);
}
}
์ด ์ฝ๋๋ ์น์ ์ด ์ถ๊ฐ๋ ๊ฒฝ์ฐ else-if๋ฅผ ์ถ๊ฐํ์ฌ ๊ตฌํํด์ผ ํ๋๋ฐ ์ด ๊ตฌ์กฐ๋ ํ์ฅ์ ๋ซํ์๋ค๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ํ์ฅ์ ๊ฐ๋ฐฉ๋ ์ ์๊ฒ ๋ฐ๊พธ๋ฉด,
sections.map((section) => ;
<Section section={section}>
{section.items.map((item) =>
<Component section={section} item={item} />
}
</Section>
์ด์ ์น์ ์ ์ถ๊ฐ/์ญ์ ํ์ฌ๋ ์ด ์ฝ๋๋ ๋ณํ ์ผ์ด ์์ต๋๋ค. ์ด๋ฌํ ์์ผ๋ก ์ด๋ ํ ์๋น์ค์ ๋ํด ์ปดํฌ๋ํธ๋ฅผ ์ค๊ณํ ๋๋ ์ต๋ํ ๋ฐ์ดํฐ์ ๋ณํ๋ ์๋น์ค ๋ก์ง์ ๋ณ๊ฒฝ์๋ ์ ์ฐํ๊ฒ ๋์ฒํ๊ธฐ ํธํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
3. ๋ฆฌ์ค์ฝํ ์นํ ์์น(Liskov Substitution Principle, LSP)
๋ง์ฝ S๊ฐ T์ ์๋ธํ์ ์ด๋ผ๋ฉด, T๋ ์ด๋ ํ ๊ฒฝ๊ณ ๋ ๋ด์ง ์์ผ๋ฉด์, S๋ก ๋์ฒด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์์ ํด๋์ค๋ ์ธ์ ๋ ๋ถ๋ชจ ํด๋์ค๋ก ๋์ฒด๋ ์ ์์ด์ผ ํฉ๋๋ค. ์ฆ, ๋ถ๋ชจ ํด๋์ค์ ์ธ์คํด์ค ๋์ ์์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํด๋ ๊ธฐ๋ฅ์ ๋ฌธ์ ๊ฐ ์์ด์ผ ํฉ๋๋ค.
์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค๊ฐ ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ํ ์ ์์ด์ผ ํ๋๋ฐ(์์) ๊ทธ๋ฌ๋ฏ๋ก ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ฒ๋ผ ๋๊ฐ์ ์์ฒญ์ ๋ํด ๋๊ฐ์ ์๋ต์ ํ ์ ์์ด์ผ ํ๊ณ , ์๋ต์ ํ์ ๋ํ ๊ฐ์์ผ ํฉ๋๋ค.
๋ง์ฝ ์์ ํด๋์ค๊ฐ ์์ ์กฐ๊ฑด์ ์ถฉ์กฑํ์ง ์์ผ๋ฉด, ์์ ํด๋์ค๊ฐ ์์ ํ ๋ณ๊ฒฝ๋์ด LSP์ ์๋ฐฐ๋๋ค๋ ๊ฒ์ ๋ปํฉ๋๋ค.
LSP์ ๋ชฉ์ ์ ์ผ๊ด์ฑ์ ์ ์งํ์ฌ ๋ถ๋ชจ ํด๋์ค ๋๋ ์์ ํด๋์ค๋ฅผ ์ค๋ฅ ์์ด ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
๋ค์ํ ํํ์ ๋ฒํผ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ผ ํ ์ํฉ์ ๊ฐ์ ํ๋ฉด, ๊ธฐ๋ณธ ๋ฒํผ ์ปดํฌ๋ํธ(BaseButton
)๋ฅผ ๋จผ์ ๋ง๋ค๊ณ , ์ด๋ฅผ ์์๋ฐ์ ํน๋ณํ ๊ธฐ๋ฅ์ ๊ฐ์ง ๋ฒํผ ์ปดํฌ๋ํธ(SpecialButton
)๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
class BaseButton {
onClick() {
// ๊ธฐ๋ณธ ๋์
}
}
class SpecialButton extends BaseButton {
onClick() {
// ํน๋ณํ ๋์
super.onClick();
}
}
์ด ๊ฒฝ์ฐ์ LSP๋ SpecialButton
์ด BaseButton
์ ์ญํ ์ ์์ ํ ๋์ฒดํ ์ ์์ด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ์ฆ, BaseButton
์์ ์์ํ๋ ๋ชจ๋ ๋์์ด SpecialButton
์์๋ ๋์ผํ๊ฒ ์๋ํด์ผ ํฉ๋๋ค. ๋ง์ฝ SpecialButton
์ด BaseButton
์ ์ผ๋ถ ๋์์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ ๊ฑฐํ๋ค๋ฉด, ์ด๋ LSP๋ฅผ ์๋ฐํ๋ ๊ฒ์ด ๋ฉ๋๋ค.
๋ฐ๋ผ์ LSP๋ฅผ ๋ฐ๋ฅด๊ธฐ ์ํด์๋ ์์๋ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ๋ ๊ธฐ์กด์ ๋์์ ๋ณด์กดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ด๋ค ๋ฒํผ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์ผ๊ด๋ ๋์์ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
4. ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น(Interface Segregation Principle, ISP)
ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋์ ๋ํด ์์กด์ ์ด์ง ์์์ผ ํฉ๋๋ค.
ํด๋์ค๋ ์์ ์ด ์ฌ์ฉํ์ง ์๋ ์ธํฐํ์ด์ค๋ ๊ตฌํํ์ง ๋ง์์ผ ํ๋ค๋ ์์น์ ๋๋ค.
ISP์ ๋ชฉ์ ์ ์ก์ ์งํฉ์ ๋ ์์ ์ก์ ์งํฉ์ผ๋ก ์ชผ๊ฐ์, ํด๋์ค๊ฐ ํ์ํ ์ก์ ๋ค๋ง ์คํํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
React์์๋ ์ปดํฌ๋ํธ ๊ฐ์ ์ํธ์์ฉ์ ์ํด props
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฐ ์ปดํฌ๋ํธ๋ ์์ ์ด ํ์๋ก ํ๋ props
๋ง์ ๋ฐ์์ผ ํ๋ฉฐ, ๋ถํ์ํ props
๋ฅผ ๋ฐ์์๋ ์๋ฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด,
// ISP๋ฅผ ์๋ฐํ๋ ์
function PhotoTextComponent({photo, text}) {
return (
<div>
<img src={photo} alt="" />
<p>{text}
</div>
);
}
function TextComponent({photo, text}) {
return (
<p>{text}
);
}
// ISP๋ฅผ ์ค์ํ๋ ์
function PhotoTextComponent({photo, text}) {
return (
<div>
<img src={photo} alt="" />
<p>{text}
</div>
);
}
function TextComponent({text}) {
return (
<p>{text}
);
}
์ด๋ ๊ฒ ํ๋ฉด ์ปดํฌ๋ํธ ๊ฐ์ ์ข ์์ฑ์ ์ค์ด๊ณ , ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์งํ๊ณ ํ์ฅํ๋๋ฐ ๋์์ด ๋ฉ๋๋ค.
5. ์์กด ์ญ์ ์์น(Dependency Inversion Principle , DIP)
์์ ๋ชจ๋์ด ํ์ ๋ชจ๋์ ์ง์ ์์กดํ๋ ๊ฒ์ด ์๋๋ผ, ๋ ๋ค ์ถ์ํ์ ์์กดํ๋๋ก ์ค๊ณํด์ผ ํ๋ค๋ ์์น์ ๋๋ค. ์ด ์์น์ ํตํด ๋ชจ๋ ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ์ค์ด๊ณ ์ ์ฐ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
- ์์ ๋ชจ๋ (๋๋ ํด๋์ค): ๋๊ตฌ์ ํจ๊ป ๋์ํ๋ ํด๋์ค.
- ํ์ ๋ชจ๋ (๋๋ ํด๋์ค): ์ํํ๊ธฐ ์ํ ๋๊ตฌ.
- ์ถ์: ๋ ํด๋์ค๋ฅผ ์ฐ๊ฒฐํ๋ ์ธํฐํ์ด์ค
- ๊ตฌ์ฒด: ๋๊ตฌ๊ฐ ๋์ํ๋ ๋ฐฉ๋ฒ
DIP๋ ์ก์ ์ ์ํํ ๋ ํด๋์ค๊ฐ ๋๊ตฌ์ ์ตํฉ๋๋ฉด ์ ๋๋ค๊ณ ๋งํฉ๋๋ค. ๋ณด๋ค ์ข์ ๋ฐฉ๋ฒ์ ์ธํฐํ์ด์ค์ ์ตํฉํ์ฌ ํด๋์ค์ ๋๊ตฌ๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋๋ค. ๋ ํด๋์ค์ ์ธํฐํ์ด์ค๋ ์ด๋ป๊ฒ ๋๊ตฌ๊ฐ ๋์ํ๋์ง ์ ์ ์์ด์ผ ํฉ๋๋ค. ํ์ง๋ง, ๋๊ตฌ๋ ์ธํฐํ์ด์ค ์ฌ์์ ์ถฉ์กฑํด์ผ ํฉ๋๋ค.
DIP์ ๋ชฉ์ ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์์ ํด๋์ค๊ฐ ํ์ ํด๋์ค์ ๋ํด ์์กด์ฑ์ ๊ฐ์ง๋ ๊ฒ์ ์ค์ด๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด, API ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ ์ํฉ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ก์ง์ ์ง์ ์ปดํฌ๋ํธ ์์ ์์ฑํ๋ฉด, ์ปดํฌ๋ํธ๋ ํน์ API ์๋ฒ์ ์ง์ ์ ์ผ๋ก ์์กดํ๊ฒ ๋ฉ๋๋ค. API ์๋ฒ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ปดํฌ๋ํธ๋ ํจ๊ป ๋ณ๊ฒฝํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์๊ฐ ์ด๋ ต์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด DIP๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ก์ง์ ๋ณ๋์ ์๋น์ค๋ก ๋ถ๋ฆฌํ๊ณ , ์ด ์๋น์ค๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ก ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ปดํฌ๋ํธ๋ ์๋น์ค์ ์์กดํ๊ฒ ๋๋ฉฐ, API ์๋ฒ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์๋น์ค๋ง ์์ ํ๋ฉด ๋ฉ๋๋ค.
DIP๋ฅผ ํตํด ๊ฒฐํฉ๋๋ฅผ ์ค์ด๊ณ ์ฝ๋์ ์ ์ฐ์ฑ์ ๋์ด๋ ์์๋ฅผ ๋ณด๋ฉด,
// API ์๋น์ค
class APIService {
getData() {
// API ํธ์ถ ๋ก์ง
}
}
// ์ปดํฌ๋ํธ
class MyComponent {
constructor(service) {
this.service = service;
}
render() {
const data = this.service.getData();
// ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๋ ๋๋ง ๋ก์ง
}
}
const service = new APIService();
const component = new MyComponent(service);
์ ์ฝ๋์์ MyComponent
๋ APIService
์ ์์กดํ์ง ์๊ณ , ๋์ service
์ ์์กดํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด APIService
๊ฐ ๋ณ๊ฒฝ๋์ด๋ MyComponent
๋ ๋ณ๊ฒฝํ์ง ์์๋ ๋ฉ๋๋ค.
โป ์ฐธ๊ณ : ISP, DIP ์ค์ ์ ๋ฌด ์ ์ฉ ์์
์ ์์ ์ค ISP์ DIP๋ฅผ ์ ์ฉํ๋ ์์๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฐ์ ํ๊ณ๊ฐ ์๋ค๊ณ ์๊ฐํ์ฌ ์ข ๋ ์ค๋ฌด ์ ์ฉ์ ๋์์ ์ค๋งํ ํ ๋ธ๋ก๊ทธ ๊ธ ์ ์ฉ ์์๋ฅผ ๋งํฌ๋ก ์ฒจ๋ถํฉ๋๋ค.
- ISP, DIP : Interface Segregation Principle, Dependency Inversion Principle<
๋งํฌ ์ค ์ด ๋ถ๋ถ์ ํ์ธํ๋ฉด ๋ฉ๋๋ค.
๋ง์น๋ฉฐ
SOLID ์์น์ ๋ํด ์์๋ณด๊ณ ์ฌ๋ฌ ์์๋ฅผ ์๊ฐํด ๋ณด์๋๋ฐ, ๋ด๊ฐ ๊ณผ์ฐ ์ด ์์น์ ๋ฐ๋ผ ์ฝ๋ฉ์ ์ํ๊ณ ์๋์ง, ์ง๊ธ๊น์ง ์์ ํ ์ฝ๋๋ค์ด ์์น๊ณผ ๋ค๋ฅด๊ฒ ๊ตฌํ๋์ง ์์๋์ง ๋ฐ์ฑํ๋ ๊ณ๊ธฐ๊ฐ ๋์์ต๋๋ค. ์์ฆ ์์ ํ๋ฉด์ 'ํด๋ฆฐ์ฝ๋ฉ'์ ์ค์์ฑ์ ๋์ฑ ๋๋ผ๊ณ ์๋ ๋งํผ ์ด๋ฌํ ์์น์ ๋๋๋ก ์ ์ง์ผ์ ํจ์จ์ ์ด๊ณ ๊นจ๋ํ ์ฝ๋ฉ์ ํ ์ ์๋๋ก ๋ ธ๋ ฅํด์ผ๊ฒ ์ต๋๋ค.