λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⭐ Personal_Study/Spring

SOLID (쒋은 객체 지ν–₯ μ„€κ³„μ˜ 5가지 원칙)

by ν¬μŠ€νŠΈμ‰μ΄ν¬ 2022. 12. 31.

SOLID

쒋은 객체 지ν–₯ μ„€κ³„μ˜ 5가지 원칙

  1. SRP: 단일 μ±…μž„ 원칙 (single responsibility principle)
  2. OCP: 개방-폐쇄 원칙 (Open/closed principle)
  3. LSP: λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙 (Liskov substitution principle)
  4. ISP: μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙 (Interface segregation principle)
  5. DIP: μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙 (Dependency inversion principle)

1. SRP: 단일 μ±…μž„ 원칙

ν•œ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•Ό ν•œλ‹€

ν•˜λ‚˜μ˜ μ±…μž„μ΄λΌλŠ” 것은 λͺ¨ν˜Έν•˜λ‹€.

  • 클 수 있고, μž‘μ„ 수 μžˆλ‹€.
  • λ¬Έλ§₯κ³Ό 상황에 따라 λ‹€λ₯΄λ‹€.

μ€‘μš”ν•œ 기쀀은 변경이닀. 변경이 μžˆμ„ λ•Œ νŒŒκΈ‰ νš¨κ³Όκ°€ 적으면 단일 μ±…μž„ 원칙을 잘 λ”°λ₯Έ 것
ex) UI λ³€κ²½, 객체의 생성과 μ‚¬μš© 뢄리

2. OCP: 개방-폐쇄 원칙

μ†Œν”„νŠΈμ›¨μ–΄ μš”μ†ŒλŠ” ν™•μž₯μ—λŠ” μ—΄λ € μžˆμœΌλ‚˜ λ³€κ²½μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€.

λ‹€ν˜•μ„± ν™œμš©

μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ μƒˆλ‘œμš΄ 클래슀λ₯Ό ν•˜λ‚˜ λ§Œλ“€μ–΄μ„œ μƒˆλ‘œμš΄ κΈ°λŠ₯을 κ΅¬ν˜„

μ—­ν• κ³Ό κ΅¬ν˜„μ˜ 뢄리

문제점

public class MemberService {

    // private MemberRepository memberRepository = new MemoryMemberRepository();
    private MemberRepostiory memberRepository = new JdbcMemberRepository();
}

MemberService ν΄λΌμ΄μ–ΈνŠΈκ°€ κ΅¬ν˜„ 클래슀λ₯Ό 직접 선택

κ΅¬ν˜„ 객체λ₯Ό λ³€κ²½ν•˜λ €λ©΄ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό λ³€κ²½ν•΄μ•Ό ν•œλ‹€

λΆ„λͺ… λ‹€ν˜•μ„±μ„ μ‚¬μš©ν–ˆμ§€λ§Œ OCP 원칙을 지킬 수 μ—†λ‹€

객체λ₯Ό μƒμ„±ν•˜κ³ , 연관관계λ₯Ό λ§Ίμ–΄μ£ΌλŠ” λ³„λ„μ˜ 쑰립, μ„€μ •μžκ°€ ν•„μš”ν•˜λ‹€.

3. LSP: λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙

ν”„λ‘œκ·Έλž¨μ˜ κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ 정확성을 κΉ¨λœ¨λ¦¬μ§€ μ•ŠμœΌλ©΄μ„œ ν•˜μœ„ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ‘œ λ°”κΏ€ 수 μžˆμ–΄μ•Ό ν•œλ‹€.

λ‹€ν˜•μ„±μ—μ„œ ν•˜μœ„ ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€ κ·œμ•½μ„ λ‹€ μ§€μΌœμ•Ό ν•œλ‹€λŠ” 것, λ‹€ν˜•μ„±μ„ μ§€μ›ν•˜κΈ° μœ„ν•œ 원칙, μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ κ΅¬ν˜„μ²΄λŠ” λ―Ώκ³  μ‚¬μš©ν•˜λ €λ©΄, 이 원칙이 ν•„μš”ν•˜λ‹€.

λ‹¨μˆœνžˆ μ»΄νŒŒμΌμ— μ„±κ³΅ν•˜λŠ” 것을 λ„˜μ–΄μ„œλŠ” 이야기

4. ISP: μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙

νŠΉμ • ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€ μ—¬λŸ¬ κ°œκ°€ λ²”μš© μΈν„°νŽ˜μ΄μŠ€ ν•˜λ‚˜λ³΄λ‹€ λ‚«λ‹€.

μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€ -> μš΄μ „ μΈν„°νŽ˜μ΄μŠ€, μ •λΉ„ μΈν„°νŽ˜μ΄μŠ€λ‘œ 뢄리

μ‚¬μš©μž ν΄λΌμ΄μ–ΈνŠΈ -> μš΄μ „μž ν΄λΌμ΄μ–ΈνŠΈ, 정비사 ν΄λΌμ΄μ–ΈνŠΈλ‘œ 뢄리

λΆ„λ¦¬ν•˜λ©΄ μ •λΉ„ μΈν„°νŽ˜μ΄μŠ€ μžμ²΄κ°€ 변해도 μš΄μ „μž ν΄λΌμ΄μ–ΈνŠΈμ— 영ν–₯을 주지 μ•ŠμŒ

μΈν„°νŽ˜μ΄μŠ€κ°€ λͺ…확해지고, λŒ€μ²΄ κ°€λŠ₯성이 높아진닀.

5. DIP: μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙

ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” "좔상화에 μ˜μ‘΄ν•΄μ•Όμ§€, ꡬ체화에 μ˜μ‘΄ν•˜λ©΄ μ•ˆλœλ‹€." μ˜μ‘΄μ„± μ£Όμž…μ€ 이 원칙을 λ”°λ₯΄λŠ” 방법 쀑 ν•˜λ‚˜λ‹€.

μ‰½κ²Œ μ΄μ•ΌκΈ°ν•΄μ„œ κ΅¬ν˜„ ν΄λž˜μŠ€μ— μ˜μ‘΄ν•˜μ§€ 말고, μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜λΌλŠ” λ“―

μ—­ν• (Role)에 μ˜μ‘΄ν•˜κ²Œ ν•΄μ•Όν•œλ‹€λŠ” 것과 같은 의미

객체 세상도 ν΄λΌμ΄μ–ΈνŠΈκ°€ μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•΄μ•Ό μœ μ—°ν•˜κ²Œ κ΅¬ν˜„μ²΄λ₯Ό λ³€κ²½ν•  수 μžˆλ‹€! κ΅¬ν˜„μ²΄μ— μ˜μ‘΄ν•˜κ²Œ 되면 변경이 μ•„μ£Ό μ–΄λ €μ›Œμ§„λ‹€.

λ”°λΌμ„œ μœ„μ— MemberService ν΄λΌμ΄μ–ΈνŠΈκ°€ κ΅¬ν˜„ 클래슀λ₯Ό μ„ νƒν•˜λŠ” 것 μ—­μ‹œ DIP μœ„λ°˜

λŒ“κΈ€