1. SRP: ๋จ์ผ ์ฑ ์ ์์น
SRP ๋จ์ผ ์ฑ ์ ์์น์ ๋จ ํ๋์ ์ผ๋ง ํด์ผ ํ๋ค๋ ์์น์ด ์๋๋ค.
=> SPR๋ ํ๋์ ๋ชจ๋์ ์ค์ง ํ๋์ ์กํฐ์ ๋ํด์๋ง ์ฑ ์์ ธ์ผ ํ๋ค.
SRP ์์น์ ์๋ฐํ๋ ์ฌ๋ก๋ก ์ดํด๋ณด์.
์งํ 1: ์ฐ๋ฐ์ ์ค๋ณต
๊ทธ๋ฆผ 7.1์ Employee ํด๋์ค๋ฅผ ๋ณด๋ฉด ์ธ๊ฐ์ ๋ฉ์๋๋ฅผ ๊ฐ๊ณ ์๋ค.
1. calculatePay() → CFO
2. reportHours() → COO
3. save() → CTO
์ด ํด๋์ค๋ SRP๋ฅผ ์๋ฐํ๋๋ฐ, ์ด๋ค ์ธ ๊ฐ์ง ๋ฉ์๋๊ฐ ์๋ก ๋งค์ฐ ๋ค๋ฅธ ์ธ ๋ช ์ ์กํฐ๋ฅผ ์ฑ ์์ง๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ์ค๊ณ์ ๋ฌธ์ ์ ์ ๋ฌด์์ผ๊น?
๋ง์ฝ calculatePay ํจ์์ reportHours ํจ์๊ฐ a() ๋ผ๋ ํจ์๋ฅผ ๊ณต์ ํ๊ณ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ด๋ CFOํ์์ a() ํจ์์ ๋ก์ง์ ๋ณํ์ํฌ ์ผ์ด ์๋ค๋ฉด? reportHours ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์๋ COO ํ์ ์ํฐ๋ฆฌ ์์น์์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์๋ณด๊ฒ ๋๋ค.
์งํ 2: ๋ณํฉ
์์ ๋๊ฐ์ Employee ํด๋์ค์์ ์๋ฅผ ๋ค์ด๋ณด์.
CFO์์ ๊ธฐํ์ด ๋ณ๊ฒฝ๋์ด CFO ํ์ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์์ ํ๊ธฐ ์์ํ๊ณ ๋์์ COO์์๋ ๊ธฐํ์ด ๋ณ๊ฒฝ๋์ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์์ ํ๊ธฐ ์์ํ๋ค๊ณ ๊ฐ์ ํ์. ์ด๋ค ๋ณ๊ฒฝ์ฌํญ์ ์๋ก ์ถฉ๋ํ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ณํฉ์ด ๋ฐ์ํ๋ค.
์ต๊ทผ ๋๊ตฌ๋ ๊ต์ฅํ ๋ฐ์ด๋์ง๋ง, ์ด๋ค ๋๊ตฌ๋ ๋ณํฉ์ด ๋ฐ์ํ๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํด๊ฒฐํ ์๋ ์๋ค. ๋ณํฉ ํ์ CTO๋ ์ํฅ์ ๋ฐ๊ฒ ๋๋ฆฌ๋ผ๊ณ ์ง์ํด๋ณผ ์ ์๋ค.
ํด๊ฒฐ์ฑ
ํด๊ฒฐ์ฑ ์ ๋ฐ์ดํฐ์ ๋ฉ์๋ค๋ฅด ๋ถ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค. ๊ทธ๋ฆผ 7.3๊ณผ ๊ฐ์ด ๋ฉ์๋๊ฐ ์๋ ๊ฐ๋จํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ธ EmployeeData ํด๋์ค๋ฅผ ๋ง๋ค์ด, ์ธ ๊ฐ์ ํด๋์ค๊ฐ ๊ณต์ ํ๋๋ก ํ๋ค. ์ด๋ ๊ฒ ๋ฐ๊พผ๋ค๋ฉด, ์ธ ํด๋์ค๋ ์๋ก์ ์กด์ฌ๋ฅผ ๋ชจ๋ฅด๊ฒ ๋ ๊ฒ์ด๋ค.
์ด๋, ๋จ์ ๋ ๋ฐ์ํ๋๋ฐ, ๊ฐ๋ฐ์๊ฐ ์ธ ๊ฐ์ง ํด๋์ค๋ฅผ ์ธ์คํด์คํ ํ๊ณ ์ถ์ ํด์ผํ๋ค๋๊ฒ ๋จ์ ์ด๋ค. ์ด๋ด๋, Facade ํจํด์ ์ด๋ค.
Facade?
ํผ์ฌ๋ ํจํด(Facade Pattern)์ ๊ตฌ์กฐ ํจํด(Structural Pattern)์ ํ ์ข ๋ฅ๋ก์จ, ๋ณต์กํ ์๋ธ ํด๋์ค๋ค์ ๊ณตํต์ ์ธ ๊ธฐ๋ฅ์ ์ ์ํ๋ ์์ ์์ค์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ํจํด์ด๋ค.
ํผ์ฌ๋ ๊ฐ์ฒด(Facade Object)๋ ์๋ธ ํด๋์ค์ ์ฝ๋์ ์์กดํ๋ ์ผ์ ๊ฐ์์์ผ ์ฃผ๊ณ , ๋ณต์กํ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋จํ ์ฌ์ฉ ํ ์ ์๊ฒ ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํด์ค๋ค.
2. OCP: ๊ฐ๋ฐฉ-ํ์ ์์น
๊ฐ๋ฐฉ-ํ์ ์์น์ ํ์ฅ์๋ ์ด๋ ค ์์ด์ผํ๊ณ , ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค.
์ฆ, ์ํํธ์จ์ด ๊ฐ์ฒด์ด ํ์๋ ํ์ฅํ ์ ์์ด์ผ ํ์ง๋ง, ์ด๋ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํด์๋ ์ ๋๋ค.
๋ง์ฝ ์๊ตฌ์ฌํญ์ ์ด์ง ํ์ฅํ๋ ๋ฐ ์ํํธ์จ์ด๋ฅผ ์์ฒญ๋๊ฒ ์์ ํด์ผํ๋ค๋ฉด, ๊ทธ ์ํํธ์จ์ด ์์คํ ์ ์ค๊ณํ ์ํคํ ํธ๋ ์์ฒญ๋ ์คํจ์ ๋ง๋ฅ๋จ๋ฆฐ ๊ฒ์ด๋ค.
์ฌ๋ก๋ก ์ดํด๋ณด์.
์ฌ๊ณ ์คํ
์ฌ๋ฌด์ ํ๋ฅผ ์น ํ์ด์ง๋ก ๋ณด์ฌ์ฃผ๋ ์์คํ ์ด ์๋ค๊ณ ์๊ฐํด๋ณด์.
์น ํ์ด์ง์ ํ์๋๋ ๋ฐ์ดํฐ๋ ์คํฌ๋กค ํ ์ ์์ผ๋ฉฐ,
์์๋ ๋นจ๊ฐ์์ผ๋ก ์ถ๋ ฅํ๋ค.
์ด์ ์ดํด๊ด๊ณ์๊ฐ ๋์ผํ ์ ๋ณด๋ฅผ ๋ณด๊ณ ์ ํํ๋ก ๋ณํํด์ ํ๋ฐฑ ํ๋ฆฐํฐ๋ก ์ถ๋ ฅํด ๋ฌ๋ผ๊ณ ์์ฒญํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ด ๋ณด๊ณ ์์๋
- ํ์ด์ง ๋ฒํธ
- ํ์ด์ง๋ง๋ค ์ ์ ํ ๋จธ๋ฆฌ๊ธ๊ณผ ๋ฐ๋ฅ๊ธ
- ํ์ ๊ฐ ์ด์๋ ๋ ์ด๋ธ
- ์์๋ ๊ดํธ๋ก ๊ฐ์ธ๊ธฐ
๊ฐ ํฌํจ๋์ด์ผ ํ๋ค.
์ด๋ OCP๋ฅผ ๋ฐ๋ฅธ๋ค๋ฉด ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ์๋ก์ด ์ฝ๋๋ฅผ ์์ฑํด์ผํ๋ค.
์ํํธ์จ์ด ์ํคํ ์ฒ๊ฐ ํ๋ฅญํ๋ค๋ฉด ๋ณ๊ฒฝ๋๋ ์ฝ๋์ ์์ด ๊ฐ๋ฅํ ํ ์ต์ํ๊ฐ ๋ ๊ฒ์ด๋ค.
A ์ปดํฌ๋ํธ์์ ๋ฐ์ํ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ B ์ปดํฌ๋ํธ๋ฅผ ๋ณดํธํ๋ ค๋ฉด ๋ฐ๋์ A ์ปดํฌ๋ํธ๊ฐB ์ปดํฌ๋ํธ์ ์์กดํด์ผ ํ๋ค.
๊ทธ๋ฆผ 8.3์ ๊ฒฝ์ฐ Presenter์์ ๋ฐ์ํ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ Controller๋ฅผ ๋ณดํธํ๊ณ ์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ View์์ ๋ฐ์ํ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ Presenter๋ฅผ ๋ณดํธํ๊ณ ์ ํ๋ค.
Interactor๋ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์์ ๋ฐ์ํ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ ๋ณดํธํ๊ณ ์ ํ๋ค.
interactor์ ์์น๋ OCP๋ฅผ ๊ฐ์ฅ ์ ์ค์ํ๋ ๊ณณ์ ์์นํ๋ค. Database, Controller, Presenter, View์์ ๋ฐ์ํ ์ด๋ค ๋ณ๊ฒฝ๋ Interactor์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
์ Interactor๊ฐ ํน๋ณํ ์์น๋ฅผ ์ฐจ์งํด์ผ ํ๋๊ฐ? ๊ทธ ์ด์ ๋ '์ ๋ฌด ๊ท์น' ์ ํฌํจํ๊ธฐ ๋๋ฌธ์ด๋ค.
Interactor๋ ๊ฐ์ฅ ๋์ ์์ค์ ๊ฐ๋ ์ด๋ฉฐ, ๋ฐ๋ผ์ ์ต๊ณ ์ ๋ณดํธ๋ฅผ ๋ฐ๋๋ค.
View๋ ๊ฐ์ฅ ๋ฎ์ ์์ค์ ๊ฐ๋ ์ค ํ๋์ด๋ฉฐ, ๋ฐ๋ผ์ ๊ฑฐ์ ๋ณดํธ๋ฅผ ๋ฐ์ง ๋ชปํ๋ค.
์ด๊ฒ์ด ๋ฐ๋ก ์ํคํ ์ฒ ์์ค์์ OCP๊ฐ ๋์ํ๋ ๋ฐฉ์์ด๋ค.
๋ฐฉํฅ์ฑ ์ ์ด
๊ทธ๋ฆผ 8.2์์ FinancialDataGatewat ์ธํฐํ์ด์ค๋ FinancialReportGenerator์ FinancialDataMapper ์ฌ์ด์ ์์นํ๋๋ฐ, ์ด๋ ์์กด์ฑ์ ์ญ์ ์ํค๊ธฐ ์ํด์๋ค.
FinancialDataGateway ์ธํฐํ์ด์ค๊ฐ ์์๋ค๋ฉด, ์์กด์ฑ์ด Interactor ์ปดํฌ๋ํธ์์ Database ์ปดํฌ๋ํธ๋ก ๋ฐ๋ก ํฅํ๊ฒ ๋๋ค. FinalcialReport Presenter ์ธํฐํ์ด์ค์ 2๊ฐ์ View ์ธํฐํ์ด์ค๋ ๊ฐ์ ๋ชฉ์ ์ ๊ฐ์ง๋ค.
์ ๋ณด ์๋
๊ทธ๋ฆผ 8.2์์ FinancialReportRequester ์ธํฐํ์ด์ค๋ ๋ฐฉํฅ์ฑ ์ ์ด์๋ ๋ค๋ฅธ ๋ชฉ์ ์ ๊ฐ์ง๋ค.
์ด ์ธํฐํ์ด์ค๋ FinancialReportController๊ฐ Interactor ๋ด๋ถ์ ๋ํด ๋๋ฌด ๋ง์ด ์์ง ๋ชปํ๋๋ก ๋ง๊ธฐ ์ํด์ ์กด์ฌํ๋ค. ๋ง์ฝ ์ด ์ธํฐํ์ด์ค๊ฐ ์์๋ค๋ฉด, Controller๋ FinancialEntities์ ๋ํด ์ถ์ด ์ข ์์ฑ์ ๊ฐ์ง๊ฒ ๋๋ค.
๋ค์ ๋งํด, Controller์์ ๋ฐ์ํ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ Interactor๋ฅผ ๋ณดํธํ๋ ์ผ์ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ง๋ง, ๋ฐ๋๋ก Interactor์์ ๋ฐ์ํ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ Controller๋ ๋ณดํธ๋๊ธฐ๋ฅผ ๋ฐ๋๋ค. ์ด๋ฅผ ์ํด Interactor ๋ด๋ถ๋ฅผ ์๋ํ๋ค.
๊ฒฐ๋ก
OCP์ ๋ชฉํ๋ ์์คํ ์ ํ์ฅํ๊ธฐ ์ฌ์ด ๋์์ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์์คํ ์ด ๋๋ฌด ๋ง์ ์ํฅ์ ๋ฐ์ง ์๋๋ก ํ๋ ๋ฐ ์๋ค.
์ด๋ฌํ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ ค๋ฉด ์์คํ ์ ์ปดํฌ๋ํธ ๋จ์๋ก ๋ถ๋ฆฌํ๊ณ , ์ ์์ค ์ปดํฌ๋ํธ์์ ๋ฐ์ํ ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ ๊ณ ์์ค ์ปดํฌ๋ํธ๋ฅผ ๋ณดํธํ ์ ์๋ ํํ์ ์์กด์ฑ ๊ณ์ธต๊ตฌ์กฐ๊ฐ ๋ง๋ค์ด์ง๋๋ก ํด์ผ ํ๋ค.
3. LSP: ๋ผ์ค์ฝํ ์นํ ์์น
1988๋ ๋ฐ๋ฐ๋ผ ๋ฆฌ์ค์ฝํ๋ ํ์ ํ์ ์ ์๋์ ๊ฐ์ด ์ ์ํ๋ค.
S ํ์ ์ ๊ฐ์ฒด(o1), ๊ฐ๊ฐ์ ๋ํญํ๋ T ํ์ ๊ฐ์ฒด(o2)๊ฐ ์๊ณ , T ํ์ ์ ์ด์ฉํด์ ์ ์ํ ๋ชจ๋ ํ๋ก๊ทธ๋จ P์์ o2์ ์๋ฆฌ์ o1์ ์นํํ๋๋ผ๋ P์ ํ์๊ฐ ๋ณํ์ง ์๋๋ค๋ฉด, S๋ T์ ํ์ ํ์ ์ด๋ค.
์์์ ์ฌ์ฉํ๋๋ก ๊ฐ์ด๋ํ๊ธฐ
์ License๋ผ๋ ํด๋์ค๋ calcFee()๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ฉฐ, Billing ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
License์๋ PersonalLicense์ BusinessLicense๋ผ๋ ๋ ๊ฐ์ง 'ํ์ ํ์ '์ด ์กด์ฌํ๋ค. ์ด๋ค ๋ ํ์ ํ์ ์ ์๋ก ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ ๋ผ์ด์ ์ค ๋น์ฉ์ ๊ณ์ฐํ๋ค.
์ ์ค๊ณ๋ LSP๋ฅผ ์ค์ํ๋ค. Billing ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์๊ฐ License ํ์ ํ์ ์ค ๋ฌด์์ ์ฌ์ฉํ๋์ง์ ์ ํ ์์กดํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ค ํ์ ํ์ ์ ๋ชจ๋ License ํ์ ์ ์นํํ ์ ์๋ค.
์์ ๋ณธ ๊ฒ์ฒ๋ผ LSP๋ ์์์ ์ฌ์ฉํ๋๋ก ๊ฐ์ด๋ํ๋ ๋ฐฉ๋ฒ ์ ๋๋ก ๊ฐ์ด๋๋์๋ค. ํ์ง๋ง ์๊ฐ์ด ์ง๋๋ฉด์ LSP๋ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์๋ ์ ์ฉ๋๋ ๋ ๊ด๋ฒ์ํ ์ํํธ์จ์ด ์ค๊ณ ์์น์ผ๋ก ๋ณ๋ชจํด ์๋ค.
๋ฆฌ์ค์ฝํ ์นํ ์์น์ ๊ฐ์ธ์ ์ผ๋ก ์ฑ ์ ๋ด๋ ์ดํด๊ฐ ์ ๋์ง ์์ ์ ํ๋ธ ๊ฐ์ ๋ด์ฉ์ ์ ๋ฆฌํด๋ดค๋ค.
์๋ฅผ ๋ค์ด Cat์ด๋ผ๋ ๋ถ๋ชจ ํด๋์ค๊ฐ ์๊ณ Sub type๋ค์ธ ๊ฒ์ ๊ณ ์์ด, ๊ธธ๊ณ ์์ด ํด๋์ค๊ฐ ์๋ค ์๊ฐํด๋ณด์.
์ ์ฌ์ง์์ ๋ณผ ์ ์๋ฏ์ด Cat() ์ผ๋ก ์์ฑํ๋๊ฑธ BlackCat() ์ฆ ํ์ ํ์ ์ผ๋ก ์์ฑํด๋ ํ๋ก๊ทธ๋จ์ด ๋์๊ฐ๋๋ฐ ์ง์ฅ์ ์ฃผ์ง ์๋๋ค.
ํ์ง๋ง Fish ๋ฅผ Cat์ ์๋ธ ํด๋์ค๋ก ์์ฑํ๋ค ์๊ฐํด๋ณด์. ๋ฌผ๊ณ ๊ธฐ๋ ๋งํ ์ ์๊ธฐ ๋๋ฌธ์ ๋น์ฐํ ์์ธ๋ฅผ ๋์ง ๊ฒ์ด๊ณ sepak() ํจ์๋ฅผ ํธ์ถํ ํ๋ก๊ทธ๋จ์ ์์ธ๊ฐ ํฐ์ง ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ์๊ฐํด๋ณผ ์ ์๋ ๊ฒ์ Cat ํด๋์ค๋ Fish ํด๋์ค๋ก ์นํํ ์ ์๊ณ , LSP ์์น์ ์ด๊ธด ๊ฒ์ด๋ค.
4. ISP: ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น์ ์ ๋ค์ด์ด๊ทธ๋จ์์ ์ ๋ํ๋ค.
๋ค์์ ์ฌ์ฉ์๊ฐ OPS ํด๋์ค์ ์คํผ๋ ์ด์ ์ ์ฌ์ฉํ๋ค.
- User1์ op1,
- User2๋ op2,
- User3๋ op3
๋ง์ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๊ทธ๋ฆฌ๊ณ OPS๊ฐ ์ ์ ํ์ ์ธ์ด๋ก ์์ฑ๋ ํด๋์ค๋ผ๊ณ ํด๋ณด์.
์ด ๊ฒฝ์ฐ User1์์๋ op2์ op3๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์์์๋ User1์ ์์ค ์ฝ๋๋ ์ด ๋ ๋ฉ์๋์ ์์กดํ๊ฒ ๋๋ค. ์ด๋ฌํ ์์กด์ฑ์ผ๋ก ์ธํด User1๊ณผ ๊ด๋ จ๋ ์ฝ๋๋ ๋ณ๊ฒฝ๋์ง ์์์ด๋ OPS ํด๋์ค์์ op2์ ์์ค ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋๋ฉด User1๋ ๋ค์ ์ปดํ์ผ ํ ์๋ก ๋ฐฐํฌํด์ผ ํ๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ ์๋์ฒ๋ผ ์คํผ๋ ์ด์ ์ ์ธํฐํ์ด์ค ๋จ์๋ก ๋ถ๋ฆฌํ์ฌ ํด๊ฒฐํ ์ ์๋ค.
User1์ ์์ค ์ฝ๋๋ U1Ops์ ์์กดํ์ง๋ง OPS์๋ ์ ํ ์์กดํ์ง ์๊ฒ ๋๋ค.
๋ฐ๋ผ์ OPS์์ ๋ฐ์ํ ๋ณ๊ฒฝ์ด User1๊ณผ๋ ์ ํ ๊ด๊ณ์๋ ๋ณ๊ฒฝ์ด๋ผ๋ฉด, User1์ ๋ค์ ์ปดํ์ผํ๊ณ ์๋ก ๋ฐฐํฌํ์ง ์์๋ ๋๋ค.
ISP์ ์ธ์ด
์์ ์ฌ๋ก๋ ์ธ์ด ํ์ ์ ์์กดํ๋ค. ์ ์ ํ์ ์ธ์ด๋ ์ฌ์ฉ์๊ฐ import, user ๋๋ include์ ๊ฐ์ ํ์ ์ ์ธ๋ฌธ์ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํ๋ค. ์ด์ฒ๋ผ ์์ค ์ฝ๋์ ํฌํจ๋ include ์ ์ธ๋ฌธ์ผ๋ก ์ธํด ์์ค ์ฝ๋ ์์กด์ฑ์ด ๋ฐ์ํ๊ณ , ์ด๋ก ์ธํด ์ฌ์ปดํ์ผ ๋๋ ์ฌ๋ฐฐํฌ๊ฐ ๊ฐ์ ๋๋ค.
๋ฃจ๋น๋ ํ์ด์ฌ๊ณผ ๊ฐ์ ๋์ ํ์ ์ธ์ด์์๋ ์์ค์ฝ๋์ ์ด๋ฌํ ์ ์ธ๋ฌธ์ด ์กด์ฌํ์ง ์๋๋ค.
๋์ ๋ฐํ์์ ์ถ๋ก ์ด ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ ์์ค์ฝ๋ ์์กด์ฑ์ด ์์ ์์ผ๋ฉฐ, ์ฌ์ปดํ์ผ๊ณผ ์ฌ๋ฐฐํฌ๊ฐ ํ์์๋ค.
๋์ ํ์ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ ํ์ ์ธ์ด๋ฅผ ์ฌ์ฉํ ๋๋ณด๋ค ์ ์ฐํ๋ฉฐ ๊ฒฐํฉ๋๊ฐ ๋ฎ์ ์์คํ ์ ๋ง๋ค ์ ์๋ ์ด์ ๋ ๋ฐ๋ก ์ด ๋๋ฌธ์ด๋ค.
์ด๋ฌํ ์ฌ์ค๋ก ์ธํด ISP๋ฅผ ์ํคํ ์ฒ๊ฐ ์๋๋ผ, ์ธ์ด์ ๊ด๋ จ๋ ๋ฌธ์ ๋ผ๊ณ ๊ฒฐ๋ก ๋ด๋ฆด ์ฌ์ง๊ฐ ์๋ค.
์ฆ, ISP๋ ์ธ์ด ์ข ๋ฅ์ ๋ฐ๋ผ ์ํฅ๋ฐ๋ ์ ๋๊ฐ ๋ค๋ฅด๋ค.
๊ทธ๋ผ JAVA๋ ์ด๋จ๊น??
์๋ฐ์ ๊ฒฝ์ฐ ์ ์ ํ์ ์ธ์ด์ง๋ง, op2 ๋ฉ์๋๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ด๋ฅผ ์ฌ์ฉํ๋ User2๋ง ์ฌ์ปดํ์ผํ๋ฉด ๋๋ค. ์ด๋ ์๋ฐ๊ฐ ๋น-final, ๋น private ์ธ์คํด์ค ๋ณ์์ ๋ํด์๋ ํธ์ถํ ์ ํํ ๋ฉ์๋๋ฅผ ๋ฐํ์์ ๊ฒฐ์ ํ๋ ๋ฆ์(late binding)์ ์ํํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ปดํ์ผํ์์๋ ํธํ๋๋ ์๊ทธ๋์ฒ์ ๋ฉ์๋๊ฐ ํ์ ๊ณ์ธต๊ตฌ์กฐ ์ด๋๊ฐ์ ์กด์ฌํ๋์ง๊น์ง๋ง ํ์ธํ๋ค.
๊ฒฐ๋ก
์ฌ๊ธฐ์์ ๋ฐฐ์ธ ์ ์๋ ๊ตํ์ ๋ถํ์ํ ์ง์ ์ค์ ๋ฌด์ธ๊ฐ์ ์์กดํ๋ฉด ์์์น๋ ๋ชปํ ๋ฌธ์ ์ ๋น ์ง๋ค๋ ์ฌ์ค์ด๋ค.
5. DIP: ์์กด์ฑ ์ญ์ ์์น
์์กด์ฑ ์ญ์ ์์น์์ ๋งํ๋ '์ ์ฐ์ฑ์ด ๊ทน๋ํ๋ ์์คํ '์ด๋ ์์ค์ฝ๋ ์์กด์ฑ์ด ์ถ์์ ์์กดํ๋ฉฐ ๊ตฌ์ฒด์๋ ์์กดํ์ง ์๋ ์์คํ ์ด๋ค.
์๋ฐ์ ๊ฐ์ ์ ์ ํ์ ์ธ์ด์์ ์ด ๋ง์ use, import, include ๊ตฌ๋ฌธ์ ์ค์ง ์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค ๊ฐ์ ์ถ์์ ์ธ ์ ์ธ๋ง์ ์ฐธ์กฐํด์ผ ํ๋ค๋ ๋ป์ด๋ค. ๊ตฌ์ฒด์ ์ธ ๋์์๋ ์ ๋๋ก ์์กดํด์๋ ์ ๋๋ค.
๋ฃจ๋น๋ ํ์ด์ฌ ๊ฐ์ ๋์ ํ์ ์ธ์ด์๋ ๋์ผํ ๊ท์น์ด ์ ์ฉ๋๋ค.
์์ค ์ฝ๋ ์์กด ๊ด๊ณ์์ ๊ตฌ์ฒด ๋ชจ๋์ ์ฐธ์กฐํด์๋ ์ ๋๋ค. ํ์ง๋ง ์ด๋ค ์ธ์ด์ ๊ฒฝ์ฐ ๊ตฌ์ฒด ๋ชจ๋์ด ๋ฌด์์ธ์ง๋ฅผ ์ ์ํ๊ธฐ๊ฐ ํ๋ค๋ค.
ํธ์ถํ ํจ์๊ฐ ๊ตฌํ๋ ๋ชจ๋์ด๋ผ๋ฉด ์ฐธ์กฐํ์ง ์๊ธฐ๊ฐ ํนํ ์ด๋ ต๋ค.
์ด ์์ด๋์ด๋ ํ์คํ ๋นํ์ค์ ์ด๋ค.
์ํํธ์จ์ด ์์คํ ์ด๋ผ๋ฉด ๊ตฌ์ฒด์ ์ธ ๋ง์ ์ฅ์น์ ์์กดํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด ์๋ฐ์ String์ ๊ตฌ์ฒด ํด๋์ค์ด๋ฉฐ, ์ด๋ฅผ ์ ์จ ์ถ์ ํด๋์ค๋ก ๋ง๋ค๋ ค๋ ๊ฒ์ ํ์ค์ฑ์ด ์๋ค.
java.lang.String ๊ตฌ์ฒด ํด๋์ค์ ๋ํ ์์ค ์ฝ๋ ์์กด์ฑ์ ๋ฒ์ด๋ ์๋ ์๊ณ , ๋ฒ์ด๋์๋ ์ ๋๋ค.
๋ฐ๋ฉด String ํด๋์ค๋ ๋งค์ฐ ์์ ์ ์ด๋ค. ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋๋ ์ผ์ ๊ฑฐ์ ์์ผ๋ฉฐ, ์๋๋ผ๋ ๋งค์ฐ ์๊ฒฉํ๊ฒ ํต์ ๋๋ค. ๋ฐ๋ผ์ ํ๋ก๊ทธ๋๋จธ์ ์ํคํ ํธ๋ String ํด๋์ค์์ ๋ณ๋์ค๋ฌ์ด ๋ณ๊ฒฝ์ด ์์ฃผ ๋ฐ์ํ๋ฆฌ๋ผ๊ณ ์ผ๋ คํ ํ์๊ฐ ์๋ค.
์ด๋ฌํ ์ด์ ๋ก DIP๋ฅผ ๋ ผํ ๋ ์ด์์ฒด์ ๋ ํ๋ซํผ ๊ฐ์ด ์์ ์ฑ์ด ๋ณด์ฅ๋ ํ๊ฒฝ์ ๋ํด์๋ ๋ฌด์ํ๋ ํธ์ด๋ค.
์ฐ๋ฆฌ๋ ์ด๋ค ํ๊ฒฝ์ ๋ํ ์์กด์ฑ์ ์ฉ๋ฉํ๋๋ฐ, ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ฉด ์์กดํ ์ ์๋ค๋ ์ฌ์ค์ ์ด๋ฏธ ์๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์์กดํ์ง ์๋๋ก ํผํ๊ณ ์ ํ๋ ๊ฒ์ ๋ฐ๋ก ๋ณ๋์ฑ์ด ํฐ ๊ตฌ์ฒด์ ์ธ ์์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๊ตฌ์ฒด์ ์ธ ์์๋ ์ฐ๋ฆฌ๊ฐ ์ด์ฌํ ๊ฐ๋ฐํ๋ ์ค์ด๋ผ ์์ฃผ ๋ณ๊ฒฝ๋ ์ ๋ฐ์ ์๋ ๋ชจ๋๋ค์ด๋ค.
์์ ๋ ์ถ์ํ
์ถ์ ์ธํฐํ์ด์ค์ ๋ณ๊ฒฝ์ด ์๊ธฐ๋ฉด ์ด๋ฅผ ๊ตฌ์ฒดํํ ๊ตฌํ์ฒด๋ค๋ ๋ฐ๋ผ์ ์์ ํด์ผ ํ๋ค.
๋ฐ๋๋ก ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ฒด์ ๋ณ๊ฒฝ์ด ์๊ธฐ๋๋ผ๋ ๊ทธ ๊ตฌํ์ฒด๊ฐ ๊ตฌํํ๋ ์ธํฐํ์ด์ค๋ ํญ์, ์ข ๋ ์ ํํ ๋งํ๋ฉด ๋๋ค์์ ๊ฒฝ์ฐ ๋ณ๊ฒฝ๋ ํ์๊ฐ ์๋ค.
๋ฐ๋ผ์ ์ธํฐํ์ด์ค๋ ๊ตฌํ์ฒด๋ณด๋ค ๋ณ๋์ฑ์ด ๋ฎ๋ค.
์์ ๋ ์ํํธ์จ์ด ์ํคํ ์ฒ๋?
๋ณ๋์ฑ์ด ํฐ ๊ตฌํ์ฒด์ ์์กดํ๋ ์ผ์ ์ง์ํ๊ณ , ์์ ๋ ์ถ์ ์ธํฐํ์ด์ค๋ฅผ ์ ํธํ๋ ์ํคํ ์ฒ๋ผ๋ ๋ป
- ๋ณ๋์ฑ์ด ํฐ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ฐธ์กฐํ์ง ๋ง๋ผ.
- ๋์ ์ถ์ ์ธํฐํ์ด์ค๋ฅผ ์ฐธ์กฐํ๋ผ. ์ด ๊ท์น์ ์ธ์ด๊ฐ ์ ์ ํ์
์ด๋ ๋์ ํ์
์ด๋ ๊ด๊ณ์์ด ๋ชจ๋ ์ ์ฉ๋๋ค.
- ์ด ๊ท์น์ ๊ฐ์ฒด ์์ฑ ๋ฐฉ์์ ๊ฐํ๊ฒ ์ ์ฝํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์ถ์ ํฉํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํ๋ค.
- ๋์ ์ถ์ ์ธํฐํ์ด์ค๋ฅผ ์ฐธ์กฐํ๋ผ. ์ด ๊ท์น์ ์ธ์ด๊ฐ ์ ์ ํ์
์ด๋ ๋์ ํ์
์ด๋ ๊ด๊ณ์์ด ๋ชจ๋ ์ ์ฉ๋๋ค.
- ๋ณ๋์ฑ์ด ํฐ ๊ตฌ์ฒด ํด๋์ค๋ก๋ถํฐ ํ์ํ์ง ๋ง๋ผ.
- ์ ์ ํ์ ์ธ์ด์์ ์์์ ์์ค ์ฝ๋์ ์กด์ฌํ๋ ๋ชจ๋ ๊ด๊ณ ์ค์์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋์์ ๋ปฃ๋ปฃํด์ ๋ณ๊ฒฝํ๊ธฐ ์ด๋ ต๋ค.
- ๋์ ํ์ ์ธ์ด์์๋ ๋ฌธ์ ๊ฐ ๋ ๋์ง๋ง, ์์กด์ฑ์ ๊ฐ์ง๋ค๋ ์ฌ์ค์๋ ๋ณํจ์ด ์๋ค.
- ๋ฐ๋ผ์ ์์์ ์์ฃผ ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํ๋ค.
- ๊ตฌ์ฒด ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ์ง ๋ง๋ผ.
- ๋์ฒด๋ก ๊ตฌ์ฒด ํจ์๋ ์์ค ์ฝ๋ ์์กด์ฑ์ ํ์๋ก ํ๋ค. ๋ฐ๋ผ์ ๊ตฌ์ฒด ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ๋ฉด ์ด๋ฌํ ์์กด์ฑ์ ์ ๊ฑฐ ํ ์ ์๊ฒ ๋๋ฉฐ, ์ค์ ๋ก๋ ๊ทธ ์์กด์ฑ์ ์์ํ๊ฒ ๋๋ค.
- ์ด๋ฌํ ์์กด์ฑ์ ์ ๊ฑฐํ๋ ค๋ฉด, ์ฐจ๋ผ๋ฆฌ ์ถ์ ํจ์๋ก ์ ์ธํ๊ณ ๊ตฌํ์ฒด๋ค์์ ๊ฐ์์ ์ฉ๋์ ๋ง๊ฒ ๊ตฌํํด์ผ ํ๋ค.
- ๊ตฌ์ฒด์ ์ด๋ฉฐ ๋ณ๋์ฑ์ด ํฌ๋ค๋ฉด ์ ๋๋ก ๊ทธ ์ด๋ฆ์ ์ธ๊ธํ์ง ๋ง๋ผ
- ์ด ์ค์ฒ๋ฒ์ DIP ์์น์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํ์ด์ด ๊ฒ์ด๋ค.
์กฐ๊ธ ๋ ์ฝ๊ฒ ์์ ๋ฅผ ๋ค์ด ์ค๋ช ํ๋ฉด
์ ๋ ์ฝ๋์ ์ฐจ์ด๊ฐ ์๋ค.
์ฒซ๋ฒ์งธ ์ฝ๋์๋ Zoo ํด๋์ค(High Level)์์ ๊ณ ์์ด, ๊ฐ์์ง ๊ฐ์ Low Level์ ์์กดํ๊ณ ์๋ค.
๋ฐ๋ฉด ์๋ ์ฝ๋์์ Animal(abstract) ํด๋์ค๋ฅผ ๊ฐ๊ณ ์๊ณ Zoo ํด๋์ค๋ ๊ณ ์์ด, ๊ฐ์์ง ๊ฐ์ Low Level ํด๋์ค์ ์ ํ ์์กดํ๊ณ ์์ง ์๋ค.
๋๋ฒ์งธ ์ฝ๋๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค.
Cat, Dog ํด๋์ค๊ฐ Animal์ ์์กดํ๋ฉด์ ํ์ดํ ๋ฐฉํฅ์ด ์ญ์ ๋๋ค. ์ด๋๋ฌธ์ dependency inversion์ด๋ผ ๋ถ๋ฅธ๋ค.
Reference