[Spring] Ioc, DI Container

2021. 10. 1. 08:00ใ†Back-End ์ž‘์—…์‹ค/Spring Framework

728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”? ์ฃผ๋‹ˆํ•˜๋ž‘์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์Šคํ”„๋ง์— ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž ์จ IoC, DI Container์— ๊ฐœ๋…์— ๋Œ€ํ•ด ๋‹ค์‹œ ํ•œ๋ฒˆ ์žฌ์ •๋ฆฝํ•˜๊ณ  ๊ฐ€๋„๋ก ํ• ๊ฒŒ์š”!

ํ•จ๊ป˜ ๊ณต๋ถ€ ํ•ด ๋ณด์‹ค๊ฒŒ์š”!




๐Ÿ“‹ ๋ชฉ์ฐจ


01. [Spring] ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ
02. [Spring] ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™ (SOLID)
03. 
[Spring] ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง   
04. [Spring] OCP์™€ DIP ๊ณ ๋ คํ•˜๊ธฐ
05. [Spring] ๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ - ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ๊ฐœ๋ฐœ
06. 
[Spring] AppConfig ๋ฆฌํŒฉํ„ฐ๋ง    
07. [Spring] Ioc, DI Container  
08. [Spring] ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ  
09. [Spring] ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ  
10. [Spring] Component Scan And Auto wired Start
11. 
[Spring] ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐฉ๋ฒ•    
12. [Spring] Bean Life Cycle Call Back
13. 
[Spring] Bean Scope

 

 

 


 

 

๐Ÿ“Œ IoC, DI ๊ทธ๋ฆฌ๊ณ , ์ปจํ…Œ์ด๋„ˆ


IoC(Inversion Of Control) ์ œ์–ด์˜ ์—ญ์ „

IoC๋ž€ ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ์€ Client ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ์Šค์Šค๋กœ ํ•„์š” Server ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ฒฐํ•˜๊ณ , ์‹คํ–‰ ํ–ˆ์—ˆ๋˜ ๊ฒƒ์ด์—์š”.

๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„์„ ์Šค์Šค๋กœ ์กฐ์ข…ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด์ง€์š”. ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„  ์ด๊ฒŒ ๋‹น์—ฐํ•œ ํ๋ฆ„์ผ ๊ฒƒ์ด์—์š”.

๋ฐ˜๋ฉด AppConfig๊ฐ€ ๋“ฑ์žฅํ•œ ๋’ค ๊ตฌํ˜„ ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ Logic์„ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ๋งŒ ๋‹ด๋‹นํ•˜๋Š” ๊ฒƒ์ด์—์š”. ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„์€ ์ด์ œ AppConfig๊ฐ€ ๊ฐ€์ ธ๊ฐ„ ๊ฒƒ์ด์ฃ . ์˜ˆ๋ฅผ ๋“ค์–ด OrderServiceImpl์€ ํ•„์š” ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ํ˜ธ์ถœํ•˜๋‚˜, ์–ด๋–ค ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ์‹คํ–‰๋ ์ง€๋Š” ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด์—์š”.

ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ๊ถŒํ•œ์€ ๋ชจ๋‘ AppConfig๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ์‹ฌ์ง€์–ด! OrderServiceImpl๋„ AppConfig๊ฐ€ ์‹คํ–‰ํ•œ๋‹ต๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ , AppConfig๋Š” OrderServiceImpl์ด ์•„๋‹Œ OrderService ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹ค๋ฅธ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ž˜๋„ ์ฐฉํ•œ OrderServiceImpl์€ ์˜ค๋Š˜๋„ ๋ฌต๋ฌตํžˆ ์ž์‹ ์˜ Logic๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ต๋‹ˆ๋‹ค.

 

    ๐Ÿ“ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฐจ์ด

๋จผ์ € ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ œ์–ดํ•˜๊ณ , ๋‚˜ ๋Œ€์‹  ์‹คํ–‰ํ•ด ์ค€๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ํ”„๋ ˆ์ž„์›Œํฌ์ธ ๊ฒƒ์ด์—์š”. JUnit๋„ ํ”„๋ ˆ์ž„์›Œํฌ๋ž๋‹ˆ๋‹ค!๋ฐ˜๋ฉด ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์ง์ ‘ ์ œ์–ด์˜ ํ๋ฆ„์„ ๋‹ด๋‹นํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

    ๐Ÿ“์˜์กด๊ด€๊ณ„ ์ฃผ์ž… DI(Dependency Injection)

OrderServiceImpl์€ DiscountPolicy ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด์—์š”. ์‹ค์ œ ์–ด๋–ค ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋ ์ง€๋Š” ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด์ง€์š”.

์˜์กด ๊ด€๊ณ„๋Š” ์ •์ ์ธ Class ์˜์กด ๊ด€๊ณ„์™€ ์‹คํ–‰ ์‹œ์ ์— ๊ฒฐ์ •๋˜๋Š” ๋™์ ์ธ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค) ์˜์กด ๊ด€๊ณ„ ๋‘˜์„ ๋ถ„๋ฆฌํ•ด์„œ ์ƒ๊ฐํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

         ๐Ÿ‘‰ ์ •์ ์ธ Class ์˜์กด ๊ด€๊ณ„

Class๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” import ์ฝ”๋“œ๋งŒ ๋ณด๊ณ , ์˜์กด๊ด€๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

์ •์ ์ธ ์˜์กด๊ด€๊ณ„๋Š” Application์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜ Class Diagram์—์„œ OrderServiceImpl์€ MemberRepository, DiscountPolicy์— ์˜์กดํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.๊ทธ๋Ÿฐ๋ฐ, ์ด๋Ÿฌํ•œ Class ์˜์กด๊ด€๊ณ„ ๋งŒ์œผ๋กœ๋Š” ์‹ค์ œ ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ OrderServiceImpl์— ์ฃผ์ž… ๋ ์ง€ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

         ๐Ÿ‘‰ ๋™์ ์ธ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ์˜์กด ๊ด€๊ณ„

์ด๊ฒƒ์€ Application ์‹คํ–‰ ์‹œ์ ์— ์‹ค์ œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์˜์กด ๊ด€๊ณ„์ธ ๊ฒƒ์ด์—์š”.

 

  • ๊ฐ์ฒด Diagram

 

๋ฐ˜์‘ํ˜•

 

Application ์‹คํ–‰ ์‹œ์ (Run Time)์— ์™ธ๋ถ€์—์„œ ์‹ค์ œ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , Client์— ์ „๋‹ฌํ•ด์„œ Client์™€ Server์˜ ์‹ค์ œ ์˜์กด๊ด€๊ณ„๊ฐ€ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์„ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…(์˜์กด์„ฑ ์ฃผ์ž…)์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ์ฐธ์กฐ๊ฐ’์„ ์ „๋‹ฌํ•ด์„œ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์ด๊ณ , ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด Client ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , Client๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์ƒ์˜ ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •์ ์ธ Class ์˜์กด๊ด€๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ๋™์ ์ธ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ์˜์กด๊ด€๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

         ๐Ÿ‘‰ IoC, DI Container

AppConfig์ฒ˜๋Ÿผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์˜์กด ๊ด€๊ณ„๋ฅผ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ๊ฒƒ์„ IoC Container ํ˜น์€ DI Contatiner๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…์— ์ดˆ์ ์„ ๋งž์ถ”์–ด ์ตœ๊ทผ์—๋Š” ์ฃผ๋กœ DI Container๋ผ๊ณ  ํ•œ๋‹ต๋‹ˆ๋‹ค!๋˜๋Š” ์–ด์ƒ˜๋ธ”๋Ÿฌ, Object Factory ๋“ฑ์œผ๋กœ ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•œ๋‹ค๊ณ  ํ•ด์š”!

 

 

 

 

์ถœ์ฒ˜ : ์ธํ”„๋Ÿฐ - ๊น€์˜ํ•œ ๊ฐ•์‚ฌ๋‹˜์˜ ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ ๊ฐ•์˜

์ด ๊ธ€์€ ๊ฐ•์˜ ๋‚ด์šฉ๊ณผ ๊ฐ•์˜ ์ž๋ฃŒ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ '์ฃผ๋‹ˆํ•˜๋ž‘'์ด '์ฃผ๋‹ˆํ•˜๋ž‘' ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•œ ๋‚ด์šฉ ์ž„์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

 

 





์ฃผ๋‹ˆํ•˜๋ž‘์˜ ๊ธ€์ด ๋งˆ์Œ์— ๋“œ์…จ๋‚˜์š”? ๊ตฌ๋…๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋Œ“๊ธ€ ๊ทธ๋ฆฌ๊ณ  ๋ฐฉ๋ช…๋ก์€ ์ฃผ๋‹ˆํ•˜๋ž‘์—๊ฒŒ ๋งŽ์€ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค.

 

 

728x90
๋ฐ˜์‘ํ˜•