πŸ“• Backend

[Spring] OOP 5κ°€μ§€ 섀계원칙

Dongwoongkim 2023. 1. 23. 21:12

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

  • 기본적으둜 μŠ€ν”„λ§μ΄λΌκ³  함은 μŠ€ν”„λ§ λΆ€νŠΈ, μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ 등을 λͺ¨λ‘ ν¬ν•¨ν•œ μŠ€ν”„λ§ μƒνƒœκ³„λ‘œ, 쒋은 객체 μ§€ν–₯ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 있게 λ„μ™€μ£ΌλŠ” ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€.

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

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

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

  • μŠ€ν”„λ§μ„ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ 지원, μ΅œκ·Όμ—λŠ” 기본으둜 μ‚¬μš©
  • λ‹¨λ…μœΌλ‘œ μ‹€ν–‰ν•  수 μžˆλŠ” μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‰½κ²Œ 생성
  • μŠ€ν”„λ§ λΆ€νŠΈλ₯Ό μ‚¬μš©ν•˜λ©΄ ν†°μΊ£ 같은 μ›Ήμ„œλ²„λ₯Ό λ‚΄μž₯ν•΄μ„œ λ³„λ„μ˜ μ›Ήμ„œλ²„λ₯Ό μ„€μΉ˜ν•  ν•„μš”κ°€ μ—†μŒ
  • μ†μ‰¬μš΄ λΉŒλ“œ ꡬ성을 μœ„ν•œ μŠ€νƒ€ν„° 쒅속성 제곡

 

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

 κ°μ²΄ μ§€ν–₯ νŠΉμ§•

  • 좔상화
  • μΊ‘μŠν™”
  • 상속
  • λ‹€ν˜•μ„±

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ ν”„λ‘œκ·Έλž¨μ„ μœ μ—°ν•˜κ³  변경이 μš©μ΄ν•˜κ²Œ λ§Œλ“€κΈ° λ•Œλ¬Έμ— λŒ€κ·œλͺ¨ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ— 많이 μ‚¬μš©λœλ‹€.

 

λ‹€ν˜•μ„±(Polymorphism)

μ—­ν• κ³Ό κ΅¬ν˜„μœΌλ‘œ κ΅¬λΆ„ν•˜λ©΄ μ΄ν•΄ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.

 

ν΄λΌμ΄μ–ΈνŠΈ(μš΄μ „μž)λŠ” λŒ€μƒμ˜ μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)만 μ•Œκ³ , κ΅¬ν˜„ λŒ€μƒ(객체)의 λ‚΄λΆ€ ꡬ쑰λ₯Ό μ•Œ ν•„μš” μ—†μŒ!

그리고 κ΅¬ν˜„ λŒ€μƒμ˜ 내뢀ꡬ쑰가 λ³€κ²½λ˜λ”λΌλ„ ν΄λΌμ΄μ–ΈνŠΈλŠ” 영ν–₯을 λ°›μ§€ μ•ŠμŒ.

+ κ΅¬ν˜„λŒ€μƒ 자체λ₯Ό 변경해도 영ν–₯을 λ°›μ§€ μ•ŠμŒ. ex) K3 -> Tesla

 

❗️ 객체 μ„€κ³„μ‹œ μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)을 λ¨Όμ € λΆ€μ—¬ν•˜κ³ , κ·Έ 역할을 μˆ˜ν–‰ν•˜λŠ” κ΅¬ν˜„ 객체 λ§Œλ“€κΈ°!

 

 

μž₯점

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

ν•œκ³„

  • λ§Œμ•½ μΈν„°νŽ˜μ΄μŠ€ 자체λ₯Ό λ³€κ²½ν•΄μ•Ό ν•˜λŠ” 경우, ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ λͺ¨λ‘μ— 큰 변경이 λ°œμƒν•©λ‹ˆλ‹€.

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

 

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

1. SRP (Single Responsibility Principle) / 단일 μ±…μž„ 원칙

  • ν•œ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„(λͺ©μ )만 κ°€μ Έμ•Ό ν•˜λ©° λ³€κ²½λ˜λŠ” μ΄μœ λ„ ν•˜λ‚˜μ—¬μ•Ό ν•œλ‹€. 
  • μ‰½κ²Œλ§ν•΄, 객체가 λ‹΄λ‹Ήν•˜λŠ” λ™μž‘μ΄ λ§Žμ•„μ§ˆμˆ˜λ‘ ν•΄λ‹Ή 객체의 변경에 λ”°λ₯Έ 영ν–₯λ„μ˜ μ–‘κ³Ό λ²”μœ„κ°€ 맀우 컀지기 λ•Œλ¬Έμ— νŠΉμ • 객체의 μ±…μž„ μ˜μ‘΄μ„± 과쀑을 μ΅œλŒ€ν•œ μ§€μ–‘ν•˜μžλŠ” 원칙

2. OCP (Open/Closed Principle) / 개방-폐쇄 원칙

  • λ³€κ²½μ—λŠ” λ‹«ν˜€μžˆκ³  ν™•μž₯μ—λŠ” μ—΄λ €μžˆμ–΄μ•Ό ν•œλ‹€.
  • κ΅¬ν˜„μ²΄μ— μ˜μ‘΄ν•˜κΈ°λ³΄λ‹€ μ •μ˜ν•œ 좔상화에 μ˜μ‘΄ν•˜λ„λ‘ μ½”λ“œλ₯Ό μž‘μ„± ν•œλ‹€.
  •  κ°œλ°©-폐쇄 원칙을 λ”°λ₯΄μ§€ μ•ŠλŠ”λ‹€κ³  ν•΄μ„œ 객체 μ§€ν–₯ μ–Έμ–΄(Java, C++ λ“±)을 κ΅¬ν˜„μ΄ λΆˆκ°€λŠ₯ν•œ 것은 μ•„λ‹ˆμ§€λ§Œ 이 원칙을 λ¬΄μ‹œν•˜κ³  ν”„λ‘œκ·Έλž˜λ°μ„ ν•œλ‹€λ©΄, 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ κ°€μž₯ 큰 μž₯점인 μœ μ—°μ„±, μž¬μ‚¬μš©μ„±, μœ μ§€λ³΄μˆ˜μ„± 등을 κ²°μ½” 얻을 수 μ—†λ‹€. 

문제점

MemberRepository m = new MemoryMemberRepository(); //κΈ°μ‘΄ μ½”λ“œ

MemberRepository m = new JdbcMemberRepository(); //λ³€κ²½ μ½”λ“œ

 

κ΅¬ν˜„ 객체λ₯Ό λ³€κ²½ν•˜λ €λ©΄ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό λ³€κ²½ν•΄μ•Ό ν•œλ‹€.
λΆ„λͺ… λ‹€ν˜•μ„±μ„ μ‚¬μš©ν–ˆμ§€λ§Œ OCP 원칙을 지킬 수 μ—†λ‹€. (λ³€κ²½γ„΄γ„΄ ν™•μž₯ γ„±γ„±) 


이 문제λ₯Ό μ–΄λ–»κ²Œ ν•΄κ²°ν•΄μ•Ό ν• κΉŒ?

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

 

3. LSP (Liskov substitution principle) / λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙

  • ν”„λ‘œκ·Έλž¨μ˜ κ°μ²΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ 정확성을 κΉ¨λœ¨λ¦¬μ§€ μ•ŠμœΌλ©΄μ„œ ν•˜μœ„ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ‘œ λ°”κΏ€ 수 μžˆμ–΄μ•Ό ν•œλ‹€
  • λ‹€ν˜•μ„±μ—μ„œ ν•˜μœ„ ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€ κ·œμ•½μ„ λ‹€ μ§€μΌœμ•Ό ν•œλ‹€λŠ” 것, λ‹€ν˜•μ„±μ„ μ§€μ›ν•˜κΈ° μœ„ν•œ 원칙, μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ κ΅¬ν˜„μ²΄λŠ” λ―Ώκ³  μ‚¬μš©ν•˜λ €λ©΄, 이 원칙이 ν•„μš”ν•˜λ‹€.

예) μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€μ˜ 엑셀은 μ•žμœΌλ‘œ κ°€λΌλŠ” κΈ°λŠ₯, λ’€λ‘œ κ°€κ²Œ κ΅¬ν˜„ν•˜λ©΄ LSP μœ„λ°˜, λŠλ¦¬λ”λΌλ„ μ•žμœΌλ‘œ 가야함

 

4. ISP (Interface Segregation Principle) / μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙

  • νŠΉμ • ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€ μ—¬λŸ¬ κ°œκ°€ λ²”μš© μΈν„°νŽ˜μ΄μŠ€ ν•œ 개 보닀 λ‚«λ‹€λŠ” 원칙
  • μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€ -> μš΄μ „, μ •λΉ„ μΈν„°νŽ˜μ΄μŠ€λ‘œ 뢄리
  • μ‚¬μš©μž ν΄λΌμ΄μ–ΈνŠΈ -> μš΄μ „μž, 정비사 ν΄λΌμ΄μ–ΈνŠΈλ‘œ 뢄리
  • μ΄λ ‡κ²Œ λΆ„λ¦¬ν•˜λ©΄ μ •λΉ„ μΈν„°νŽ˜μ΄μŠ€ μžμ²΄κ°€ 변해도 μš΄μ „μž ν΄λΌμ΄μ–ΈνŠΈμ— 영ν–₯을 μ£Όμ§€ μ•ŠμŒ

                -> μΈν„°νŽ˜μ΄μŠ€κ°€ λͺ…ν™•ν•΄μ§€κ³  λŒ€μ²΄ κ°€λŠ₯성이 λ†’μ•„μ§„λ‹€.

 

5. DIP (Dependency Inversion Principle) / μ˜μ‘΄κ΄€κ³„ 역전원칙

  • ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 좔상화에 μ˜μ‘΄ν•˜κ³ , ꡬ체화에 μ˜μ‘΄ν•˜λ©΄ μ•ˆλœλ‹€λŠ” 원칙
  • μ‰½κ²Œλ§ν•΄, κ΅¬ν˜„ ν΄λž˜μŠ€μ— μ˜μ‘΄ν•˜μ§€ 말고, μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜λΌλŠ” 뜻
  • μ•žμ„œ μ΄μ•ΌκΈ°ν•œ 역할에 μ˜μ‘΄ν•˜κ²Œ ν•΄μ•Όν•œλ‹€λŠ” 것과 κ°™λ‹€. μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•΄μ•Ό μœ μ—°ν•˜κ²Œ κ΅¬ν˜„μ²΄λ₯Ό λ³€κ²½ν•  수 μžˆλ‹€.
  • κ΅¬ν˜„μ²΄μ— μ˜μ‘΄ν•˜κ²Œ 되면 변경이 μ–΄λ €μ›Œμ§.

문제점

그런데 OCPμ—μ„œ μ„€λͺ…ν•œ MemberServiceλŠ” μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜μ§€λ§Œ, κ΅¬ν˜„ ν΄λž˜μŠ€λ„ λ™μ‹œμ— μ˜μ‘΄ν•œλ‹€.

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

MemberRepository m = new MemoryMemberRepository(); DIP μœ„λ°˜

μ •λ¦¬ν•˜μžλ©΄, 

객체 μ§€ν–₯의 핡심은 λ‹€ν˜•μ„±μΈλ°,

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

> 즉, λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” OCP, DIPλ₯Ό 지킬 수 μ—†λ‹€.

> 무언가 더 ν•„μš”ν•œ 상황.

 

λ‹€μ‹œ μŠ€ν”„λ§μœΌλ‘œ κ°€λ΄…μ‹œλ‹€.

μŠ€ν”„λ§μ€ λ‹€μŒ 기술둜 λ‹€ν˜•μ„± + OCP, DIPλ₯Ό κ°€λŠ₯ν•˜κ²Œ μ§€μ›ν•΄μ€λ‹ˆλ‹€.

          - DI : μ˜μ‘΄κ΄€κ³„, μ˜μ‘΄μ„± μ£Όμž…

          - DI μ»¨ν…Œμ΄λ„ˆ 제곡

λ²ˆμ™Έλ‘œ DI κ°œλ…μ€ 말둜 μ„€λͺ…해도 이해가 잘 μ•ˆλœλ‹€. μ½”λ“œλ‘œ μ§œλ΄μ•Ό ν•„μš”μ„±μ„ μ•Œκ²Œ λœλ‹€.

  • ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ˜ λ³€κ²½ 없이 κΈ°λŠ₯ ν™•μž₯

μ‹€λ¬΄μ—μ„œλŠ”

  • λͺ¨λ“  섀계에 μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)κ³Ό κ΅¬ν˜„(객체)λ₯Ό λΆ„λ¦¬ν•˜μž.
  • ν•˜μ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ„μž…ν•˜λ©΄ μΆ”μƒν™”λΌλŠ” λΉ„μš©μ΄ λ°œμƒν•œλ‹€. λ§Œμ•½μ— κΈ°λŠ₯을 ν™•μž₯ν•  κ°€λŠ₯성이 μ—†λ‹€λ©΄, κ΅¬ν˜„μ²΄ 클래슀λ₯Ό μ§μ ‘μ‚¬μš©ν•˜κ³ , ν–₯ν›„ κΌ­ ν•„μš”ν•  λ•Œ λ¦¬νŽ™ν„°λ§ν•΄μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ„μž…ν•˜λŠ” 것도 방법이닀.

<참고 자료>

 

μŠ€ν”„λ§ 핡심 원리 - 기본편 - μΈν”„λŸ° | κ°•μ˜

μŠ€ν”„λ§ μž…λ¬Έμžκ°€ 예제λ₯Ό λ§Œλ“€μ–΄κ°€λ©΄μ„œ μŠ€ν”„λ§μ˜ 핡심 원리λ₯Ό μ΄ν•΄ν•˜κ³ , μŠ€ν”„λ§ κΈ°λ³ΈκΈ°λ₯Ό ν™•μ‹€νžˆ λ‹€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€., - κ°•μ˜ μ†Œκ°œ | μΈν”„λŸ°...

www.inflearn.com

 

개방-폐쇄 원칙 - μœ„ν‚€λ°±κ³Ό, 우리 λͺ¨λ‘μ˜ 백과사전

μœ„ν‚€λ°±κ³Ό, 우리 λͺ¨λ‘μ˜ 백과사전. 개방-폐쇄 원칙(OCP, Open-Closed Principle)은 'μ†Œν”„νŠΈμ›¨μ–΄ 개체(클래슀, λͺ¨λ“ˆ, ν•¨μˆ˜ λ“±λ“±)λŠ” ν™•μž₯에 λŒ€ν•΄ μ—΄λ € μžˆμ–΄μ•Ό ν•˜κ³ , μˆ˜μ •μ— λŒ€ν•΄μ„œλŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€'λŠ” ν”„

ko.wikipedia.org

 

[OOP] πŸ’  μ™„λ²½ν•˜κ²Œ μ΄ν•΄ν•˜λŠ” OCP (개방 폐쇄 원칙)

개방 폐쇄 원칙 - OCP (Open Closed Principle) 개방 νμ‡„μ˜ 원칙(OCP)μ΄λž€ 기쑴의 μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ, κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆλ„λ‘ 섀계가 λ˜μ–΄μ•Ό ν•œλ‹€λŠ” 원칙을 λ§ν•œλ‹€. 보톡 OCPλ₯Ό ν™•μž₯에 λŒ€ν•΄μ„œλŠ”

inpa.tistory.com