λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Spring/[μΈν”„λŸ°] μŠ€ν”„λ§ 핡심 원리 - 기본편

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

ν•΄λ‹Ή ν¬μŠ€νŒ…μ€ κΉ€μ˜ν•œλ‹˜μ˜ μΈν”„λŸ° κ°•μ˜(μŠ€ν”„λ§ 핡심 원리 - 기본편)λ₯Ό λ“£κ³  μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.

μŠ€ν”„λ§μ˜ 탄생

EJB (Enterprise Java Beans)

  • 2000λ…„λŒ€ 초반, μžλ°” μ§„μ˜μ˜ ν‘œμ€€μœΌλ‘œ μ‚¬μš©λ˜λ˜ 기술
  • νŠΈλžœμž­μ…˜ μ„€μ •, λΆ„μ‚°κΈ°μˆ  λ“± 이둠 μƒμœΌλ‘œ 쒋은 점듀이 μžˆμ—ˆμ§€λ§Œ, λ³΅μž‘ν•˜κ³  EJB에 의쑴적인 μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Όν•˜λŠ” λ“± μž₯점을 λ„˜μ–΄μ„œλŠ” λ‹€μ–‘ν•œ 문제점이 μžˆμ—ˆμŒ

2002λ…„ λ‘œλ“œ 쑴슨 μ±… μΆœκ°„

  • EJB의 λ¬Έμ œμ μ„ μ§€μ ν•˜λ©°, EJB 없이도 μΆ©λΆ„νžˆ κ³ ν’ˆμ§ˆμ˜ ν™•μž₯ κ°€λŠ₯ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 μžˆμŒμ„ 보여주고, 30,000라인 μ΄μƒμ˜ 기반 κΈ°μˆ μ„ 예제 μ½”λ“œλ‘œ μ„ λ³΄μž„
  • μ±… μΆœκ°„ 직후 유겐 νœ λŸ¬μ™€ μ–€ μΉ΄λ‘œν”„κ°€ λ‘œλ“œ μ‘΄μŠ¨μ—κ²Œ μ˜€ν”ˆμ†ŒμŠ€ ν”„λ‘œμ νŠΈλ₯Ό μ œμ•ˆ
  • 전톡적인 J2EE(EJB)λΌλŠ” κ²¨μšΈμ„ λ„˜μ–΄ μƒˆλ‘œμš΄ μ‹œμž‘μ΄λΌλŠ” 뜻으둜 μŠ€ν”„λ§μ΄λΌλŠ” 이름을 λΆ™μž„

μŠ€ν”„λ§ 역사

  • 2003λ…„, μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ 1.0 μΆœμ‹œ - XML
  • 2006λ…„, μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ 2.0 μΆœμ‹œ - XML 편의 κΈ°λŠ₯ 지원
  • 2009λ…„, μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ 3.0 μΆœμ‹œ - μžλ°” μ½”λ“œλ‘œ μ„€μ •
  • 2013λ…„, μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ 4.0 μΆœμ‹œ - μžλ°”8
  • 2014λ…„, μŠ€ν”„λ§ λΆ€νŠΈ 1.0 μΆœμ‹œ
  • 2017λ…„, μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ 5.0, μŠ€ν”„λ§ λΆ€νŠΈ 2.0 μΆœμ‹œ - λ¦¬μ—‘ν‹°λΈŒ ν”„λ‘œκ·Έλž˜λ° 지원

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

μŠ€ν”„λ§μ€ 쒋은 객체 지ν–₯ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 있게 λ„μ™€μ£ΌλŠ” ν”„λ ˆμž„μ›Œν¬μ΄λ‹€.

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

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

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

  • 핡심 기술: μŠ€ν”„λ§ DI μ»¨ν…Œμ΄λ„ˆ, AOP, 이벀트, 기타
  • μ›Ή 기술: μŠ€ν”„λ§ MVC, μŠ€ν”„λ§ WebFlux
  • 데이터 μ ‘κ·Ό 기술: νŠΈλžœμž­μ…˜, JDBC, ORM 지원, XML 지원
  • 기술 톡합: μΊμ‹œ, 이메일, 원격접근, μŠ€μΌ€μ€„λ§
  • ν…ŒμŠ€νŠΈ: μŠ€ν”„λ§ 기반 ν…ŒμŠ€νŠΈ 지원
  • μ–Έμ–΄: μ½”ν‹€λ¦°, 그루비
  • μ΅œκ·Όμ—λŠ” μŠ€ν”„λ§ λΆ€νŠΈλ₯Ό ν†΅ν•΄μ„œ μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ˜ κΈ°μˆ λ“€μ„ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©

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

  • μŠ€ν”„λ§μ„ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ 지원, μ΅œκ·Όμ—λŠ” 기본으둜 μ‚¬μš©
  • λ‹¨λ…μœΌλ‘œ μ‹€ν–‰ν•  수 μžˆλŠ” μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‰½κ²Œ 생성
  • Tomcat 같은 μ›Ή μ„œλ²„λ₯Ό λ‚΄μž₯ν•΄μ„œ λ³„λ„μ˜ μ›Ή μ„œλ²„λ₯Ό μ„€μΉ˜ν•˜μ§€ μ•Šμ•„λ„ 됨
  • μ†μ‰¬μš΄ λΉŒλ“œ ꡬ성을 μœ„ν•œ starter 쒅속성 제곡
  • μŠ€ν”„λ§κ³Ό 3rd party 라이브러리 μžλ™ ꡬ성
  • μ™ΈλΆ€ 라이브러리 버전에 λŒ€ν•΄μ„œ κ³ λ―Όν•  ν•„μš”κ°€ μ—†μŒ
  • λ©”νŠΈλ¦­, μƒνƒœ 확인, μ™ΈλΆ€ ꡬ성 같은 ν”„λ‘œλ•μ…˜ μ€€λΉ„ κΈ°λŠ₯ 제곡
  • 관둀에 μ˜ν•œ κ°„κ²°ν•œ μ„€μ •

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

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

  • μžλ°” μ–Έμ–΄μ˜ λ‹€ν˜•μ„±μ„ ν™œμš©
    • μ—­ν•  = μΈν„°νŽ˜μ΄μŠ€
    • κ΅¬ν˜„ = μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀, κ΅¬ν˜„ 객체
  • 객체λ₯Ό 섀계할 λ•Œ μ—­ν• κ³Ό κ΅¬ν˜„μ„ λͺ…ν™•νžˆ 뢄리
  • 객체 μ„€κ³„μ‹œ 역할을 λ¨Όμ € λΆ€μ—¬ν•˜κ³ , κ·Έ 역할을 μˆ˜ν–‰ν•˜λŠ” κ΅¬ν˜„ 객체 λ§Œλ“€κΈ°
  • κ΅¬ν˜„λ³΄λ‹€ 역할이 μ€‘μš”

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

  • 혼자 μžˆλŠ” κ°μ²΄λŠ” μ—†λ‹€.
  • 수 λ§Žμ€ 객체 ν΄λΌμ΄μ–ΈνŠΈμ™€ 객체 μ„œλ²„λŠ” μ„œλ‘œ ν˜‘λ ₯ 관계λ₯Ό 가진닀.

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

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

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

  • λ‹€ν˜•μ„±μ΄ κ°€μž₯ μ€‘μš”ν•˜λ‹€!
  • μŠ€ν”„λ§μ€ λ‹€ν˜•μ„±μ„ κ·ΉλŒ€ν™”ν•΄μ„œ μ΄μš©ν•  수 있게 도와쀀닀.
  • μŠ€ν”„λ§μ—μ„œ μ΄μ•ΌκΈ°ν•˜λŠ” IoC, DIλŠ” λ‹€ν˜•μ„±μ„ ν™œμš©ν•΄μ„œ μ—­ν• κ³Ό κ΅¬ν˜„μ„ νŽΈλ¦¬ν•˜κ²Œ λ‹€λ£° 수 μžˆλ„λ‘ μ§€μ›ν•œλ‹€.

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

ν΄λ¦°μ½”λ“œλ‘œ 유λͺ…ν•œ λ‘œλ²„νŠΈ λ§ˆν‹΄μ΄ 쒋은 객체 지ν–₯ μ„€κ³„μ˜ 5가지 원칙을 정리

SRP 단일 μ±…μž„ 원칙

  • ν•œ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•Ό ν•œλ‹€.
  • ν•˜λ‚˜μ˜ μ±…μž„μ΄λΌλŠ” 것은 λͺ¨ν˜Έν•˜λ‹€.
    • 클 수 있고, μž‘μ„ 수 μžˆλ‹€.
    • λ¬Έλ§₯κ³Ό 상황에 따라 λ‹€λ₯΄λ‹€.
  • μ€‘μš”ν•œ 기쀀은 변경이닀.
    • 변경이 μžˆμ„ λ•Œ νŒŒκΈ‰ νš¨κ³Όκ°€ 적으면 단일 μ±…μž„ 원칙을 잘 λ”°λ₯Έ 것이닀.

OCP 개방-폐쇄 원칙

  • μ†Œν”„νŠΈμ›¨μ–΄ μš”μ†ŒλŠ” ν™•μž₯μ—λŠ” μ—΄λ €μžˆμœΌλ‚˜ λ³€κ²½μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€.
  • 문제점
    • κ΅¬ν˜„ 객체λ₯Ό λ³€κ²½ν•˜λ €λ©΄ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό λ³€κ²½ν•΄μ•Όν•œλ‹€.
    • λΆ„λͺ… λ‹€ν˜•μ„±μ„ μ‚¬μš©ν–ˆμ§€λ§Œ OCP 원칙을 지킬 수 μ—†λ‹€.
    • 객체λ₯Ό μƒμ„±ν•˜κ³ , 연관관계λ₯Ό λ§Ίμ–΄μ£ΌλŠ” λ³„λ„μ˜ 쑰립, μ„€μ •μžκ°€ ν•„μš”ν•˜λ‹€. => μŠ€ν”„λ§ DI μ»¨ν…Œμ΄λ„ˆ
MemberRepository memberRepository = new MemoryMemberRepository(); // κΈ°μ‘΄ μ½”λ“œ
MemberRepository memberRepository = new JdbcMemberRepository(); // λ³€κ²½ μ½”λ“œ

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

  • ν”„λ‘œκ·Έλž¨μ˜ κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ 정확성을 κΉ¨λœ¨λ¦¬μ§€ μ•ŠμœΌλ©΄μ„œ ν•˜μœ„ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ‘œ λ°”κΏ€ 수 μžˆμ–΄μ•Όν•œλ‹€.
  • λ‹¨μˆœνžˆ μ»΄νŒŒμΌμ— μ„±κ³΅ν•˜λŠ” 것을 λ„˜μ–΄μ„œλŠ” 이야기
  • 예λ₯Ό λ“€λ©΄,
    • μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€μ˜ 엑셀은 μ•žμœΌλ‘œ κ°€λΌλŠ” κΈ°λŠ₯
    • λ’€λ‘œκ°€κ²Œ κ΅¬ν˜„ν•˜λ©΄ LSP μœ„λ°˜
    • λŠλ¦¬λ”λΌλ„ μ•žμœΌλ‘œ κ°€μ•Όν•œλ‹€.

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

  • νŠΉμ • ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€ μ—¬λŸ¬ κ°œκ°€ λ²”μš© μΈν„°νŽ˜μ΄μŠ€ ν•˜λ‚˜λ³΄λ‹€ λ‚«λ‹€.
  • μΈν„°νŽ˜μ΄μŠ€κ°€ λͺ…확해지고, λŒ€μ²΄ κ°€λŠ₯성이 높아진닀.
  • 예λ₯Ό λ“€λ©΄,
    • μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€ -> μš΄μ „ μΈν„°νŽ˜μ΄μŠ€μ™€ μ •λΉ„ μΈν„°νŽ˜μ΄μŠ€λ‘œ 뢄리
    • μ‚¬μš©μž ν΄λΌμ΄μ–ΈνŠΈ -> μš΄μ „μž ν΄λΌμ΄μ–ΈνŠΈμ™€ 정비사 ν΄λΌμ΄μ–ΈνŠΈλ‘œ 뢄리

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

  • ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 좔상화에 μ˜μ‘΄ν•΄μ•Όμ§€, ꡬ체화에 μ˜μ‘΄ν•˜λ©΄ μ•ˆλœλ‹€.
  • μ˜μ‘΄μ„± μ£Όμž…μ€ 이 원칙을 λ”°λ₯΄λŠ” 방법 쀑 ν•˜λ‚˜λ‹€.
  • μ‰½κ²Œ μ΄μ•ΌκΈ°ν•΄μ„œ κ΅¬ν˜„ ν΄λž˜μŠ€μ— μ˜μ‘΄ν•˜μ§€ 말고, μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜λΌλŠ” 뜻
MemberRepository m = new MemoryMemberRepository(); // μΈν„°νŽ˜μ΄μŠ€μ™€ κ΅¬ν˜„ ν΄λž˜μŠ€μ— λ™μ‹œμ— μ˜μ‘΄ν•œλ‹€. => DIP μœ„λ°˜

정리

  • 객체 지ν–₯의 핡심은 λ‹€ν˜•μ„±
  • λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” OCP, DIPλ₯Ό 지킬 수 μ—†λ‹€.
  • μŠ€ν”„λ§μ€ μ˜μ‘΄μ„± μ£Όμž…(DI) 기술과 DI μ»¨ν…Œμ΄λ„ˆλ₯Ό 톡해 λ‹€ν˜•μ„± + OCP, DIPλ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.