Skip to content

Latest commit

Β 

History

History
56 lines (42 loc) Β· 3.84 KB

README.md

File metadata and controls

56 lines (42 loc) Β· 3.84 KB

DI Dependency Injection μ˜μ‘΄μ„± μ£Όμž…

DIλž€ Spring Frameworkμ—μ„œ μ§€μ›ν•˜λŠ” IoC의 ν˜•νƒœμž…λ‹ˆλ‹€.
클래슀 μ‚¬μ΄μ˜ μ˜μ‘΄κ΄€κ³„λ₯Ό Bean μ„€μ • 정보λ₯Ό λ°”νƒ•μœΌλ‘œ μ»¨ν…Œμ΄λ„ˆκ°€ μžλ™μ μœΌλ‘œ μ—°κ²°ν•΄μ£ΌλŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
κ°œλ°œμžλŠ” μ œμ–΄λ₯Ό 직접 λ‹΄λ‹Ήν•  ν•„μš” 없이, Bean μ„€μ • νŒŒμΌμ— 의쑴 관계가 ν•„μš”ν•˜λ‹€λŠ” 정보λ₯Ό μΆ”κ°€ν•˜λŠ” ν˜•νƒœλ‘œ κ΅¬ν˜„ν•˜κ²Œ λ©λ‹ˆλ‹€.
Containerκ°€ μ‹€ν–‰ νλ¦„μ˜ 주체가 λ˜μ–΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œμ— 의쑴 관계λ₯Ό μ£Όμž…ν•΄μ£Όκ²Œ λ©λ‹ˆλ‹€.

βœ… μ˜μ‘΄μ„± Dependency λž€?
ν˜„μž¬ 객체가 λ‹€λ₯Έ 객체와 μƒν˜Έμž‘μš©, 즉 μ°Έμ‘°ν•˜κ³  μžˆλ‹€λ©΄ λ‹€λ₯Έ 객체듀을 ν˜„μž¬ 객체의 의쑴이라고 ν•©λ‹ˆλ‹€.

⛔️ μ˜μ‘΄μ„±μ΄ μœ„ν—˜ν•œ 이유
ν•˜λ‚˜μ˜ λͺ¨λ“ˆμ΄ λ°”λ€Œλ©΄ μ˜μ‘΄ν•œ λ‹€λ₯Έ λͺ¨λ“ˆκΉŒμ§€ λ³€κ²½λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
Unit Test λͺ©μ  μžμ²΄κ°€ λ‹€λ₯Έ λͺ¨λ“ˆλ‘œλΆ€ν„° λ…λ¦½μ μœΌλ‘œ ν…ŒμŠ€νŠΈν•˜λŠ” 것을 μš”κ΅¬ν•˜κΈ° λ•Œλ¬Έμ—,
ν…ŒμŠ€νŠΈ κ°€λŠ₯ν•œ μ–΄ν”Œμ„ λ§Œλ“€ λ•Œ μ˜μ‘΄μ„±μ΄ 있으면 Unit Test μž‘μ„±μ΄ μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ λ‹€λ₯Έ λͺ¨λ“ˆμ„ μ΄ˆκΈ°ν™”ν•˜μ§€ μ•ŠκΈ° μœ„ν•΄μ„œλŠ”, 객체 생성은 λ‹€λ₯Έ κ³³μ—μ„œ ν•˜κ³  이미 μƒμ„±λœ 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” μ‹μœΌλ‘œ κ΅¬ν˜„ν•˜κ²Œ λ©λ‹ˆλ‹€.
DIλŠ” IoC κ°œλ…μ„ λ°”νƒ•μœΌλ‘œ ν•˜μ—¬, ν΄λž˜μŠ€κ°€ μ™ΈλΆ€λ‘œλΆ€ν„° μ˜μ‘΄μ„±μ„ κ°€μ Έμ•Ό ν•©λ‹ˆλ‹€.

πŸ’‘ DIκ°€ ν•„μš”ν•œ 이유
클래슀 μž¬μ‚¬μš© κ°€λŠ₯성을 높이고, λ‹€λ₯Έ ν΄λž˜μŠ€μ™€ λ…λ¦½μ μœΌλ‘œ 클래슀λ₯Ό ν…ŒμŠ€νŠΈν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
λΉ„μ¦ˆλ‹ˆμŠ€ 둜직의 νŠΉμ • κ΅¬ν˜„μ΄ μ•„λ‹Œ 클래슀λ₯Ό μƒμ„±ν•˜λŠ” 데 맀우 νš¨κ³Όμ μž…λ‹ˆλ‹€.

1️⃣ μƒμ„±μž μ‚½μž… Contructor Injection

ν•„μš”ν•œ μ˜μ‘΄μ„±μ„ λͺ¨λ‘ ν¬ν•¨ν•˜λŠ” 클래슀의 μƒμ„±μžλ₯Ό λ§Œλ“€κ³  κ·Έ μƒμ„±μžλ₯Ό 톡해 μ˜μ‘΄μ„±μ„ μ£Όμž…ν•©λ‹ˆλ‹€.
즉 μƒμ„±μžμ— νŒŒλΌλ―Έν„°λ₯Ό λ§Œλ“€μ–΄λ‘κ³  이λ₯Ό 톡해 DI μ»¨ν…Œμ΄λ„ˆκ°€ μ˜μ‘΄ν•  객체의 μ°Έμ‘°λ₯Ό λ„˜κ²¨μ£ΌλŠ” λ°©μ‹μž…λ‹ˆλ‹€.

βœ… μƒμ„±μž μ£Όμž…μ˜ μž₯점
πŸ’‘ μˆœν™˜ μ°Έμ‘° 방지 κ°€λŠ₯
μƒμ„±μž μ£Όμž…μ€ μƒμ„±μžλ‘œ 객체λ₯Ό μƒμ„±ν•˜λŠ” μ‹œμ μ— μƒμ„±μžμ˜ μΈμžμ— μ‚¬μš©λ˜λŠ” λΉˆμ„ μ°Ύκ±°λ‚˜ μƒμ„±ν•˜μ—¬ 빈의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.
κ·Έ μ™Έμ˜ μ˜μ‘΄μ„± μ£Όμž… 방식은 λΉˆμ„ λ¨Όμ € μƒμ„±ν•œ ν›„ μ–΄λ…Έν…Œμ΄μ…˜μ΄ 뢙은 ν•„λ“œμ— ν•΄λ‹Ήν•˜λŠ” λΉˆμ„ μ°Ύμ•„μ„œ μ£Όμž…ν•˜κ±°λ‚˜ Setter의 객체λ₯Ό ν˜ΈμΆœν•΄ μ£Όμž…ν•˜κ²Œ λ©λ‹ˆλ‹€.
μœ„μ™€ 같은 방식은 객체가 μ‹€μ œλ‘œ μ‚¬μš©λ˜κΈ° μ „κΉŒμ§€λŠ” μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šκ²Œ λ˜μ–΄ 문제λ₯Ό μ°ΎκΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

πŸ’‘ final ν‚€μ›Œλ“œ
λΆˆλ³€ν•˜λŠ” 객체λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.
λŸ°νƒ€μž„μ— 쀑에 객체가 λ³€ν•˜λŠ” 것을 막아 λΆˆλ³€μ„±μ„ μœ μ§€ν•  수 μžˆμ–΄ 였λ₯˜λ₯Ό 사전에 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ setter λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•œ 맀개 λ³€μˆ˜ μ‚½μž… Method(Setter) Injection

μ˜μ‘΄μ„±μ„ μž…λ ₯ λ°›λŠ” setter methodλ₯Ό λ§Œλ“€κ³  이λ₯Ό 톡해 μ˜μ‘΄μ„±μ„ μ£Όμž…ν•©λ‹ˆλ‹€.
setter λ©”μ†Œλ“œλŠ” μ™ΈλΆ€μ—μ„œ 였브젝트 λ‚΄λΆ€μ˜ attribute 값을 λ³€κ²½ν•˜λ €λŠ” μš©λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.
핡심 κΈ°λŠ₯은 νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬λœ 값을 λ‚΄λΆ€μ˜ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ— μ €μž₯ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
μŠ€ν”„λ§μ—μ„œ μ§€μ§€ν•˜λŠ” DI λ°©μ‹μœΌλ‘œ, μ™ΈλΆ€μ—μ„œ μ œκ³΅λ°›μ€ 였브젝트 레퍼런슀λ₯Ό μ €μž₯ν•΄λ’€λ‹€κ°€, λ‚΄λΆ€μ˜ λ©”μ†Œλ“œμ—μ„œ μ‚¬μš©ν•˜κ²Œ ν•˜λŠ” DI 방식에 ν™œμš©ν•˜κΈ° μ ν•©ν•©λ‹ˆλ‹€.

3️⃣ μ΄ˆκΈ°ν™” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•œ 멀버 λ³€μˆ˜ μ‚½μž… Field Injection

μ˜μ‘΄μ„±μ„ μ£Όμž…ν•˜λŠ” ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μž‘μ„±ν•˜κ³  이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ„λ‘ ν•¨μœΌλ‘œμ¨ μ‹€ν–‰μ‹œμ— μ˜μ‘΄μ„±μ„ μ£Όμž…ν•©λ‹ˆλ‹€.
Injection을 ν•˜κΈ° μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€ μ •μ˜ ν›„ κ΅¬ν˜„ μ‹œ DIκ°€ 이루어지도둝 ν•˜λŠ”λ°, μ΄λŠ” μŠ€ν”„λ§μ΄ μ§€μ›ν•˜μ§€ μ•ŠλŠ” λ°©μ‹μž…λ‹ˆλ‹€.