JiwonDev

#1 ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

by JiwonDev

์บก์Šํ™”, ์ถ”์ƒํ™”, ์ƒ์†, ๋‹คํ˜•์„ฑ... ๋งŽ์ด ๋“ค์–ด๋ดค์ง€๋งŒ, ์ •์ž‘ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€์ง€ ์ž˜ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ํ•ด๋‹น ๊ธ€์—์„œ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ๊ฐœ๋…์ด ์™œ ์ƒ๊ฒผ๊ณ , ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ง€ํ–ฅํ•˜๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์ž.


# ๋‹คํ˜•์„ฑ์˜ ๋ณธ์งˆ

๋‹คํ˜•์„ฑ์˜ ๋ณธ์งˆ์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ ์‹œ์ ์—์„œ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์˜ ๊ตฌํ˜„ ๊ธฐ๋Šฅ์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹คํ˜•์„ฑ, ์—ญํ˜ˆ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•˜๋ผ.

1. ์‹ค์ œ ์„œ๋น„์Šค์—์„œ ํ˜ผ์ž ์žˆ๋Š” ๊ฐ์ฒด๋Š” ์—†๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ : ์š”์ฒญ , ์„œ๋ฒ„: ์‘๋‹ต
  • ์ˆ˜ ๋งŽ์€ ๊ฐ์ฒด ํด๋ผ์ด์–ธํŠธ์™€ ๊ฐ๊ฐ์˜ ๊ฐ์ฒด ์„œ๋ฒ„๋“ค์€ ํ˜‘๋ ฅ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค.

 

2. ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•ด์„œ ์„ค๊ณ„ํ•˜๋ฉด ๋งŽ์€ ์žฅ์ ์ด ์žˆ๋‹ค. => ๋‹คํ˜•์„ฑ

  • ํด๋ผ์ด์–ธํŠธ๋Š” ๋Œ€์ƒ์˜ ์—ญํ• (=์ธํ„ฐํŽ˜์ด์Šค)๋งŒ ์•Œ๋ฉด ๋œ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ(=ํด๋ž˜์Šค, ๊ฐ์ฒด)์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋„ ๋œ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์˜ํ–ฅ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ ์ž์ฒด๋ฅผ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋„ ์˜ํ–ฅ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. 
  • ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜์—ฌ ํ™•์žฅ์ด ์‰ฝ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ค๊ณ„ํ•˜๋Š”๊ฑด ๋งค์šฐ ์–ด๋ ต๋‹ค. ์ผ๋‹จ ๋Œ€์ถฉ ๋งŒ๋“ค์–ด๋†“๊ณ  ๋‚˜์ค‘์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๊ฒฐ๊ตญ์—๋Š” ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„์— ๋ชจ๋‘ ํฐ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๊ธฐ์— ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•œ ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง„๋‹ค.

 

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ ์ž๋ฐ” ์ฝ”๋“œ์˜ ๋‹คํ˜•์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์Šคํ”„๋ง์—์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ์ œ์–ด์˜ ์—ญ์ „(IoC) ๋‚˜ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…(DI)์€ ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋‹ค๋ค„ ๋‹คํ˜•์„ฑ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 


# ์ข‹์€ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์„ค๊ณ„ 5์›์น™ (SOLID)

์Šคํ”„๋ง์—์„œ๋Š” IoC๋‚˜ DI์™€ ๊ฐ™์€ ๊ฐœ๋…๋ฟ๋งŒ์•„๋‹ˆ๋ผ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์„ค๊ณ„ ์›์น™์„ ์ด์šฉํ•˜์—ฌ ์„ค๊ณ„๋˜์–ด์žˆ๋‹ค. ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ์ฝ”๋“œ๋ฅผ ๋ณผ ์ผ์ด ์žˆ์„์ง„ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์‚ดํŽด๋ณธ๋‹ค๋ฉด ์•„๋ž˜์˜ ์›์น™๋“ค์„ ์ •๋ง ์ฒ ์ €ํ•˜๊ฒŒ ์ง€ํ‚ค๋ ค๊ณ  ๋…ธ๋ ฅํ•œ ํ”์ ๋“ค์ด ๋‚จ์•„์žˆ๋‹ค.

์ฐธ๊ณ ๋กœ ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ์œ ๋ช…ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ 5์›์น™ SOLID๋Š” CleanCode ์ฑ…์œผ๋กœ ์œ ๋ช…ํ•œ ๋กœ๋ฒ„ํŠธ ๋งˆํ‹ด์ด ๊ฐ์ฒด์ง€ํ–ฅ์˜ 5์›์น™(Principle)์˜ ์•ž๊ธ€์ž๋ฅผ ์ด์–ด ๋ถ™์ธ ๊ฒƒ์ด๋‹ค.

 

@ SRP (Single Responsibility ๋‹จ์ผ์ฑ…์ž„์›์น™)

ํ•œ ๊ฐ์ฒด๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„์„ ์ง€๋‹Œ๋‹ค. ์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š”, ์˜ค์ง ํ•˜๋‚˜ ๋ฟ์ด์–ด์•ผํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ ํ˜„์—…์—์„œ ๊ฐœ๋ฐœํ•˜๋‹ค๋ณด๋ฉด, 'ํ•˜๋‚˜์˜ ์ฑ…์ž„' ์ด๋ผ๋Š” ๊ฐœ๋…์ด ์ƒ๋‹นํžˆ ๋ชจํ˜ธํ•˜๋‹ค. ์–ด๋””๊นŒ์ง€๋ฅผ ํ•˜๋‚˜์˜ ์ฑ…์ž„์œผ๋กœ ๋ด์•ผํ• ๊นŒ? ์ค‘์š”ํ•œ ๊ธฐ์ค€์€ ๋ฐ”๋กœ ๋ณ€๊ฒฝ์ด๋‹ค. ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ์–ด๋–ค ํŒŒ๊ธ‰ํšจ๊ณผ๊ฐ€ ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•˜๋ฉฐ ๊ฐœ๋ฐœํ•˜๋ฉด SRP๋ฅผ ์‰ฝ๊ฒŒ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ํด๋ž˜์Šค๋‹น ์ฑ…์ž„์„ ํ•˜๋‚˜๋กœ ์ •ํ•ด์„œ, ๋‚˜์ค‘์— ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๊ณณ์˜ ํŒŒ๊ธ‰ํšจ๊ณผ๊ฐ€ ์ตœ๋Œ€ํ•œ ์ ๋„๋ก ๋งŒ๋“ค์–ด๋ผ๋Š” ๋ง์ด๋‹ค.

๋ชจ๋“ˆํ™”ํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ํ•œ ์ฑ…์ž„๋งŒ ์ง€๋‹ˆ๋„๋ก ๋งŒ๋“ ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ, ์–ด๋–ค ๋น„์ฆˆ๋‹ˆ์Šค ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋˜ ํ•ญ์ƒ ์•ž๋’ค๋กœ ๋ฐ˜๋ณต๋˜๋Š” ์„ค์ •์ด ์žˆ๋‹ค. ์ด๋ฅผ Cross-Cutting Concerns(๊ณตํ†ต ๊ด€์‹ฌ์‚ฌํ•ญ)์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋ฅผ ๊ด€์‹ฌ์‚ฌํ•ญ(Concerns)์— ๋”ฐ๋ผ ์˜๋ฏธ์žˆ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์„ค์ •์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ณตํ†ต๋œ ์„ค์ •์„ ๋ชจ๋“ˆํ™” ํ•˜๋Š” ๊ฒƒ์„ AOP(Asepct Oriented Programming), ๊ด€์‹ฌ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ด๊ฒƒ๋„ ๊ฒฐ๊ตญ SRP ์›์น™์ด ์ถ”๊ตฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋งฅ๋ฝ์ด ๊ฐ™๋‹ค.

 


@ OCP (Open/closed ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™)

์†Œํ”„ํŠธ์›จ์–ด ์—”ํ‹ฐํ‹ฐ(ํด๋ž˜์Šค,๋ชจ๋“ˆ,ํ•จ์ˆ˜)๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ์ง€๋งŒ, ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•œ๋‹ค.

์‚ฌ์‹ค ์ด๊ฑด ๋ˆ„๊ฐ€๋ด๋„ ๋‹น์—ฐํ•œ ์ด์•ผ๊ธฐ๋‹ค. ํ•˜์ง€๋งŒ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด๋ฉด ๋ณ€๊ฒฝ์„ ํ•ด์•ผ ํ™•์žฅ์„ ํ•˜๋Š”๊ฑด๋ฐ, ์ด๊ฒŒ ๋ฌด์Šจ ํ—›์†Œ๋ฆฌ์ผ๊นŒ?

OCP๋Š” ๋‹คํ˜•์„ฑ์˜ ํ™œ์šฉ, ์ฆ‰ ์—ญํ• ๊ณผ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ์ฒด๋Š” '์—ญํ• '์— ์˜์กด์„ฑ์„ ๊ฐ€์ ธ์•ผํ•˜์ง€, '๊ตฌํ˜„์ฒด'์— ์˜์กด์„ฑ์„ ๊ฐ€์ง€๋ฉด ์•ˆ๋œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด์ž. ์„œ๋น„์Šค์—์„œ DB ์ธํ„ฐํŽ˜์ด์Šค์— ๊ตฌํ˜„์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌDB์—์„œ JDBC๋กœ ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ์ด๋‹ค.

๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค, ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด '๋ณ€๊ฒฝ'ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์„ 'ํ™•์žฅ'ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

 

๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ”๋กœ ์•ˆ์“ฐ๊ณ  ์œ„์˜ ์˜ˆ์ œ์ฒ˜๋Ÿผ ์ธํ„ฐํŽ˜์ด์Šค(์—ญํ• )์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— OCP๋ฅผ ์ž˜ ์ง€์ผฐ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์™€ ๊ฐ™์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์„œ๋ฒ„ ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•  ๋•Œ ์œ„์™€ ๊ฐ™์ด ํด๋ผ์ด์–ธํŠธ(์„œ๋น„์Šค) ํด๋ž˜์Šค์—์„œ ์˜์กด๊ด€๊ณ„, ์ฆ‰ ๊ตฌํ˜„์ฒด ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค.

 

์œ„์˜ ์˜ˆ์ œ๋Š” ๋‹จ์ˆœํ•ด์„œ ์‰ฌ์›Œ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ณต์žกํ•˜๊ฒŒ ์–ฝํ˜€์žˆ์–ด ์ด๋Š” ์ ˆ๋Œ€ ์‰ฌ์šด ์ž‘์—…์ด ์•„๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝํ•  ๋•Œ ๋งˆ๋‹ค ์ƒ๊ด€์—†๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์ˆ˜์ • ํ•œ ๋’ค ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ๋‹ค์‹œ ํ…Œ์ŠคํŠธ, ๊ฒ€์ฆํ•ด์•ผํ•˜๋ฉด ํž˜๋“ค๊ฒŒ OCP๋ฅผ ๊ตฌํ˜„ํ•œ ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง„๋‹ค. ์ฆ‰ ์ด๋Š” OCP๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ด์•ผํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ ์Šคํ”„๋ง์—์„œ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” '์„ค์ •์ž'๋ฅผ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)์— ๋„ฃ์„ ๊ตฌํ˜„์ฒด, ์ฆ‰ ์˜์กด๊ด€๊ณ„๋ฅผ ๋Œ€์‹  ์ฃผ์ž…ํ•ด์ค€๋‹ค. ์ฆ‰ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์—†์ด ์„œ๋ฒ„๋ฅผ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”๋ฐ, ์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ์ง€๋Š” ์ด๋Š” ์•„๋ž˜์˜ @DIP ์—์„œ ์ถ”๊ฐ€๋กœ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

 


@ LSP (Liskov substitution ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™)

์„œ๋ธŒํƒ€์ž…์€ ์–ธ์ œ๋‚˜ ์ž์‹ ์˜ ๊ธฐ๋ฐ˜ํƒ€์ž…(base type)์œผ๋กœ ๊ต์ฒดํ•ด๋„ ์ •์ƒ ๋™์ž‘ํ•ด์•ผํ•œ๋‹ค.
(๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ : Sub๊ฐ€ Super์˜ ์ž์‹์ด๋ผ๋ฉด, ์•„๋ฌด๋Ÿฐ ์ˆ˜์ •์—†์ด Super๊ฐ์ฒด๋ฅผ Sub๊ฐ์ฒด๋กœ ์น˜ํ™˜ํ•ด๋„ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค. )

๋ง์ด ์–ด๋ ค์šด๋ฐ, ์ด๋Š” ์•Œ๊ณ ๋ณด๋ฉด ๋‹น์—ฐํ•œ ์ด์•ผ๊ธฐ์ด๋‹ค. ๋‹ค๋งŒ ๋‹จ์ˆœํžˆ Parent a = Child b ๋งŒ ๊ฐ€๋Šฅํ•œ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ด๋ ‡๊ฒŒ ์—…์บ์ŠคํŒ…ํ•˜๋”๋ผ๋„ ๋™์ž‘์— ๋ฌธ์ œ๊ฐ€ ์—†์–ด์•ผํ•œ๋‹ค๋Š” ๋ง์ด๋‹ค.

 

์ž๋™์ฐจ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. [์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค]์—์„œ ์ œ๊ณตํ•˜๋Š” 'Break' ๋ผ๋Š” ๊ธฐ๋Šฅ์€ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ž๋™์ฐจ๋ฅผ ๋ฉˆ์ถ”๋„๋ก ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœํ•˜๋‹ค๋ณด๋ฉด [์ž๋™์ฐจ ๊ฐ์ฒด]์— 'Break' ๋ผ๋Š” ๋ฉ”์„œ๋“œ์— ์ฐฝ๋ฌธ์„ ์—ฐ๋‹ค๋˜๊ฐ€, ์†๋„๋ฅผ ๊ฐ€์†ํ•˜๋Š” ์ด์ƒํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋ฌผ๋ก  ํ•ด๋‹น ๋น„์œ ๋Š” ์ •์‹  ๋‚˜๊ฐ„ ์ง“์ด์ง€๋งŒ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ทœ์•ฝ์„ ๋ฒ—์–ด๋‚˜์„œ ์ฝ”๋”ฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๊ณ , ๊ทธ๋ ‡๊ฒŒ ํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ฑฐ๋‚˜ ์„œ๋ฒ„๊ฐ€ ์ฃฝ๋Š”๊ฑด ์•„๋‹ˆ๋‹ˆ๊นŒ ๊ดœ์ฐฎ๋‹ค๊ณ  ๋„˜๊ฒจ๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค.

 

LSP๋Š” ๋‹จ์ˆœํžˆ '์ปดํŒŒ์ผ๋˜์–ด ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ'๋ฅผ ๋„˜์–ด์„œ์„œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์„ค๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ทœ์•ฝ์„ ๊นจ๋Š” ์ด์ƒํ•œ ๊ตฌํ˜„์„ ํ•˜์ง€๋ง๋ผ๋Š” ๋ง์ด๋‹ค. ์ฆ‰ ์–ด๋ ต๊ฒŒ ๋งํ•˜๋ฉด '์ •ํ™•์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ, ํ•˜์œ„ ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋ผ' ๋ผ๋Š” ๋œป.

 


@ ISP (Interface segregation ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™)

ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ์— ์˜์กด๊ด€๊ณ„๋ฅผ ๋งบ์œผ๋ฉด ์•ˆ ๋œ๋‹ค.

ํŠน์ • ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€, ํ•˜๋‚˜์˜ ๋ฒ”์šฉ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค ๋‚ซ๋‹ค. ๋ฒ”์šฉ์ ์ด๊ฒŒ ์“ธ๋ ค๊ณ  ์‚ฌ์šฉํ•˜์ง€๋„ ์•Š๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š”๊ฑด ์˜์กด ๊ด€๊ณ„์™€ ๊ฒฐํ•ฉ๋„๋ฅผ ๋Š˜๋ฆฌ๋Š” ํ–‰์œ„์ด๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋‚˜๋ˆ ์„œ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜์ž.

  • ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค -> ์šด์ „ ์ธํ„ฐํŽ˜์ด์Šค, ์—”์ง„ ์ธํ„ฐํŽ˜์ด์Šค, ์ •๋น„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌ
  • ์‚ฌ์šฉ์ž ํด๋ผ์ด์–ธํŠธ -> ์šด์ „์ž ํด๋ผ์ด์–ธํŠธ, ํƒ‘์Šน์ž ํด๋ผ์ด์–ธํŠธ, ์ •๋น„์‚ฌ ํด๋ผ์ด์–ธํŠธ ๋กœ ๋ถ„๋ฆฌ

์ด๋ ‡๊ฒŒ ๋ฒ”์šฉ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋ถ„๋ฆฌํ•ด์„œ, ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด๋“ค์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ ์ผ๋ถ€๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ์„œ๋กœ ์˜ํ–ฅ๋ผ์น˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค์–ด์„œ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๋„๋ก ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋ผ๋Š” ์›์น™์ด๋‹ค. 

 


@ DIP (Dependency inversion ์˜์กด๊ด€๊ณ„ ์—ญ์ „์˜ ์›์น™)

)ํ•ด๋‹น ๋งํฌ์˜ ๊ธ€์ด ์ดํ•ด๊ฐ€ ๋  ๋•Œ, ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•  ์˜ˆ์ •)

* ์ฐธ๊ณ ๋กœ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…(DI, Dependency Injection)์€ DIP๋ฅผ ์ง€ํ‚ค๋Š” ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜์ด์ง€, DIP ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋‹ค. [์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ด์šฉํ•œ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…]์€ DIP์™€ ๋‹คํ˜•์„ฑ์„ ์ œ๊ณต์„ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผํ•œ๋‹ค. ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๊ตฌํ˜„์ด ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค์— ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋ผ.

๊ฐ์ฒด์ง€ํ–ฅ์˜ 5์›์น™์„ ์ฑ…์œผ๋กœ ๋งŒ๋“  ๋กœ๋ฒ„ํŠธ C.๋งˆํ‹ด์€ ์•„๋ž˜์™€ ๊ฐ™์ด DIP๋ฅผ ์„ค๋ช…ํ•˜์˜€๋‹ค.

  • ๊ณ ์ฐจ์› ๋ชจ๋“ˆ์€ ์ €์ฐจ์› ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ์ด ๋‘ ๋ชจ๋“ˆ ๋ชจ๋‘ ๋‹ค๋ฅธ ์ถ”์ƒํ™”๋œ ๊ฒƒ์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.
  • ์ถ”์ƒํ™”๋œ ๊ฒƒ์€ ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์ด ์ถ”์ƒํ™” ๋œ ๊ฒƒ์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.
  • ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๊ตฌํ˜„์ฒด(Concrete) ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ๋งˆ๋ผ.

์‰ฝ๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ๋•Œ ์‹ค์ œ ๊ตฌํ˜„๋œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋ณด๊ณ  ์„ค๊ณ„ํ•˜๋ผ๋Š” ๋ง์ด๋‹ค. ์ฆ‰ ์‹ค์ œ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ชจ๋ฅด๋”๋ผ๋„ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋ณด๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

 

์ด๋Š” ๊ตฌํ˜„๊ณผ ์—ญํ• ์˜ ๋ถ„๋ฆฌ, ์ฆ‰ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ญํ• (Role)์— ์˜์กดํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค๋Š” ๋ง์ด๋‹ค. ์•ž์—์„œ ์„ค๋ช…ํ•œ @OCP ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ๊ฐ์ฒด์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DIP๋ฅผ ์œ„๋ฐ˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

DIP ์œ„๋ฐ˜, ๊ทผ๋ฐ ์ด ์ •๋„๋„ ์•ˆ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ์™„๋ฒฝํ•œ ๊ฐ์ฒด์ง€ํ–ฅ์  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‚˜์š”?

์‚ฌ์‹ค ์ž˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•˜๋Š” ์ž๋ฐ”์˜ ๋‹คํ˜•์„ฑ๋งŒ์œผ๋กœ๋Š” OCP, DIP๋ฅผ ์–ด๋Š์ •๋„ ๋น„์Šทํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜๋Š” ์žˆ์–ด๋„, ์‹ค์ œ ์„œ๋น„์Šค์—์„œ ์›์น™์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€ํ‚ค๊ธฐ๋Š” ์ƒ๋‹นํžˆ ์–ด๋ ต๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์„ ๋ง‰์•„๋ฒ„๋ฆฌ๊ณ , ๊น”๋”ํ•˜๊ฒŒ ๋ถ€ํ’ˆ์„ ๊ฐˆ์•„ ๋ผ์šฐ๋“ฏ์ด ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ญ”๊ฐ€ ๊ฐ์ฒด์ง€ํ–ฅ์„ ๋„์™€์ค„ ๋„๊ตฌ๊ฐ€ ๋” ํ•„์š”ํ•˜๋‹ค.

 


# ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋“ฑ์žฅ

๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๋ผ๋ฉด, ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ณ  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ์ƒํ™ฉ์— ๋งž์ดํ•˜๋‹ค๋ณด๋ฉด ์œ„์—์„œ ํ–ˆ๋˜ ๊ณ ๋ฏผ๋“ค์„ ํ•˜๊ฒŒ๋œ๋‹ค. ์‚ฌ์‹ค ๋‹คํ˜•์„ฑ, ๊ฐ์ฒด์ง€ํ–ฅ์˜ 5์›์น™๋„ ๋ง๋งŒ ๋‹ค๋ฅด์ง€ ์ด ๋ฐฉ๋ฒ•๋“ค์ด ์ถ”๊ตฌํ•˜๋Š” ๋ชฉํ‘œ๋Š” ๊ฐ™๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์—†์ด, ๋ถ€ํ’ˆ์„ ๊ต์ฒดํ•˜๋“ฏ์ด ๊ฐœ๋ฐœํ•˜๋Š” ์ง„์ •ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์œ„์—์„œ ๋งํ•œ ๋‹คํ˜•์„ฑ + OCP, DIP๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ง€์›ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

 


# ์ •๋ฆฌ

  • ๋ชจ๋“  ์„ค๊ณ„์— ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•˜์ž.
  • ๊ณต์—ฐ, ์˜ํ™”๊ฐ๋…์€ ๋‹น์žฅ ๋ฐฐ์šฐ๋‚˜ ์ดฌ์˜์žฅ์†Œ ์บ์ŠคํŒ…์„ ์‹คํŒจํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ์˜ํ™”๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค. ์•ฑ ์„ค๊ณ„๋„ ๊ณต์—ฐ์„ ํ•˜๋“ฏ์ด ๋ฐฐ์—ญ๋งŒ ๋งŒ๋“ค์–ด๋‘๊ณ , ๋ฐฐ์šฐ๋Š” ์–ธ์ œ๋“ ์ด ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
  • ์ด์ƒ์ ์œผ๋กœ๋Š” ๋ชจ๋“  ์„ค๊ณ„์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ€์—ฌํ•˜์ž.

ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•˜๋ฉด '์ถ”์ƒํ™” ์„ค๊ณ„'๋ผ๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์•„์˜ˆ ์—†๋‹ค๋ฉด, ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ณ  ํ–ฅํ›„ ๊ผญ ํ•„์š”ํ•  ๋•Œ ๋ฆฌํŽ™ํ† ๋งํ•ด์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒƒ์„ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ธฐ์ˆ ๋ถ€์ฑ„๋ผ๊ณ  ๋งํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค๊ฐ€ ์ปค์ง€๋ฉด ์–ธ์  ๊ฐ€ ๊ฐš์•„์•ผํ•  ๊ธฐ์ˆ  ๋ถ€์ฑ„. 

 

๊ฒฐ๊ตญ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š”, ์œ„์™€ ๊ฐ™์€ ์›์น™๋“ค์„ ์ด์šฉํ•˜์—ฌ ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ