[Spring Framework] 4κ°• - IoC

seb IncodeΒ·2022λ…„ 4μ›” 4일
0

Spring Framework

λͺ©λ‘ 보기
4/22
post-thumbnail

πŸ’šν›„κΈ°

양이 μ–΄λ§ˆμ–΄λ§ˆν•©λ‹ˆλ‹€. μ œκ°€ 써놔도 λΆ€λ‹΄μŠ€λŸ¬μš΄ λΆ„λŸ‰μ΄λ„€μš”;;
근데 되게 μ€‘μš”ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€. Bean, μ„€μ • 파일, μ»¨ν…Œμ΄λ„ˆ, DL, DI.. μƒμ†Œν•œ 단어가 많이 λ‚˜μ˜€κ³  이듀끼리 관계성이 μžˆμ–΄μ„œ 아직 ν—·κ°ˆλ¦¬λ„€μš”. μ•„ 그리고
(μ €ν•œν…Œλ§Œ) 쒋은 μ†Œμ‹μ΄ μžˆμŠ΅λ‹ˆλ‹€.γ…‹ 6일 λ²Όλ½μΉ˜κΈ°ν•΄μ„œ ν† μ΅μŠ€ν”Όν‚Ή Lv.6 λ‹¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€. 7일 λ²Όλ½μΉ˜κΈ°ν–ˆμœΌλ©΄ HOXY Lv.7 κ°€λŠ₯? ν‘Έν•°γ…‹γ…Ž.. 2년은 생각보닀 λΉ λ₯΄λ”λΌκ΅¬μš”.. μŠ€ν”Όν‚Ή μ–΄ν•™ 점수 ν•„μš”ν•˜μ‹  λΆ„λ“€ μ˜€ν”½ 말고 ν† μŠ€λ³΄μ„Έμš” ν† μŠ€. μ € μ˜€ν”½μ€ IM1 λ‚˜μ™”λŠ”λ° ν† μ΅μŠ€ν”Όν‚Ήμ€ Lv.6 졜고점 λ°›μ•˜μ–΄μš”. ν† μŠ€ λ³΄μ„Έμš” ν† μŠ€
ν›„κΈ° μ“°λΌλ‹ˆκΉŒ μ–΄ν•™ 점수 이야기 ν•˜κ³  μžˆλ„€μš” 쩜쩜쩜.. μ΄ν•΄ν•΄μ£Όμ„Έμš” ν† μŠ€ 재수 μ•ˆν•΄λ„ λ˜μ„œ κΈ°λ»μ„œ κ·ΈλŸ¬λŠ”κ²λ‹ˆλ‹€.
이번주 ν™”μ΄νŒ…ν•˜μ‹œκ³  λ‹€λ“€ ν–‰λ³΅ν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.

ν•™μŠ΅ λ‚΄μš©

  • IoC κ°œλ…
  • IoC κ΄€λ ¨ μš©μ–΄ 이해

ν•™μŠ΅ λͺ©ν‘œ

  • IoC κ°œλ…μ— λŒ€ν•΄ μ•Œμ•„λ΄…λ‹ˆλ‹€.
  • DLκ³Ό DI에 λŒ€ν•΄ μ΄ν•΄ν•˜κ³  IoC κ΄€λ ¨ μš©μ–΄λ“€μ— λŒ€ν•΄μ„œ μ•Œμ•„λ΄…λ‹ˆλ‹€.

IoC의 κ°œλ…

IoC(Inversion of Control)μ΄λž€ 객체의 생성, 생λͺ…μ£ΌκΈ°μ˜ κ΄€λ¦¬κΉŒμ§€ λͺ¨λ“  객체에 λŒ€ν•œ μ œμ–΄κΆŒμ΄ λ°”λ€Œμ—ˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. 즉, μ œμ–΄κΆŒμ˜ 역전이닀.


β€» μ»΄ν¬λ„ŒνŠΈ μ˜μ‘΄κ΄€κ³„ κ²°μ •(component dependency resolution), μ„€μ •(configuration) 및 생λͺ…μ£ΌκΈ°(lifecycle)λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ λ””μžμΈ νŒ¨ν„΄(Design Pattern)

IoCλž€ 객체λ₯Ό μ œμ–΄ν•˜λŠ” μ œμ–΄κΆŒμ΄ κ°œλ°œμžκ°€ μ•„λ‹Œ μ‹œμŠ€ν…œμ—κ²Œ μžˆλŠ” 것을 λ§ν•©λ‹ˆλ‹€. JavaλŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄κΈ° λ•Œλ¬Έμ— 객체가 μƒμ„±λ˜κ³  μ‚¬μš©λ˜μ—ˆλ‹€κ°€ μ†Œλ©Έλ˜κΈ°κΉŒμ§€μ˜ 생λͺ…μ£ΌκΈ°κ°€ μ€‘μš”ν•©λ‹ˆλ‹€. 이 과정은 μ‹œκ°„μ  λΉ„μš©μ΄ ꡉμž₯히 많이 λ“œλŠ” μž‘μ—…μž…λ‹ˆλ‹€. κ·Έ 쀑 자주 μ‚¬μš©λ˜λŠ” 객체듀은 λ©”λͺ¨λ¦¬μ— 미리 μ˜¬λ €λ‘κ³ , μ‚¬μš©ν•œ 후에 λ°”λ‘œ μ†Œλ©Έν•˜μ§€λ„ μ•ŠλŠ” λ“±μ˜ 관리λ₯Ό μ‹œμŠ€ν…œμ΄ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. Spring은 μ΄λŸ¬ν•œ 역할을 ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

그림을 λ³΄μ‹œλ©΄, IoCκ°€ μ•„λ‹Œ κ²½μš°λŠ” ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ΄ 였면 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. IoC인 κ²½μš°λŠ” μžλ™μ μœΌλ‘œ λˆ„κ΅°κ°€(μ»¨ν…Œμ΄λ„ˆκ² μ£ )κ°€ 객체λ₯Ό μƒμ„±ν•΄μ„œ μ œκ³΅ν•©λ‹ˆλ‹€.

IoC μ»¨ν…Œμ΄λ„ˆ

β€» μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λ„ 객체에 λŒ€ν•œ 생성 및 생λͺ…μ£ΌκΈ°λ₯Ό 관리할 수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜κ³  있음. 즉, IoC μ»¨ν…Œμ΄λ„ˆ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

  • IoC μ»¨ν…Œμ΄λ„ˆλŠ” 객체의 생성을 μ±…μž„μ§€κ³ , μ˜μ‘΄μ„±μ„ κ΄€λ¦¬ν•œλ‹€.
  • POJO의 생성, μ΄ˆκΈ°ν™”, μ„œλΉ„μŠ€, μ†Œλ©Έμ— λŒ€ν•œ κΆŒν•œμ„ 가진닀.
  • κ°œλ°œμžλ“€μ΄ 직접 POJOλ₯Ό 생성할 수 μžˆμ§€λ§Œ μ»¨ν…Œμ΄λ„ˆμ—κ²Œ 맑긴닀.(κ°•μ œλŠ” μ•„λ‹˜)


객체듀이 POJO둜 λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€. 이런 객체듀을 μžλ™μœΌλ‘œ κ΄€λ¦¬ν•˜λŠ” λͺ¨λ“ˆμ„ Spring μ»¨ν…Œμ΄λ„ˆλΌ ν•©λ‹ˆλ‹€. IoC μ»¨ν…Œμ΄λ„ˆλŠ” Spring이 μ΅œμ΄ˆλŠ” μ•„λ‹™λ‹ˆλ‹€. 이 μ»¨ν…Œμ΄λ„ˆλ‘œ 인해 κ°œλ°œμžκ°€ 객체의 생λͺ…μ£ΌκΈ°λ₯Ό κ΄€λ¦¬ν•˜λŠ” 데 μ‹ κ²½μ“Έ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
μ˜ˆμ‹œλ‘œ μ›Ή μ‹œμŠ€ν…œμ˜ 경우 μš”μ²­μ΄ 정말 λ§Žμ€ νŽΈμ΄λΌμ„œ μš”μ²­λ§ˆλ‹€ 객체가 μƒμ„±λ©λ‹ˆλ‹€. λ˜ν•œ μ‚¬μš©λ˜λ©΄ μ†Œλ©Έλ„ μ‹œμΌœμ•Όν•˜λŠ”λ° 이λ₯Ό κ°„κ³Όν•˜λ©΄ μ„œλ²„ κ³ΌλΆ€ν•˜κ°€ 생길 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 이럴 λ•ŒλŠ” IoC μ»¨ν…Œμ΄λ„ˆκ°€ ꡉμž₯히 μœ μš©ν•˜κ² μ£ ?

IoC λΆ„λ₯˜

IoCλŠ” DLκ³Ό DI둜 λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€. Springμ—μ„œ μžλ™μœΌλ‘œ 객체λ₯Ό μ œκ³΅ν•˜κ³  κ΄€λ¦¬ν•˜λ €λ©΄ 두 가지 κΈ°λŠ₯이 μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.
첫째둜, Spring μ»¨ν…Œμ΄λ„ˆμ— μ˜¬λΌμ™€μžˆλŠ” 객체듀 μ€‘μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ›ν•˜λŠ” 객체λ₯Ό μ°ΎλŠ” κΈ°λŠ₯이 DLμž…λ‹ˆλ‹€. 객체 IDλ‚˜, νƒ€μž…μœΌλ‘œ 객체λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.
λ‘˜μ§Έλ‘œ, κ°μ²΄λ“€λΌλ¦¬μ˜ μ˜μ‘΄κ΄€κ³„λ₯Ό μžλ™μœΌλ‘œ μ²˜λ¦¬ν•΄μ£ΌλŠ” 것이 DIμž…λ‹ˆλ‹€.
μ˜ˆμ‹œλ‘œ A 객체가 B 객체λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ B 객체가 A 객체에 μ£Όμž…μ΄ λ˜μ–΄μ•Όν•˜λŠ”λ°, μ΄λ ‡κ²Œ μžλ™μ μœΌλ‘œ μ°Έμ‘°μ‹œν‚€λŠ” κΈ°λŠ₯이 DIλΌλŠ” 것이죠.
μ˜μ‘΄μ„ μœ„ν•œ 객체 μ£Όμž…(Injection) 방식은 3가지 λ°©μ‹μž…λ‹ˆλ‹€.(κ·Έλ¦Ό μ°Έκ³ )
1. Setter에 μ˜ν•œ Injection
2. Constructor(μƒμ„±μž)에 μ˜ν•œ Injection
3. Method(λ©”μ†Œλ“œ 이름)에 μ˜ν•œ Injection
Springμ—μ„œλŠ” 이 3가지 방식을 λͺ¨λ‘ μ§€μ›ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

DLκ³Ό DI

빈 μ„€μ • νŒŒμΌμ€ XML둜 λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

Spring IoC κ΄€λ ¨ μš©μ–΄

Manged Bean

  • μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄μ„œ κ΄€λ¦¬λ˜λŠ” 객체
  • μŠ€ν”„λ§ 빈 이라고도 함
  • μŠ€ν”„λ§ μ„€μ •νŒŒμΌμ— λ“±λ‘λ˜μ–΄ μ‚¬μš©
  • μžλ™ 등둝 κΈ°λŠ₯ μ‚¬μš© κ°€λŠ₯

Spring Container

  • κ΄€λ¦¬λ˜λŠ”(managed) 빈이 λͺ¨μ—¬μžˆλŠ” κ³³
  • IoC μ»¨ν…Œμ΄λ„ˆλ‘œμ¨ Application Context 클래슀둜 κ΅¬ν˜„λ¨

IoC μ»¨ν…Œμ΄λ„ˆλŠ” κ°œλ… λŠλ‚Œμ΄λΌλ©΄,, Application Context ν΄λž˜μŠ€λŠ” IoC μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€μ œλ‘œ κ΅¬ν˜„ν•΄λ†“μ€ κ²ƒμœΌλ‘œ 보면 λ©λ‹ˆλ‹€.

μ‹€μŠ΅

이번 ν¬μŠ€νŒ… μ‹€μŠ΅μ€ 직전 ν¬μŠ€νŒ… μ‹€μŠ΅ 결과물을 μ΄μ–΄μ„œ ν•©λ‹ˆλ‹€.

↑ ν”„λ‘œμ νŠΈ -> Java Resources -> src/main/java -> new -> Package 클릭
DAO 클래슀λ₯Ό λ§Œλ“€κΈ° 전에 νŒ¨ν‚€μ§€λ₯Ό λ§Œλ“€κ²λ‹ˆλ‹€.

↑ Name μž…λ ₯ -> Finish 클릭
Name은 'κ·Έλ£ΉID.ν”„λ‘œμ νŠΈλͺ… 일뢀' μ΄λ ‡κ²Œ μ§“μŠ΅λ‹ˆλ‹€.
κ·Έλ£ΉID μžŠμ–΄λ²„λ¦¬μ…¨λ‹€λ©΄ pom.xmlμ—μ„œ 확인해보싀 수 μžˆμŠ΅λ‹ˆλ‹€.

↑ μƒμ„±λœ νŒ¨ν‚€μ§€μ— 클래슀λ₯Ό ν•˜λ‚˜ μƒμ„±ν•©λ‹ˆλ‹€.

↑ 이름 λŒ€μΆ© 짓고 finish 클릭

1. TestDAO μž‘μ„±

↑ λ‹¨μˆœνžˆ 두 수의 합을 κ΅¬ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

이 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  메인 λ©”μ†Œλ“œκ°€ ν•„μš”ν•˜κ² μ£ ?

같은 νŒ¨ν‚€μ§€μ—μ„œ μƒˆλ‘œμš΄ 클래슀λ₯Ό ν•˜λ‚˜ 더 λ§Œλ“€μ–΄μ£Όμ„Έμš”.

↑ 이름 λ§ˆμŒλŒ€λ‘œ μ§€μœΌμ‹œκ³ , ν‘œμ‹œν•œ λΆ€λΆ„ 체크 ν•΄μ£Όμ„Έμš”.

↑ 메인 ν΄λž˜μŠ€μ— μ•„κΉŒ λ§Œλ“  λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œ 좜λ ₯κΉŒμ§€ ν•΄λ΄€μŠ΅λ‹ˆλ‹€.
일반적으둜 μš°λ¦¬κ°€ μ΄λ ‡κ²Œ 많이 ν•΄μ™”μ£ .

2. TestDAO 빈 μ»¨ν…Œμ΄λ„ˆμ— 등둝

이제 이 μ½”λ“œλ₯Ό DIλ₯Ό μ‚¬μš©ν•˜λ„λ‘ λ°”κΏ”λ³΄κ² μŠ΅λ‹ˆλ‹€.
HelloDAO ν΄λž˜μŠ€κ°€ 빈 μ»¨ν…Œμ΄λ„ˆμ— 관리될 수 μžˆλ„λ‘ λ“±λ‘ν•΄μ•Όν•©λ‹ˆλ‹€.
λ“±λ‘ν•˜κΈ° μœ„ν•΄ μŠ€ν”„λ§ μ„€μ •νŒŒμΌμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.
κ·Έ μŠ€ν”„λ§ μ„€μ • νŒŒμΌμ„ λ§Œλ“€κ² μŠ΅λ‹ˆλ‹€.

μŠ€ν”„λ§ μ„€μ • νŒŒμΌμ€ src/main/resources에 λ§Œλ“­λ‹ˆλ‹€.

↑ new -> Other 클릭

↑ Spring -> Spring Bean Configuration file 클릭

↑ File-name μž…λ ₯ -> finish 클릭

↑ beans νƒœκ·Έ 내에 bean νƒœκ·Έ μž‘μ„±
id μž‘μ„± : 클래슀λͺ…(단, μ²«λ¬Έμžκ°€ μ†Œλ¬Έμžμ΄μ–΄μ•Ό 함)
class μž‘μ„± : FULL둜 μ μ–΄μ€˜μ•Ό 함('κ·Έλ£ΉID.클래슀λͺ…')

μ΄λ ‡κ²Œ μ μ–΄μ€ŒμœΌλ‘œμ¨ HelloDAO 클래슀λ₯Ό μ»¨ν…Œμ΄λ„ˆκ°€ 인식할 수 μžˆμŠ΅λ‹ˆλ‹€.

이제 Main λ©”μ†Œλ“œμ—μ„œ μ„€μ • νŒŒμΌμ— λ“±λ‘λœ HelloDAO 빈(객체)을 μ‚¬μš©ν•˜λŠ” λ‹¨κ³„λ§Œ λ‚¨μ•˜μŠ΅λ‹ˆλ‹€.

3. TestDAO DL둜 μ‚¬μš©

μ½”λ“œ μˆœμ„œλŠ” μ΄λ ‡μŠ΅λ‹ˆλ‹€.

  1. Spring μ»¨ν…Œμ΄λ„ˆ 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. μƒμ„±μž 인자둜 μ•„κΉŒ λ§Œλ“€μ—ˆλ˜ 빈 μ„€μ • 파일(xml)을 경둜 ν¬ν•¨ν•˜μ—¬ 써주면 λ©λ‹ˆλ‹€.
    이 μ„€μ • 파일이 λ‘œλ”©λ  λ•Œ, μ„€μ • νŒŒμΌμ— λ“±λ‘λœ λͺ¨λ“  Bean듀이 같이 λ‘œλ”©ν•˜κ²Œ λ©λ‹ˆλ‹€. 이 μ‹œμ μ— Bean듀이 λͺ¨λ‘ μƒμ„±λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

  2. μƒμ„ ν•œ μ»¨ν…Œμ΄λ„ˆ 객체λ₯Ό ν™œμš©ν•˜μ—¬ 빈(객체)을 μ°ΎμŠ΅λ‹ˆλ‹€.(DL)
    인자 1은 클래슀 이름, 인자 2λŠ” 클래슀의 νƒ€μž…μ„ μ μŠ΅λ‹ˆλ‹€.
    β€» Bean 생성은 (1) μ‹œμ μ—μ„œ μƒμ„±λ©λ‹ˆλ‹€. μ—¬κΈ΄ λ‹¨μˆœ κ°€μ Έμ˜€λŠ” ꡬ간❗

  3. 찾은 빈(객체)을 ν™œμš©ν•˜μ—¬ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

↑ κ²°κ³Όμž…λ‹ˆλ‹€.

λΉ¨κ°œμ„œ μ—λŸ¬κ°™μ§€λ§Œ μ•„λ‹™λ‹ˆλ” γ…Žγ…Ž
μ΄ˆλ‘μƒ‰ μƒμžλ‘œ ν‘œμ‹œν•œ 뢀뢄이 λ‚˜νƒ€λ‚΄λŠ” μ˜λ―ΈλŠ” 'μ € XMLλ‘œλΆ€ν„° 빈(객체)을 Loadingν–ˆλ‹€.' λΌλŠ” κ²ƒμž…λ‹ˆλ‹€.

λͺ¨λ“  μ½”λ“œ 라인이 λλ‚˜λ©΄ dao κ°μ²΄λŠ” λ°˜ν™˜(garbage collecting)λ˜λŠ”λ°,
dao 객체가 μ°Έμ‘°ν•˜λ˜ Bean은 물리적으둜 μ‚¬λΌμ§€λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. ctx μ»¨ν…Œμ΄λ„ˆλ‘œ λ°˜ν™˜λ˜λŠ” κ²ƒμ΄λ―€λ‘œ λ‚΄λΆ€μ μœΌλ‘œ ꡉμž₯ν•œ μ„±λŠ₯을 λ³΄μž…λ‹ˆλ‹€. μ‹€μ œλ‘œ λ°˜ν™˜ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λΆ€ν•˜κ°€ 많이 쀄어듀죠.

0개의 λŒ“κΈ€