Spring

μŠ€ν”„λ§μ΄λž€?, SOLID, IoC, DI, μ»¨ν…Œμ΄λ„ˆ

쑰밈밍 2022. 3. 24. 15:41

πŸ”Ή μŠ€ν”„λ§ 

: μžλ°” μ–Έμ–΄ 기반의 ν”„λ ˆμž„μ›Œν¬

☞ ν”„λ ˆμž„μ›Œν¬ 

    μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 개발 ν•˜λŠ”λ° μžˆμ–΄ 기본적으둜 ν•„μš”ν•œ ꡬ쑰와 ꡬ성을 κ°–μΆ”κ³  μžˆμ–΄ κ°œλ°œμžκ°€ κΈ°λŠ₯ κ΅¬ν˜„μ— 집쀑할 수 μžˆλ„λ‘ ν•œλ‹€.

    μ΄κ²ƒλ§ŒμœΌλ‘œ ν”„λ‘œκ·Έλž¨μ΄ λ™μž‘ν•˜λŠ”κ²ƒμ΄ μ•„λ‹ˆλΌ λΌˆλŒ€λ₯Ό μ œκ³΅ν•˜κ³  κ·Έ μœ„μ— κ°œλ°œμžκ°€ μ½”λ“œλ₯Ό 올렀 λ™μž‘ν•˜κ²Œν•œλ‹€.

    ν”„λ ˆμž„μ›Œν¬κ°€ μ œκ³΅ν•˜λŠ” λΌˆλŒ€μ™€ κ°€μ΄λ“œμ— 맞게 μ„€κ³„ν•˜κ³  κ°œλ°œν•¨μœΌλ‘œμ¨ μ‹œμŠ€ν…œμ˜ 톡합, 일관성을 μœ μ§€ν•  수 있게 λœλ‹€.

 

: μžλ°” μ–Έμ–΄μ˜ κ°€μž₯ 큰 νŠΉμ§• - 객체 지ν–₯ μ–Έμ–΄

: 객체 지ν–₯ μ–Έμ–΄κ°€ 가진 κ°•λ ₯ν•œ νŠΉμ§•μ„ μ‚΄λ €λ‚΄λŠ” ν”„λ ˆμž„μ›Œν¬

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

: λ‹€ν˜•μ„±μ„ κ·ΉλŒ€ν™”ν•΄μ„œ μ΄μš©ν•  수 있게 도와쀀닀

: μ œμ–΄μ˜ μ—­μ „(IoC), μ˜μ‘΄κ΄€κ³„ μ£Όμž…(DI)은 λ‹€ν˜•μ„±μ„ ν™œμš©ν•΄μ„œ μ—­ν• κ³Ό κ΅¬ν˜„μ„ νŽΈλ¦¬ν•˜κ²Œ λ‹€λ£° 수 μžˆλ„λ‘ μ§€μ›ν•œλ‹€

: μŠ€ν”„λ§μ„ μ‚¬μš©ν•˜λ©΄ 마치 레고 λΈ”λŸ­ μ‘°λ¦½ν•˜λ“―μ΄! 곡연 λ¬΄λŒ€μ˜ 배우λ₯Ό μ„ νƒν•˜λ“―μ΄! κ΅¬ν˜„μ„ νŽΈλ¦¬ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ‹€

 

πŸ”Ή 객체 지ν–₯ νŠΉμ§•

: 좔상화

: μΊ‘μŠν™”

: 상속

: λ‹€ν˜•μ„±

☞ 객체 μ„€κ³„ν• λ•Œ μ—­ν• κ³Ό κ΅¬ν˜„μœΌλ‘œ ꡬ뢄 -> λ‹¨μˆœν•΄μ§€κ³  μœ μ—°ν•΄μ§€λ©° 변경도 νŽΈλ¦¬ν•΄μ§„λ‹€.

                                                    -> ν΄λΌμ΄μ–ΈνŠΈλŠ” λŒ€μƒμ˜ μ—­ν• (μΈν„°νŽ˜μ΄μŠ€)만 μ•Œλ©΄ λœλ‹€. 

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

 

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

: 컴퓨터 ν”„λ‘œκ·Έλž¨μ„ λͺ…λ Ήμ–΄μ˜ λͺ©λ‘μœΌλ‘œ λ³΄λŠ” μ‹œκ°μ—μ„œ λ²—μ–΄λ‚˜ μ—¬λŸ¬κ°œμ˜ λ…λ¦½λœ λ‹¨μœ„,

  즉 "객체"λ“€μ˜ λͺ¨μž„μœΌλ‘œ νŒŒμ•…ν•˜κ³ μž ν•˜λŠ” 것 

: 각각의 κ°μ²΄λŠ” λ©”μ‹œμ§€λ₯Ό μ£Όκ³ λ°›κ³ , 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€

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

 

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

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

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

- LSP : λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙 (Liskov Substitution Principle)

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

- DIP : μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙 (Dependency Inversion Principle)

 

πŸ”Έ SRP 단일 μ±…μž„ 원칙

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

: μ€‘μš”ν•œ 기쀀은 변경이닀, 변경이 μžˆμ„ λ•Œ νŒŒκΈ‰ νš¨κ³Όκ°€ 적으면 단일 μ±…μž„ 원칙을 잘 λ”°λ₯Έ 것

ex) UI λ³€κ²½, 객체의 생성과 μ‚¬μš©μ„ 뢄리

 

πŸ”Έ OCP 개방-폐쇄 μ›μΉ™βœ¨

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

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

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

 

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

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

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

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

 

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

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

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

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

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

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

 

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

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

: 역할에 μ˜μ‘΄ν•˜κ²Œ ν•΄μ•Όν•œλ‹€

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

 

=> 정리

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

: λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” μ‰½κ²Œ λΆ€ν’ˆμ„ κ°ˆμ•„ λΌμš°λ“―μ΄ κ°œλ°œν•  수 μ—†λ‹€

: λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” κ΅¬ν˜„ 객체λ₯Ό λ³€κ²½ν•  λ•Œ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ„ ν•¨κ»˜ λ³€κ²½λœλ‹€

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

: λ­”κ°€ 더 ν•„μš”ν•˜λ‹€

 

πŸ”Ή μŠ€ν”„λ§

: μŠ€ν”„λ§μ€ λ‹€μŒ 기술둜 λ‹€ν˜•μ„± + OCP,DIP λ₯Ό κ°€λŠ₯ν•˜κ²Œ 지원

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

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

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

: μ‰½κ²Œ λΆ€ν’ˆμ„ κ΅μ²΄ν•˜λ“―μ΄ 개발

 

=> 총정리

: λͺ¨λ“  섀계에 μ—­ν• κ³Ό κ΅¬ν˜„μ„ λΆ„λ¦¬ν•˜μž

: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 섀계 λ˜ν•œ 곡연을 섀계 ν•˜λ“―μ΄ λ°°μ—­λ§Œ λ§Œλ“€μ–΄λ‘κ³ ,

  λ°°μš°λŠ” μ–Έμ œλ“ μ§€ μœ μ—°ν•˜κ²Œ λ³€κ²½ν•  수 μžˆλ„λ‘ λ§Œλ“œλŠ” 것이 쒋은 객체 지ν–₯ 섀계닀

: μ΄μƒμ μœΌλ‘œλŠ” λͺ¨λ“  섀계에 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λΆ€μ—¬ν•˜μž

 


 

πŸ”Ή μ œμ–΄μ˜ μ—­μ „ IoC (Inversion of Control)

: ν”„λ‘œκ·Έλž¨μ˜ μ œμ–΄ 흐름을 직접 μ œμ–΄ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ™ΈλΆ€μ—μ„œ κ΄€λ¦¬ν•˜λŠ” 것을 μ œμ–΄μ˜ μ—­μ „ IoC라고 ν•œλ‹€

ex) AppConfig <- μ–΄λ–€ 객체듀이 μ‚¬μš©λ  것인지 생성 & μ—°κ²° λ‹΄λ‹Ή

 

πŸ”Έ ν”„λ ˆμž„μ›Œν¬ vs 라이브러리

: λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œλ₯Ό μ œμ–΄ν•˜κ³ , λŒ€μ‹  μ‹€ν–‰ν•˜λ©΄ => 그것은 ν”„λ ˆμž„μ›Œν¬ (JUnit)

: λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œκ°€ 직접 μ œμ–΄μ˜ 흐름을 λ‹΄λ‹Ήν•œλ‹€λ©΄ => 라이브러리

 

πŸ”Ή μ˜μ‘΄κ΄€κ³„ μ£Όμž… DI (Dependency Injection)

: 정적인 클래슀 μ˜μ‘΄κ΄€κ³„ / μ‹€ν–‰μ‹œμ μ— κ²°μ •λ˜λŠ” 객체(μΈμŠ€ν„΄μŠ€) μ˜μ‘΄κ΄€κ³„ λ‘˜μ„ λΆ„λ¦¬ν•΄μ„œ 생각해야 ν•œλ‹€

 

πŸ”Έ 정적인 클래슀 μ˜μ‘΄κ΄€κ³„

: ν΄λž˜μŠ€κ°€ μ‚¬μš©ν•˜λŠ” import μ½”λ“œλ§Œ 보고 μ˜μ‘΄κ΄€κ³„λ₯Ό μ‰½κ²Œ νŒλ‹¨ν•  수 μžˆλ‹€

: μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜μ§€ μ•Šμ•„λ„ 뢄석할 수 μžˆλ‹€

 

πŸ”Έ 동적인 객체 μΈμŠ€ν„΄μŠ€ μ˜μ‘΄κ΄€κ³„

: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ μ‹œμ μ— μ‹€μ œ μƒμ„±λœ 객체 μΈμŠ€ν„΄μŠ€μ˜ μ°Έμ‘°κ°€ μ—°κ²°λœ 의쑴 관계닀

* μ‹€ν–‰μ‹œμ (λŸ°νƒ€μž„)에 μ™ΈλΆ€μ—μ„œ μ‹€μ œ κ΅¬ν˜„ 객체λ₯Ό μƒμ„±ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈμ— μ „λ‹¬ν•΄μ„œ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ˜ μ‹€μ œ μ˜μ‘΄κ΄€κ³„    κ°€ μ—°κ²°λ˜λŠ” 것을 "μ˜μ‘΄κ΄€κ³„ μ£Όμž…"이라 ν•œλ‹€

: 객체 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³ , κ·Έ 참쑰값을 μ „λ‹¬ν•΄μ„œ μ—°κ²°λœλ‹€

: μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ„ μ‚¬μš©ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό 바꾸지 μ•Šκ³ , ν΄λΌμ΄μ–ΈνŠΈκ°€ ν˜ΈμΆœν•˜λŠ” λŒ€μƒμ˜ νƒ€μž… μΈμŠ€ν„΄μŠ€ λ³€κ²½ κ°€λŠ₯

: λ˜ν•œ, 정적인 클래슀 μ˜μ‘΄κ΄€κ³„λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ , 동적인 객체 μΈμŠ€ν„΄μŠ€ μ˜μ‘΄κ΄€κ³„λ₯Ό μ‰½κ²Œ λ³€κ²½ν•  수 μžˆλ‹€

 

πŸ”Ή IoC μ»¨ν…Œμ΄λ„ˆ, DI μ»¨ν…Œμ΄λ„ˆ

: AppConfig처럼 객체λ₯Ό μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λ©΄μ„œ μ˜μ‘΄κ΄€κ³„λ₯Ό μ—°κ²°ν•΄ μ£ΌλŠ” 것

: 주둜 DIμ»¨ν…Œμ΄λ„ˆ == μ–΄μƒ˜λΈ”λŸ¬, 였브젝트 νŒ©ν† λ¦¬