λ°±μ—”λ“œ/🌿 Spring

μŠ€ν”„λ§ 핡심 원리 - 기본편 [Section 1. 객체 지ν–₯ 섀계와 μŠ€ν”„λ§]

Damgome 2023. 11. 20. 18:54

μŠ€ν”„λ§ 역사

  • 개발자 λ‘œλ“œ 쑴슨 → EJB 의 문제점 지적, μ±… 좜판
  • 유겐 휠러, μ–€ μΉ΄λ‘œν”„κ°€ λ‘œλ“œ μ‘΄μŠ¨μ—κ²Œ μ˜€ν”ˆμ†ŒμŠ€ ν”„λ‘œμ νŠΈ μ œμ•ˆ

 

μŠ€ν”„λ§μ΄λž€?

μŠ€ν”„λ§ μƒνƒœκ³„

  • ν•„μˆ˜
    • μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬, μŠ€ν”„λ§ λΆ€νŠΈ
  • 선택
    • μŠ€ν”„λ§ 데이터, μŠ€ν”„λ§ μ„Έμ…˜, μŠ€ν”„λ§ μ‹œνλ¦¬ν‹°, μŠ€ν”„λ§ Rest Docs, μŠ€ν”„λ§ 배치, μŠ€ν”„λ§ ν΄λΌμš°λ“œ

 

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬

  • 핡심 기술 : μŠ€ν”„λ§ DI μ»¨ν…Œμ΄λ„ˆ, AOP, 이벀트, 기타

 

μŠ€ν”„λ§ λΆ€νŠΈ

  • μŠ€ν”„λ§μ„ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 있게 지원
  • ν†°μΊ£ 같은 μ›Ή μ„œλ²„ λ‚΄μž₯ → λ³„λ„μ˜ μ›Ή μ„œλ²„ μ„€μΉ˜ λΆˆν•„μš”
  • 버전을 μ§€μ •ν•΄μ„œ λ‹€μš΄λ‘œλ“œ ν•˜κ²Œ ν•΄μ€Œ
  • λ©”νŠΈλ¦­/μƒνƒœ 확인/μ™ΈλΆ€ ꡬ성 같은 ν”„λ‘œλ•μ…˜ μ€€λΉ„ κΈ°λŠ₯ 제곡
  • μŠ€ν”„λ§κ³Ό λ³„λ„λ‘œ μ‚¬μš©ν•  수 μžˆλŠ” 게 μ•„λ‹˜

 

μŠ€ν”„λ§μ΄λΌλŠ” 단어

  • λ¬Έλ§₯에 따라!
    • μŠ€ν”„λ§ DI μ»¨ν…Œμ΄λ„ˆ 기술
    • μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬
    • μŠ€ν”„λ§ λΆ€νŠΈ, μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ λ“± 포함 μŠ€ν”„λ§ μƒνƒœκ³„

 

μŠ€ν”„λ§ μ™œ λ§Œλ“€μ—ˆλ‚˜?

μŠ€ν”„λ§μ˜ 핡심 κ°œλ…

  • μžλ°” μ–Έμ–΄ 기반 ν”„λ ˆμž„μ›Œν¬
  • μžλ°” → 객체 지ν–₯ μ–Έμ–΄
  • 객체 지ν–₯ μ–Έμ–΄κ°€ 가진 κ°•λ ₯ν•œ νŠΉμ§• μ‚΄λ €λ‚΄λŠ” ν”„λ ˆμž„μ›Œν¬
  • 쒋은 객체 지ν–₯ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ„ λ„μ™€μ£ΌλŠ” ν”„λ ˆμž„μ›Œν¬

 

쒋은 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λž€?

객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°?

  • κ°μ²΄λ“€μ˜ λͺ¨μž„
  • 객체듀은 μ„œλ‘œ λ©”μ‹œμ§€λ₯Ό 주고받을 수 있음
  • μœ μ—°, 변경이 용이

 

μœ μ—°, 변경이 용이?

→ 객체 지ν–₯의 핡심 : λ‹€ν˜•μ„±

 

 

λ‹€ν˜•μ„±μ˜ 싀세계 λΉ„μœ 

  • 싀세계와 객체 지ν–₯을 1:1둜 맀칭
(μ˜ˆμ‹œ1)
μžλ™μ°¨κ°€ λ°”λ€Œμ–΄λ„ μš΄μ „μžλŠ” μš΄μ „ ν•  수 있음
→ ν…ŒμŠ¬λΌλ₯Ό μ‚°λ‹€κ³  ν•΄μ„œ λ‹€λ₯Έ μš΄μ „λ©΄ν—ˆλ₯Ό λ”°μ•Όν•˜λŠ” 게 μ•„λ‹˜

μš΄μ „μžλŠ” μžλ™μ°¨ μ—­ν•  (μΈν„°νŽ˜μ΄μŠ€)μ—λ§Œ 의쑴
λ‹€λ₯Έ λŒ€μƒμœΌλ‘œ λ³€ν™˜ κ°€λŠ₯. 기쑴의 μžλ™μ°¨ μ—­ν•  κ·ΈλŒ€λ‘œ λ”°λΌκ°ˆ 수 있음
μžλ™μ°¨λ₯Ό λ¬΄ν•œ ν™•μž₯ κ°€λŠ₯
→ μƒˆλ‘œμš΄ μžλ™μ°¨κ°€ λ‚˜μ™€λ„, ν΄λΌμ΄μ–ΈνŠΈλŠ” μƒˆλ‘œμš΄ κ±Έ λ°°μš°μ§€ μ•Šμ•„λ„ 됨

 

(μ˜ˆμ‹œ2)
둜미였 μ—­ν•  : μž₯동건, μ›λΉˆ λ“± λ‚¨μž 배우
쀄리엣 μ—­ν•  : κΉ€νƒœν¬, μ†‘ν˜œκ΅ λ“±μ˜ μ—¬μž 배우 λͺ¨λ‘ κ°€λŠ₯!
→ μ€„λ¦¬μ—£μ˜ κ΅¬ν˜„μ΄ 바뀐닀고 ν•΄μ„œ λ‘œλ―Έμ˜€μ—κ²Œ 영ν–₯ λ―ΈμΉ˜μ§€ μ•ŠμŒ

 

 

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

  • μ—­ν• κ³Ό κ΅¬ν˜„μœΌλ‘œ κ΅¬λΆ„ν•˜λ©΄ 세상이 λ‹¨μˆœν•΄μ§€κ³ , μœ μ—°ν•΄μ§. 변경도 νŽΈλ¦¬ν•΄μ§
  • μž₯점
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” λŒ€μƒμ˜ μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)만 μ•Œλ©΄ 됨
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” κ΅¬ν˜„ λŒ€μƒμ˜ λ‚΄λΆ€ ꡬ쑰λ₯Ό λͺ°λΌλ„ 됨
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” κ΅¬ν˜„ λŒ€μƒμ˜ λ‚΄λΆ€ ꡬ쑰가 λ³€κ²½λ˜μ–΄λ„ 영ν–₯ 받지 X
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” κ΅¬ν˜„ λŒ€μƒ 자체λ₯Ό 변경해도 영ν–₯을 받지 μ•ŠμŒ

 

in μžλ°” μ–Έμ–΄

μžλ°” μ–Έμ–΄μ˜ λ‹€ν˜•μ„±μ„ ν™œμš©!

  • 역할은 μΈν„°νŽ˜μ΄μŠ€
  • κ΅¬ν˜„μ€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 객체. (κ΅¬ν˜„ 객체)
  • 객체 섀계할 λ•Œ μ—­ν• /κ΅¬ν˜„ λͺ…ν™•νžˆ 뢄리!
  • 객체 μ„€κ³„μ‹œ μ—­ν•  λ¨Όμ € λΆ€μ—¬, κ·Έ μ—­ν•  μˆ˜ν–‰ν•˜λŠ” κ΅¬ν˜„ 객체 λ§Œλ“€μž

객체의 ν˜‘λ ₯μ΄λΌλŠ” 관계뢀터 생각

  • 혼자 μžˆλŠ” κ°μ²΄λŠ” μ—†μŒ
  • ν΄λΌμ΄μ–ΈνŠΈ : μš”μ²­
  • μ„œλ²„ : 응닡
  • 수 λ§Žμ€ 객체 ν΄λΌμ΄μ–ΈνŠΈμ™€ 객체 μ„œλ²„λŠ” μ„œλ‘œ ν˜‘λ ₯ 관계

ν΄λΌμ΄μ–ΈνŠΈ → MemberRepository 에 의쑴 (의쑴 : μ•Œκ³ μžˆλ‹€λŠ” λœ»μž„)

 

λ‹€ν˜•μ„±μ˜ 본질

  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 객체 μΈμŠ€ν„΄μŠ€λ₯Ό μ‹€ν–‰ μ‹œμ μ— μœ μ—°ν•˜κ²Œ λ³€κ²½ κ°€λŠ₯
  • ν΄λΌμ΄μ–ΈνŠΈλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ , μ„œλ²„μ˜ κ΅¬ν˜„ κΈ°λŠ₯을 μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 있음

 

μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ•ˆμ •μ μœΌλ‘œ μ„€κ³„ν•˜λŠ” 것이 κ°€μž₯ μ€‘μš”ν•¨

μŠ€ν”„λ§κ³Ό 객체 지ν–₯

  • λ‹€ν˜•μ„±μ΄ κ°€μž₯ μ€‘μš”
  • μŠ€ν”„λ§μ€ λ‹€ν˜•μ„±μ„ κ·ΉλŒ€ν™”ν•΄ μ΄μš©ν•  수 있게 λ„μ™€μ€Œ
  • μ œμ–΄μ˜ μ—­μ „, μ˜μ‘΄κ΄€κ³„ μ£Όμž… → λ‹€ν˜•μ„± ν™œμš©, μ—­ν• κ³Ό κ΅¬ν˜„ νŽΈλ¦¬ν•˜κ²Œ λ‹€λ£° 수 μžˆλ„λ‘ 지원함

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

SRP (단일 μ±…μž„ 원칙)

ν•˜λ‚˜μ˜ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ§€μž.

  • ν•˜λ‚˜μ˜ μ±…μž„μ΄ λ­μž„ ? λͺ¨ν˜Έν•˜μžλ‚˜μ—¬!
    • 클 μˆ˜λ„ 있고 μž‘μ„ μˆ˜λ„ 있고..
    • λ¬Έλ§₯/상황에 따라 닀름
  • μ€‘μš”ν•œ 기쀀은 λ³€κ²½! → λ³€κ²½ μžˆμ„ λ•Œ νŒŒκΈ‰ νš¨κ³Όκ°€ 적으면 단일 μ±…μž„ 원칙을 잘 λ”°λ₯Έ κ²ƒμž„

OCP (개방-폐쇄 원칙)****

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

(λ¨Έμ„  말인데?)

  • λ‹€ν˜•μ„±μ„ ν™œμš©ν•΄λ³΄μž
    • κ·Έλ‹ˆκΉŒ μžλ™μ°¨-μš΄μ „μžμ˜ κ°œλ…μ—μ„œ
    • μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν•˜λ‚˜ 더 λ§Œλ“œλŠ” κ±°λŠ” κΈ°μ‘΄ μ½”λ“œλ₯Ό λ³€κ²½ν•˜λŠ” 게 μ•„λ‹˜(ν™•μž₯)
  • 문제점
    • κ΅¬ν˜„ 객체λ₯Ό λ³€κ²½ν•˜λ €λ©΄ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό λ³€κ²½ν•΄μ•Ό 함..
    • λΆ„λͺ… λ‹€ν˜•μ„± μ‚¬μš©ν–ˆλŠ”λ°λ„ OCP 지킬 수 μ—†κ²Œ 됨
    • 객체 생성/연관관계 λ§Ίμ–΄μ£ΌλŠ” λ³„λ„μ˜ 쑰립, μ„€μ •μžκ°€ ν•„μš”!

LSP (λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙)

ν”„λ‘œκ·Έλž¨μ˜ κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ 정확성을 깨지 μ•ŠμœΌλ©΄μ„œ ν•˜μœ„ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ‘œ λ°”κΏ€ 수 μžˆμ–΄μ•Ό 함!

ISP (μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙)

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

DIP (μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙)****

  • ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 좔상화에 μ˜μ‘΄ν•΄μ•Όμ§€, ꡬ체화에 μ˜μ‘΄ν•˜λ©΄ μ•ˆ 됨
  • 즉, κ΅¬ν˜„ ν΄λž˜μŠ€λ³΄λ‹€ μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜λΌλŠ” 뜻
  • DIP μœ„λ°˜ 
    • OCPμ—μ„œ μ„€λͺ…ν•œ MemberServiceλŠ” μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜μ§€λ§Œ κ΅¬ν˜„ ν΄λž˜μŠ€λ„ λ™μ‹œμ— μ˜μ‘΄ν•¨
    • MemberService ν΄λΌμ΄μ–ΈνŠΈκ°€ κ΅¬ν˜„ 클래슀λ₯Ό 직접 선택
MemberRepository m = new MemoryMemberRepository();

객체 지ν–₯ 섀계와 μŠ€ν”„λ§

  • μŠ€ν”„λ§μ€ λ‹€μŒ 기술둜 λ‹€ν˜•μ„± + OCP, DIP κ°€λŠ₯ν•˜κ²Œ μ§€μ›ν•΄μ£ΌλŠ” 기술
    • DI : μ˜μ‘΄κ΄€κ³„/μ˜μ‘΄μ„± μ£Όμž…
    • DI μ»¨ν…Œμ΄λ„ˆ 제곡
  • ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œ λ³€κ²½ 없이 κΈ°λŠ₯ ν™•μž₯

정리

  • λͺ¨λ“  섀계에 μ—­ν• κ³Ό κ΅¬ν˜„μ„ λΆ„λ¦¬ν•˜μž
  • 이상적 → λͺ¨λ“  섀계에 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λΆ€μ—¬ν•˜μž