Spring

Spring FrameWork

yjdat 2022. 9. 29. 13:51

πŸ” λͺ©μ°¨

- Spring μ΄λž€?
- FrameWork?
- Spring νŠΉμ§•


πŸ”Ά Spring μ΄λž€?

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬(Spring framework)λŠ” μžλ°” ν”Œλž«νΌμ„ μœ„ν•œ μ˜€ν”ˆ μ†ŒμŠ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬λ‘œμ„œ κ°„λ‹¨νžˆ μŠ€ν”„λ§(Spring)이라고도 ν•œλ‹€. [μžλ°”κΈ°λ°˜μ˜ μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§Œλ“€ 수 μžˆλŠ” ν”„λ ˆμž„μ›Œν¬]

동적인 μ›Ή μ‚¬μ΄νŠΈλ₯Ό κ°œλ°œν•˜κΈ° μœ„ν•œ μ—¬λŸ¬ κ°€μ§€ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜κ³  μžˆλ‹€. λŒ€ν•œλ―Όκ΅­ κ³΅κ³΅κΈ°κ°„μ˜ μ›Ή μ„œλΉ„μŠ€ 개발 μ‹œ μ‚¬μš©μ„ ꢌμž₯ν•˜κ³  μžˆλŠ” μ „μžμ •λΆ€ ν”„λ ˆμž„μ›Œν¬μ˜ 기반 κΈ°μˆ λ‘œμ„œ 쓰이고 μžˆμŠ΅λ‹ˆλ‹€.

 

 

πŸ”Ά FrameWork (ν”„λ ˆμž„μ›Œν¬)

ν”„λ ˆμž„μ›Œν¬λŠ” μ–΄λ– ν•œ λͺ©μ μ„ λ‹¬μ„±ν•˜κΈ° μœ„ν•΄ λ³΅μž‘ν•˜κ²Œ μ–½ν˜€μžˆλŠ” 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ ꡬ쑰이며, μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ— μžˆμ–΄ ν•˜λ‚˜μ˜ λΌˆλŒ€, 골격 μ½”λ“œ 역할을 ν•©λ‹ˆλ‹€.

이λ₯Ό μžλ™μ°¨λ‘œ λΉ„μœ ν•œλ‹€λ©΄, ν”„λ ˆμž„μ›Œν¬λŠ” 이미 μ œμž‘λœ μžλ™μ°¨μ˜ ν”„λ ˆμž„μœΌλ‘œ λΉ„μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

βœ¨μ‚¬μš© 이유)

개발자의 μŠ€νƒ€μΌμ— 따라 결과물이 λ‹¬λΌμ§‘λ‹ˆλ‹€. μ—¬λŸ¬ λͺ…μ˜ κ°œλ°œμžλ“€μ˜ 곡동 μž‘μ—…μ„ μ§„ν–‰ν•  경우 λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€. μ—¬λŸ¬ λͺ…λ“€μ˜ 개발 μŠ€νƒ€μΌμ΄ λ‹€λ₯΄κ±°λ‚˜, 개발 μ—­λŸ‰ 차이가 클 경우 μ΄ν•΄ν•˜κΈ° νž˜λ“  κ²½μš°κ°€ λ°œμƒν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²° ν•˜κΈ° μœ„ν•΄ 개발 ν‘œμ€€ κ°€μ΄λ“œλ₯Ό μ •μ˜ν•˜κ³  ν‘œμ€€μ— λ§ŸμΆ”μ–΄ 개발 λ©λ‹ˆλ‹€.

✨ μž₯점

체계적인 μ½”λ“œ κ΄€λ¦¬λ‘œ μœ μ§€ λ³΄μˆ˜κ°€ μš©μ΄ν•˜λ‹€.

κΈ°λ³Έ 섀계 및 κΈ°λŠ₯ 라이브러리λ₯Ό μ œκ³΅ν•˜μ—¬ 개발 생산성이 λ†’λ‹€.

κ²€μ¦λœ μ•„ν‚€ν…μ²˜μ˜ 재 μ‚¬μš©κ³Ό 일관성 μœ μ§€

✨ 단점

λ§Žμ€ κΈ°λŠ₯을 μ œκ³΅λ˜λŠ” κΈ°λŠ₯ 만큼 ν”„λ‘œμ νŠΈ μš©λŸ‰μ΄ μ¦κ°€ν•˜κ²Œ λœλ‹€.

λ§Žμ€ κΈ°λŠ₯듀을 ν™œμš©ν•˜κΈ° μœ„ν•΄ ν•™μŠ΅ν•˜λŠ” λ§Žμ€ λ…Έλ ₯κ³Ό μ‹œκ°„μ΄ ν•„μš”ν•˜λ‹€.

자유둜운 κ°œλ°œμ— ν•œκ³„κ°€ μžˆλ‹€.

 

πŸ”Ά νŠΉμ§•

κ²½λŸ‰ μ»¨ν…Œμ΄λ„ˆλ‘œμ„œ μžλ°” 객체λ₯Ό 직접 κ΄€λ¦¬ν•©λ‹ˆλ‹€. 각각의 객체 생성, μ†Œλ©Έκ³Ό 같은 라이프 사이클을 κ΄€λ¦¬ν•˜λ©° μŠ€ν”„λ§μœΌλ‘œλΆ€ν„° ν•„μš”ν•œ 객체λ₯Ό μ–»μ–΄μ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

μžλ°”μ™€ λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ„ 관리해주고, WASκ°€ λ‚΄μž₯λ˜μ–΄ μžˆμ–΄ μžλ°” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ꡬ동 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Ž POJO

μŠ€ν”„λ§μ€ Plain Old Java Object λ°©μ‹μ˜ ν”„λ ˆμž„μ›Œν¬μ΄λ‹€. 일반적인 J2EE ν”„λ ˆμž„μ›Œν¬μ— λΉ„ν•΄ κ΅¬ν˜„μ„ μœ„ν•΄ νŠΉμ •ν•œ Interfaceλ₯Ό κ΅¬ν˜„ν•˜κ±°λ‚˜ 상속을 받을 ν•„μš”κ°€ μ—†μ–΄ 기쑴에 μ‘΄μž¬ν•˜λŠ” 라이브러리 등을 μ§€μ›ν•˜κΈ°μ— μš©μ΄ν•˜κ³  객체가 가볍닀.

*Plain Old Java Object, κ°„λ‹¨νžˆ POJOλŠ” 말 κ·ΈλŒ€λ‘œ 였래된 λ°©μ‹μ˜ κ°„λ‹¨ν•œ μžλ°” μ˜€λΈŒμ νŠΈλΌλŠ” 말이닀.

Java EE λ“±μ˜ μ€‘λŸ‰ ν”„λ ˆμž„μ›Œν¬λ“€μ„ μ‚¬μš©ν•˜κ²Œ λ˜λ©΄μ„œ ν•΄λ‹Ή ν”„λ ˆμž„μ›Œν¬μ— μ’…μ†λœ “무거운” 객체λ₯Ό λ§Œλ“€κ²Œ 된 것에 λ°˜λ°œν•΄μ„œ μ‚¬μš©ν•˜κ²Œ 된 μš©μ–΄μ΄λ‹€.

πŸ“Ž IoC : Inversion of Control

μŠ€ν”„λ§μ€ μ œμ–΄ λ°˜μ „(IoC : Inversion of Control)λ₯Ό μ§€μ›ν•œλ‹€. 컨트둀의 μ œμ–΄κΆŒμ΄ μ‚¬μš©μžκ°€ μ•„λ‹ˆλΌ ν”„λ ˆμž„μ›Œν¬μ— μžˆμ–΄μ„œ ν•„μš”μ— 따라 μŠ€ν”„λ§μ—μ„œ μ‚¬μš©μžμ˜ μ½”λ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

μ œμ–΄ λ°˜μ „, μ œμ–΄μ˜ λ°˜μ „, μ—­ μ œμ–΄λŠ” ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μž‘μ„±ν•œ ν”„λ‘œκ·Έλž¨μ΄ 재 μ‚¬μš© 라이브러리의 흐름 μ œμ–΄λ₯Ό λ°›κ²Œ λ˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄ λ””μžμΈ νŒ¨ν„΄μ„ λ§ν•œλ‹€. μ€„μ—¬μ„œ IoC(Inversion of Control)이라고 λΆ€λ¦…λ‹ˆλ‹€.

전톡적인 ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 흐름은 ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μž‘μ„±ν•œ ν”„λ‘œκ·Έλž¨μ΄ μ™ΈλΆ€ 라이브러리의 μ½”λ“œλ₯Ό ν˜ΈμΆœν•΄ μ΄μš©ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ œμ–΄ λ°˜μ „μ΄ 적용된 κ΅¬μ‘°μ—μ„œλŠ” μ™ΈλΆ€ 라이브러리의 μ½”λ“œκ°€ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μž‘μ„±ν•œ μ½”λ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. 섀계 λͺ©μ  상 μ œμ–΄ λ°˜μ „μ˜ λͺ©μ μ€ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

  • μž‘μ—…μ„ κ΅¬ν˜„ν•˜λŠ” 방식과 μž‘μ—… μˆ˜ν–‰ 자체λ₯Ό 뢄리
  • λͺ¨λ“ˆμ„ μ œμž‘ν•  λ•Œ, λͺ¨λ“ˆκ³Ό μ™ΈλΆ€ ν”„λ‘œκ·Έλž¨μ˜ 결합에 λŒ€ν•΄ κ³ λ―Όν•  ν•„μš” 없이 λͺ¨λ“ˆμ˜ λͺ©μ μ— 집쀑할 수 있음
  • λ‹€λ₯Έ μ‹œμŠ€ν…œμ΄ μ–΄λ–»κ²Œ λ™μž‘ ν•  지에 λŒ€ν•΄ κ³ λ―Όν•  ν•„μš” 없이, 미리 μ •ν•΄μ§„ ν˜‘μ•½λŒ€λ‘œλ§Œ λ™μž‘
  • λͺ¨λ“ˆμ„ 바꾸어도 λ‹€λ₯Έ μ‹œμŠ€ν…œμ— λΆ€μž‘μš©μ΄ μ—†μŒ

πŸ“Ž μ˜μ‘΄μ„± μ£Όμž…

μŠ€ν”„λ§μ€ μ˜μ‘΄μ„± μ£Όμž…(DI : Dependency Injection)을 μ§€μ›ν•©λ‹ˆλ‹€. 각각의 κ³„μΈ΅μ΄λ‚˜ μ„œλΉ„μŠ€λ“€ 간에 μ˜μ‘΄μ„±μ΄ μ‘΄μž¬ν•  경우 ν”„λ ˆμž„μ›Œν¬κ°€ μ„œλ‘œ μ—°κ²° μ‹œμΌœμ€λ‹ˆλ‹€.

*μ˜μ‘΄μ„± μ£Όμž…(Dependency Injection)은 ν•˜λ‚˜μ˜ 객체가 λ‹€λ₯Έ 객체의 μ˜μ‘΄μ„±μ„ μ œκ³΅ν•˜λŠ” ν…Œν¬λ‹‰μ΄λ‹€.

“μ˜μ‘΄μ„±”은 μ„œλΉ„μŠ€λ‘œ μ‚¬μš©ν•  수 μžˆλŠ” 객체둜 μƒκ°ν•˜μž.

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ–΄λ–€ μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•  것인지 μ§€μ •ν•˜λŠ” λŒ€μ‹ , ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 무슨 μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•  것 인지λ₯Ό λ§ν•΄μ£ΌλŠ” 것이닀. “μ£Όμž…”은 μ˜μ‘΄μ„±(μ„œλΉ„μŠ€)λ₯Ό μ‚¬μš©ν•˜λ €λŠ” 객체(ν΄λΌμ΄μ–ΈνŠΈ)둜 μ „λ‹¬λ˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

μ„œλΉ„μŠ€λŠ” ν΄λΌμ΄μ–ΈνŠΈ μƒνƒœμ˜ 일뢀이닀. ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλΉ„μŠ€λ₯Ό κ΅¬μΆ•ν•˜κ±°λ‚˜ μ°ΎλŠ” 것을 ν—ˆμš©ν•˜λŠ” λŒ€μ‹  ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ„œλΉ„μŠ€λ₯Ό μ „λ‹¬ν•˜λŠ” 것이 νŒ¨ν„΄μ˜ κΈ°λ³Έ μš”κ±΄μž…λ‹ˆλ‹€.

μ˜μ‘΄μ„± μ£Όμž…μ˜ μ˜λ„λŠ” 객체의 생성과 μ‚¬μš©μ˜ 관심을 λΆ„λ¦¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” 가독성과 μ½”λ“œ μž¬μ‚¬μš©μ„ λ†’ν˜€μ€λ‹ˆλ‹€.

μ˜μ‘΄μ„± μ£Όμž…μ€ κ΄‘λ²”μœ„ν•œ μ—­μ œμ–΄ ν…Œν¬λ‹‰μ˜ ν•œ ν˜•νƒœμ΄λ‹€. μ–΄λ–€ μ„œλΉ„μŠ€λ₯Ό ν˜ΈμΆœν•˜λ €λŠ” ν΄λΌμ΄μ–ΈνŠΈλŠ” κ·Έ μ„œλΉ„μŠ€κ°€ μ–΄λ–»κ²Œ κ΅¬μ„±λ˜μ—ˆλŠ”μ§€ μ•Œμ§€ λͺ»ν•΄μ•Ό ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” λŒ€μ‹  μ„œλΉ„μŠ€ μ œκ³΅μ— λŒ€ν•œ μ±…μž„μ„ μ™ΈλΆ€ μ½”λ“œ(μ£Όμž…μž)둜 μœ„μž„ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” μ£Όμž…μž μ½”λ“œλ₯Ό ν˜ΈμΆœν•  수 μ—†λ‹€. κ·Έ λ‹€μŒ, μ£Όμž…μžλŠ” 이미 μ‘΄μž¬ν•˜κ±°λ‚˜ μ£Όμž…μžμ— μ˜ν•΄ κ΅¬μ„±λ˜μ—ˆμ„ μ„œλΉ„μŠ€λ₯Ό ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ£Όμž…(전달)ν•œλ‹€. 그리고 λ‚˜μ„œ ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•œλ‹€. μ΄λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ£Όμž…μžμ™€ μ„œλΉ„μŠ€ ꡬ성 방식 λ˜λŠ” μ‚¬μš©μ€‘μΈ μ‹€μ œ μ„œλΉ„μŠ€μ— λŒ€ν•΄ μ•Œ ν•„μš”κ°€ μ—†μŒμ„ μ˜λ―Έν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλΉ„μŠ€μ˜ μ‚¬μš© 방식을 μ •μ˜ν•˜κ³  μžˆλŠ” μ„œλΉ„μŠ€μ˜ κ³ μœ ν•œ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•΄μ„œλ§Œ μ•Œλ©΄ λœλ‹€. 이것은 "ꡬ성"의 μ±…μž„μœΌλ‘œλΆ€ν„° "μ‚¬μš©"의 μ±…μž„μ„ κ΅¬λΆ„ν•œλ‹€.

πŸ“Ž AOP( Aspect-Oriented Programming)

μŠ€ν”„λ§μ€ κ΄€μ „ μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°(AOP)을 μ§€μ›ν•©λ‹ˆλ‹€. λ”°λΌμ„œ νŠΈλžœμž­μ…˜μ΄λ‚˜ λ‘œκΉ…, λ³΄μ•ˆκ³Ό 같이 μ—¬λŸ¬ λͺ¨λ“ˆμ—μ„œ κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯의 경우 ν•΄λ‹Ή κΈ°λŠ₯을 λΆ„λ¦¬ν•˜μ—¬ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Ž ν™•μž₯성이 λ†’λ‹€.

μŠ€ν”„λ§μ€ ν™•μž₯성이 λ†’μŠ΅λ‹ˆλ‹€. μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ— ν†΅ν•©ν•˜κΈ° μœ„ν•΄ κ°„λ‹¨ν•˜κ²Œ κΈ°μ‘΄ 라이브러리λ₯Ό κ°μ‹ΈλŠ” μ •λ„λ‘œ μŠ€ν”„λ§μ—μ„œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— 수 λ§Žμ€ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ 이미 μŠ€ν”„λ§μ—μ„œ μ§€μ›λ˜κ³  μžˆλŠ” μŠ€ν”„λ§μ—μ„œ μ§€μ›λ˜κ³  있고 μŠ€ν”„λ§μ—μ„œ μ§€μ›λ˜κ³  있고 μŠ€ν”„λ§μ—μ„œ μ‚¬μš©λ˜λŠ” 라이브러리λ₯Ό λ³„λ„λ‘œ λΆ„λ¦¬ν•˜κΈ°λ„ μš©μ΄ν•©λ‹ˆλ‹€.

πŸ“Ž 쀑볡 μ½”λ“œ 제거

JDBC 같은 ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•  λ•Œ μ€‘λ³΅λ˜λŠ” μ½”λ“œλ„ 많고 λ³΅μž‘ν•©λ‹ˆλ‹€. 이λ₯Ό λͺ¨λ‘ μ œκ±°ν•©λ‹ˆλ‹€.

 


reference

https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%94%84%EB%A7%81_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC

https://ko.wikipedia.org/wiki/%EA%B4%80%EC%A0%90_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D