SOLID
๐Ÿ™Š

SOLID

Created
Apr 16, 2024 11:39 AM
Last edited time
Last updated April 16, 2024
Tags
CS
Language
URL

Intro::

๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ ๋‹ค์„ฏ๊ฐ€์ง€ ๊ธฐ๋ณธ ์›์น™์ธ SOLID์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.
ย 

SOLID ๋ž€?

๐Ÿ’ก
์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ณด๋‹ค ์œ ์—ฐํ•˜๊ณ , ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๋ฉฐ, ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ๋ชฉ์ ์„ ๋‘ก๋‹ˆ๋‹ค.
ย 

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

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

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

์†Œํ”„ํŠธ์›จ์–ด ์—”ํ‹ฐํ‹ฐ(ํด๋ž˜์Šค, ๋ชจ๋“ˆ, ํ•จ์ˆ˜ ๋“ฑ)๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์„ค๋ช…: ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์‹œ์Šคํ…œ์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ์˜ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์›์น™์„ ์ค€์ˆ˜ํ•˜๋ฉด ๊ธฐ์กด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ์„ ๊ฐœ์„ ํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ: ์‡ผํ•‘ ์นดํŠธ์—์„œ ํ• ์ธ ์ •์ฑ…์„ ์ ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ํ• ์ธ(ํ•™์ƒ ํ• ์ธ, VIP ํ• ์ธ ๋“ฑ)์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. OCP์— ๋”ฐ๋ผ, ๊ธฐ์กด์˜ ํ• ์ธ ๋กœ์ง์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ํ• ์ธ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก Discount ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฐ ํ• ์ธ ์ •์ฑ…์„ Discount๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ƒˆ ํ• ์ธ ์ •์ฑ…์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ๋‹จ์ˆœํžˆ Discount ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ƒˆ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Liskov Substitution Principle (๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™, LSP)

ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋Œ€์‹  ์ž์‹ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์„ค๋ช…: ์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ž์‹ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋Œ€์ฒดํ•ด๋„ ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์ด ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ณ„์•ฝ์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ: Bird ํด๋ž˜์Šค๊ฐ€ ์žˆ๊ณ , ์ด ํด๋ž˜์Šค์—์„œ ํŒŒ์ƒ๋œ Duck๊ณผ Ostrich ๋‘ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. ๋ชจ๋“  Bird๋Š” ๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฉ”์†Œ๋“œ(fly)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, Ostrich๋Š” ์‹ค์ œ๋กœ ๋‚  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. LSP์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚  ์ˆ˜ ์žˆ๋Š” ์ƒˆ์™€ ๋‚  ์ˆ˜ ์—†๋Š” ์ƒˆ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๋” ๋ช…ํ™•ํ•œ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, FlyingBird์™€ NonFlyingBird ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ๋„์ž…ํ•˜๊ณ , ๊ฐ๊ฐ์— ์ ํ•ฉํ•œ ํ–‰๋™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

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

ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ์ด์šฉํ•˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
  • ์„ค๋ช…: ํ•˜๋‚˜์˜ ์ผ๋ฐ˜์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค๋Š”, ๋ช‡ ๊ฐœ์˜ ๊ตฌ์ฒด์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋” ๋‚ซ๋‹ค๋Š” ์›์น™์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘๊ณ , ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ์ง€ํ•˜์—ฌ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ: ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ํ”„๋ฆฐํ„ฐ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค Printer๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” print, scan, fax ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ผ๋ถ€ ํ”„๋ฆฐํ„ฐ๋Š” ๋‹จ์ˆœํžˆ ๋ฌธ์„œ๋ฅผ ์ถœ๋ ฅ๋งŒ ํ•  ๋ฟ, ์Šค์บ”์ด๋‚˜ ํŒฉ์Šค ๊ธฐ๋Šฅ์ด ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ISP์— ๋”ฐ๋ผ, Printer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ DocumentPrinter, Scanner, Fax์™€ ๊ฐ™์ด ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ ๊ธฐ๋Šฅ์„ ํ•„์š”๋กœ ํ•˜๋Š” ์žฅ์น˜๋งŒ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Dependency Inversion Principle (์˜์กด์„ฑ ์—ญ์ „ ์›์น™, DIP)

๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์€ ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ๋‘ ๋ชจ๋“ˆ ๋ชจ๋‘ ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.
  • ์„ค๋ช…: ์ผ๋ฐ˜์ ์œผ๋กœ ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ(๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“ˆ)์€ ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ(๋ณด๋‹ค ์ถ”์ƒ์ ์ธ ์ •์ฑ…์ด๋‚˜ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๋Š” ๋ชจ๋“ˆ)์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์˜์กด์„ฑ ์—ญ์ „ ์›์น™์€ ์ด ๊ด€๊ณ„๋ฅผ ์—ญ์ „์‹œ์ผœ, ๋‘ ๋ชจ๋“ˆ ๋ชจ๋‘ ์ถ”์ƒํ™”์— ์˜์กดํ•˜๋„๋ก ํ•จ์œผ๋กœ์จ, ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์ด ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์˜ ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์ ์ด๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ: ๋‰ด์Šค ๊ธฐ์‚ฌ๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•(์ด๋ฉ”์ผ, SMS, ์•ฑ ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜)์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค. NewsService ํด๋ž˜์Šค๊ฐ€ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด๋Š” EmailNotification ํด๋ž˜์Šค์— ์ง์ ‘ ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ถ”ํ›„์— SMS๋‚˜ ์•ฑ ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DIP๋ฅผ ์ ์šฉํ•˜์—ฌ Notification ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•˜๊ณ  EmailNotification, SMSNotification, AppNotification์ด ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•จ์œผ๋กœ์จ, NewsService๋Š” ๊ตฌ์ฒด์ ์ธ ์•Œ๋ฆผ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ ํ•„์š” ์—†์ด Notification ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 

References::

Loading Comments...