πŸ₯ 쒋은 객체 μ§€ν–₯ μ„€κ³„μ˜ 5κ°€μ§€ 원칙 SOLID

전주은·2022λ…„ 12μ›” 6일
0
post-thumbnail

πŸ‘¨β€πŸ’» λ‘œλ²„νŠΈ λ§ˆν‹΄μ΄ μ •λ¦¬ν•œ 쒋은 객체 μ§€ν–₯ μ„€κ³„μ˜ 5κ°€μ§€ 원칙

πŸ€” λ“€μ–΄κ°€λ©΄μ„œ...

μŠ€ν”„λ§μ΄ λ‚˜μ˜€κΈ° 전에 EJB(Enterprise java Beans)λΌλŠ” μ»΄ν¬λ„ŒνŠΈ κΈ°μˆ μ„ μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

λ§Žμ€ 이용자수λ₯Ό 감당할 수 μžˆλ‹€λŠ” μž₯점을 κ°€μ§€κ³  μžˆμ§€λ§Œ, 맀우 λ¬΄κ²κΈ°λ•Œλ¬Έμ— μ˜€νƒ€ν•˜λ‚˜λ₯Ό 바꾸렀고해도 μ†ŒμŠ€λ₯Ό μ°ΎκΈ° μ–΄λ ΅κ³ , μ„œλ²„λ₯Ό ν•œλ²ˆ λ‚΄λ Έλ‹€κ°€ μ˜¬λ¦¬λŠ”λ° 10뢄이상이 걸리기 λ•Œλ¬Έμ— κ°œλ°œμžκ°€ 많이 νž˜λ“€μ—ˆλ‹€κ³  ν•©λ‹ˆλ‹€.πŸ˜₯

이런 EJB의 단점을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‘œλ”μ‘΄μŠ¨μ€ EJBκ°€ 없어도 μΆ©λΆ„νžˆ ν™•μž₯ κ°€λŠ₯ν•œ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 μžˆμŒμ„ λ³΄μ—¬μ£ΌλŠ” 예제 μ½”λ“œλ₯Ό λ°œν‘œν•˜κ²Œλ˜κ³ , 그의 책을 읽고 감λͺ…λ°›μ•„ μœ κ²ν΄λŸ¬μ™€ μ–€μΉ΄λ‘œν”„ μ£Όλ„λ‘œ μ˜€ν”ˆμ†ŒμŠ€λ₯Ό λ§Œλ“€μ–΄λ³΄μž!!ν•œκ²ƒμ΄ Spring μž…λ‹ˆλ‹€.🌼

κ·Έλ ‡λ‹€λ©΄ spring을 μ™œμ“ΈκΉŒ? Spring frameworkλŠ” 쒋은 객체지ν–₯μ„€κ³„μ˜ 5κ°€μ§€ 원칙을 λ”°λ₯΄κ³  μžˆμ–΄ 객체지ν–₯ νŠΉμ§•μ„ μ‚΄λ¦΄μˆ˜ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. μ˜€λŠ˜μ€ κ·Έ 객체지ν–₯μ„€κ³„μ˜ 5κ°€μ§€ 원칙이 무엇인지 μ•Œμ•„λ³΄κ³ μž ν•©λ‹ˆλ‹€.

βœ” SRP(Single Responsibility Principle): 단일 μ±…μž„ 원칙

클래슀λ₯Ό λ³€κ²½ν•˜λŠ” μ΄μœ λŠ” 단 ν•œ κ°€μ§€μ—¬μ•Ό ν•œλ‹€. ( λ‘œλ²„νŠΈ C. λ§ˆν‹΄)

  1. ν•œ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•Ό ν•œλ‹€. ν΄λž˜μŠ€μ— λ§Žμ€ μ±…μž„μ΄ μžˆλŠ” 경우 μ±…μž„ 쀑 ν•˜λ‚˜λ₯Ό λ³€κ²½ν•˜λ©΄ μ‚¬μš©μžκ°€ λͺ¨λ₯΄λŠ” 사이에 λ‹€λ₯Έ μ±…μž„μ— 영ν–₯을 쀄 수 μžˆμœΌλ―€λ‘œ 버그가 λ°œμƒν•  κ°€λŠ₯성이 λ†’μ•„μ§€κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
  2. 변경이 μžˆμ„ λ•Œ νŒŒκΈ‰ νš¨κ³Όκ°€ 적으면 단일 μ±…μž„ 원칙을 λ”°λ₯΄κ³  μžˆλ‹€λŠ” 것 μž…λ‹ˆλ‹€. λ°˜λ©΄μ— λ„ˆλ¬΄ μ’…μ†μ μ΄λΌμ„œ μ—°μ‡„μ μœΌλ‘œ λ°”λ€Œλ©΄ λ‹¨μΌμ±…μž„ 원칙에 μœ„λ°°λ¬λ‹€κ³  ν•  수 μžˆλ‹€.

βœ” OCP: 개방-폐쇄 원칙 β­μ€‘μš”β­

μ†Œν”„νŠΈμ›¨μ–΄ μ—”ν‹°ν‹°(클래슀, λͺ¨λ“ˆ, ν•¨μˆ˜ λ“±)λŠ” ν™•μž₯에 λŒ€ν•΄μ„œλŠ” μ—΄λ € μžˆμ–΄μ•Ό ν•˜μ§€λ§Œ 변경에 λŒ€ν•΄μ„œλŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€. ( λ‘œλ²„νŠΈ C. λ§ˆν‹΄)

μ΄λ ‡κ²Œλ§Œ λ§ν•˜λ©΄ μ΄ν•΄ν•˜κΈ°κ°€ μ–΄λ €μš°λ‹ˆ μ˜ˆμ‹œλ₯Ό ν•œλ²ˆ μ‚΄νŽ΄λ΄…λ‹ˆλ‹€.

  • λ³€κ²½μ „ μ½”λ“œμž…λ‹ˆλ‹€. MemberRepositoryλΌλŠ” λΆ€λͺ¨ν΄λž˜μŠ€λ₯Ό 톡해 MemoryMemberRepositoryλΌλŠ” λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜λŠ” κ΅¬ν˜„λœ 객체가 μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.
public class MemberService{
private MemberRepository memberreRepository = new MemoryMemberRepository();
//      ----------------                          -------------------------
// λΆ€λͺ¨ν΄λž˜μŠ€ or μΈν„°νŽ˜μ΄μŠ€                           λ©”λͺ¨λ¦¬μ—λ‹€ μ €μž₯ν•˜λŠ” κ΅¬ν˜„μ²΄
}

μ‹œκ°„μ΄ 흘러 μ΄μ œλΆ€ν„°λŠ” DB에닀가 μ €μž₯ν•˜λŠ” ν˜•νƒœλ‘œ λ°”κΎΈκΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€. 이제 κ°œλ°œμžκ°€ μˆ˜μ •ν•˜λ €κ³  ν•˜κ² μ£ ? μ•„λž˜λŠ” λ³€κ²½ν›„ μ½”λ“œμž…λ‹ˆλ‹€

public class MemberService{
private MemberRepository memberRepository = new JdbcMemberRepository();
}

μ—¬κΈ°μ„œ 보면 λ”± MemoryMemberRepository()λ₯Ό JdbcMemberRepository()둜 ν΄λž˜μŠ€μ΄λ¦„μ΄ λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€.
λ‹€ν˜•μ„±μ„ μ‚¬μš©ν–ˆλŠ”λ° (= ν™•μž₯μ€ν–ˆμ§€λ§Œ) μ½”λ“œμ— 변경이 μΌμ–΄λ‚œ μƒνƒœμ— λΌμ„œ 개방 νμ‡„μ˜ 원칙 μœ„λ°°λœλ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

이에 λŒ€ν•΄μ„œλŠ” 객체λ₯Ό μƒμ„±ν•˜κ³ , 연관관계λ₯Ό λ§Ίμ–΄μ£ΌλŠ” λ³„λ„μ˜ μ„€μ •μžκ°€ ν•„μš”ν•©λ‹ˆλ‹€. μŠ€ν”„λ§μ˜ 'μ˜μ‘΄μ„± μ£Όμž…'μ΄λΌλŠ” κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” 것이 λ°”λžŒμ§ν•˜λ‹€κ³  ν•©λ‹ˆλ‹€.

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

Sκ°€ T의 ν•˜μœ„ μœ ν˜•μ΄λ©΄ ν”„λ‘œκ·Έλž¨μ—μ„œ μžλ£Œν˜• T의 κ°μ²΄λŠ” ν•΄λ‹Ή ν”„λ‘œκ·Έλž¨μ˜ μ›ν•˜λŠ” 속성을 λ³€κ²½ν•˜μ§€ μ•Šκ³  μžλ£Œν˜• S의 객체둜 ꡐ체(μΉ˜ν™˜)ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€. - 바바라 λ¦¬μŠ€μ½”ν”„(Babara Liskov)
μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀λ₯Ό λŒ€μ²΄ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€. - λ‘œλ²„νŠΈ Cλ§ˆν‹΄

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

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

핡심은 λΆ€λͺ¨ 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” μœ„μΉ˜μ— μžμ‹ 클래슀λ₯Ό λŒ€μ‹  μ‚¬μš©ν–ˆμ„ λ•Œ μ½”λ“œκ°€ μ›λž˜ μ˜λ„λŒ€λ‘œ μž‘λ™ν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
λͺ¨λ“  ν•˜μœ„ν΄λž˜μŠ€κ°€ μƒμœ„ ν΄λž˜μŠ€μ™€ λ™μΌν•œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.
μœ„λ°˜μ‚¬λ‘€ μ˜ˆμ‹œ) μ§μ‚¬κ°ν˜•μ„ μƒμ†ν•œ μ •μ‚¬κ°ν˜• 클래슀 : Rectangle 객체λ₯Ό Squear둜 λŒ€μ²΄ν•˜λ©΄, μ •μ‚¬κ°ν˜• νŠΉμ§•λ•Œλ¬Έμ— 넓이 κ²°κ³Όκ°€ λ‹€λ₯΄κ²Œ λ‚˜μ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€. μ •μ‚¬κ°ν˜•μ€ μ§μ‚¬κ°ν˜•μΌ 수 μžˆμ§€λ§Œ Squere κ°μ²΄λŠ” Rectangle 객체가 μ•„λ‹™λ‹ˆλ‹€. μ΄λŠ” Square 객체의 λ™μž‘μ΄ Rectangle 객체의 λ™μž‘κ³Ό μΌμΉ˜ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

βœ” ISP: μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙

ν΄λΌμ΄μ–ΈνŠΈλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μΈν„°νŽ˜μ΄μŠ€μ— κ°•μ œλ‘œ μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆλœλ‹€. -λ‘œλ²„νŠΈ C. λ§ˆν‹΄
1. νŠΉμ • ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€ μ—¬λŸ¬ κ°œκ°€ λ²”μš© μΈν„°νŽ˜μ΄μŠ€ ν•˜λ‚˜λ³΄λ‹€ λ‚«λ‹€.
μΈν„°νŽ˜μ΄μŠ€ν•˜λ‚˜λ₯Ό λ°”κΎΈλ €λ©΄ ν•˜μœ„ ν΄λž˜μŠ€κ°€ λͺ¨λ‘ λ°”λ€Œμ—¬μ•Όν•˜κΈ° λ•Œλ¬Έμ— κΈ°λŠ₯이 μ—¬λŸ¬κ°œλ©΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ‚˜λˆ„λŠ”κ²Œ μ’‹λ‹€.

  1. μ—¬λŸ¬κ°œμ˜ μΈν„°νŽ˜μ΄μŠ€λ‘œ λ‚˜λˆ„λ©΄ μΈν„°νŽ˜μ΄μŠ€κ°€ λͺ…ν™•ν•΄μ§€κ³ , λŒ€μ²΄ κ°€λŠ₯성이 높아짐

ISPλŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ 응집λ ₯ μΈ‘λ©΄μ—μ„œ μž‘κ²Œ λΆ„ν• ν•˜μ—¬ ν΄λž˜μŠ€κ°€ ν•„μš”ν•œ μž‘μ—…λ§Œ μ‹€ν–‰ν•˜λ„λ‘ ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.
ISPλŠ” 단일 μ±…μž„ 원칙(SRP)와 거의 λΉ„μŠ·ν•œ λͺ©ν‘œλ₯Ό κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€.
λ‘˜μ˜ 차이점은 SRPλŠ” ν΄λž˜μŠ€μ™€ κ΄€λ ¨λœ 반면 ISPλŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ κ΄€λ ¨λ˜μ–΄ μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

βœ” DIP: μ˜μ‘΄κ΄€κ³„ μ—­μ „ μ›μΉ™πŸ’–

  1. μƒμœ„ λͺ¨λ“ˆμ€ ν•˜μœ„ λͺ¨λ“ˆμ— μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆ 되고 λ‘˜ λ‹€ 좔상화에 μ˜μ‘΄ν•΄μ•Ό ν•œλ‹€.
  2. μΆ”μƒν™”λŠ” μ„ΈλΆ€ 사항에 μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆ 되고 세뢀사항(ꡬ체적인 κ΅¬ν˜„)은 좔상화에 μ˜μ‘΄ν•΄μ•Ό ν•œλ‹€. -λ‘œλ²„νŠΈ C.λ§ˆν‹΄
  1. 좔상화에 μ˜μ‘΄ν•΄μ•Όν•˜κ³ , ꡬ체화에 μ˜μ‘΄ν•˜λ©΄ μ•ˆλ¨

  2. κ΅¬ν˜„ ν΄λž˜μŠ€μ— μ˜μ‘΄ν•˜μ§€ 말고, μΈν„°νŽ˜μ΄μŠ€μ— 의쑴

예λ₯Ό λ“€λ©΄ μ‹€μ œ μƒν™©μ—μ„œ νšŒμ˜ν• λ•Œ
기획자:" λ‚¨μžμ—κ²Œλ§Œ λ©”μΌμ‹œμŠ€ν…œμœΌ λ³΄λ‚΄λ³ΌκΉŒ?"
κ°œλ°œμžμ™ˆ:"이거 ν•˜λ €λ©΄ λ‹€λœ―μ–΄κ³ μ³μ•Όν•΄!"
μ΄λ ‡κ²Œ 되면 μ•ˆλœλ‹€λŠ” λœ»μž…λ‹ˆλ‹€.

μ–΄λ–€κΈ°λŠ₯을 λ°”κΏ”μ„œ ν•΄λ³΄μž λΌκ³ ν• λ•Œ μ–΄λ–€ μΈν„°νŽ˜μ΄μŠ€μ™€ 클래슀λ₯Ό λ–Όλ‹€ μˆ˜μ •ν•œκ±Έ λ„£μ—ˆμ„λ•Œ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λ„λ‘ λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€.
νŠΉμ • ν΄λž˜μŠ€κ°€ λ„ˆλ¬΄ 의쑴적이라 λ‹€λ₯Έ 것을 μˆ˜μ •ν•΄μ•Όν•œλ‹€λ©΄ μ˜μ‘΄μ„± μ—­μ „ 원칙에 μœ„λ°°λ©λ‹ˆλ‹€.
DIPλŠ” μƒμœ„ λͺ¨λ“ˆμ„ ꡬ체적인 κ΅¬ν˜„μ΄ μ•„λ‹Œ 좔상화(μΈν„°νŽ˜μ΄μŠ€)에 μ’…μ†μ μœΌλ‘œ λ§Œλ“€μ–΄ ν•˜μœ„ λͺ¨λ“ˆμ— λŒ€ν•œ μƒμœ„ λͺ¨λ“ˆμ˜ 쒅속성을 μ€„μ΄λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.
DIPλ₯Ό μ§€ν‚€λ©΄ 쒅속성을 쀄일 수 있기 λ•Œλ¬Έμ— μœ μ§€κ΄€λ¦¬ 및 μˆ˜μ •μ΄ μ‰¬μš΄ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 있게 λ©λ‹ˆλ‹€.

πŸ₯΄ κ²°λ‘ 

βœ” λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” OCP, DIPλ₯Ό 지킬 수 μ—†μŒ
βœ” λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” κ΅¬ν˜„ 객체λ₯Ό λ³€κ²½ν•  λ•Œ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ„ ν•¨κ»˜ λ³€κ²½
βœ” λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” μ‰½κ²Œ λΆ€ν’ˆμ„ κ°ˆμ•„ λΌμš°λ“―μ΄ 개발 ν•  수 μ—†μŒ

πŸͺ 쒋은 객체지ν–₯ κ°œλ°œμ„ ν•˜κΈ°μœ„ν•΄ μ—¬λŸ¬κ°€μ§€ ν”„λ‘œκ·Έλž¨μ„ κ²½ν—˜ν•˜λ©΄μ„œ(EJB) OCP, DIPλ₯Ό μ§€ν‚€λ©΄μ„œκ°œλ°œμ„ ν–ˆλ”λ‹ˆ κ²°κ΅­μ—” spring frameworkκ°€ λ§Œλ“€μ–΄ 지더라!

reference

https://yoongrammer.tistory.com/97

0개의 λŒ“κΈ€