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...