[Clean Architecture] ์„ค๊ณ„ ์›์น™ SOLID

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๋ฅผ ๋”ฐ๋ฅธ๋‹ค๋ฉด ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜๊ฐ€ ํ›Œ๋ฅญํ•˜๋‹ค๋ฉด ๋ณ€๊ฒฝ๋˜๋Š” ์ฝ”๋“œ์˜ ์–‘์ด ๊ฐ€๋Šฅํ•œ ํ•œ ์ตœ์†Œํ™”๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ฆผ 8.2

 

 

๊ทธ๋ฆผ 8.3

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

https://www.youtube.com/watch?v=_G50Joyys_E