๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend

[Spring] ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ๊ฐœ๋…, DI / IoC๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (์˜์กด์„ฑ ์ฃผ์ž…, ์ œ์–ด์˜ ์—ญ์ „)

๊ฐœ๋ฐœ์ž HOON 2022. 10. 10. 20:03

๐Ÿ 0. ์„œ๋ก 

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด ํ•™์Šตํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, DI์™€ IoC๋Š” ํ•œ ๋ฒˆ์ฏค์€ ๋“ค์–ด๋ณด์•˜์„ ํ‚ค์›Œ๋“œ์ด๋‹ค.

์Šคํ”„๋ง ํŠธ๋ผ์ด์•ต๊ธ€, ์ถœ์ฒ˜ : https://sehun-kim.github.io/sehun/springbean-lifecycle/#2

"์Šคํ”„๋ง์ด๋ž€ IoC์™€ AOP๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ๋Ÿ‰์˜ ์ปจํ…Œ์ด๋„ˆ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค." - ์Šคํ”„๋ง์— ๋Œ€ํ•œ ํ•œ ์ค„ ์„ค๋ช…

์Šคํ”„๋ง์˜ 3๋Œ€ ์š”์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์Šคํ”„๋ง ํŠธ๋ผ์ด์•ต๊ธ€์—์„œ ๋‹น๋‹นํžˆ ํ•œ ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” DI/IoC๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.

์‚ฌ์‹ค, DI์™€ IoC๋Š” ์Šคํ”„๋ง์—๋งŒ ๊ตญํ•œ๋œ ๊ฐœ๋…์ด ์•„๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : https://www.tutorialsteacher.com/ioc

์—ฌ๊ธฐ์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, DI์™€ IoC๋Š” ๊ฐ๊ฐ ๋””์ž์ธ ํŒจํ„ด, ๋””์ž์ธ ์›์น™์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์œผ๋กœ

๊ผญ ์Šคํ”„๋ง์ด ์•„๋‹ˆ๋”๋ผ๋„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋„ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋…์ด๋‹ค.

๋””์ž์ธ ์›์น™์€ ํŠน์ •ํ•œ ํšจ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, best practice๋ฅผ ์ง€ํ–ฅํ•˜๋Š” ์ง€์นจ์ด์ง€๋งŒ, ์ •ํ™•ํ•œ ์„ธ๋ถ€ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋””์ž์ธ ํŒจํ„ด์€, ๋””์ž์ธ ์›์น™์— ๋Œ€ํ•ด ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ œ์‹œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ํŒจํ„ด์œผ๋กœ์จ ์ •์˜ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, DI๋Š” IoC๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ธ์ง€ํ•˜๊ณ  ์žˆ์œผ๋ฉด ๋œ๋‹ค.

์ถœ์ฒ˜ : https://www.tutorialsteacher.com/ioc

์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด, IoC๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์—๋Š” DI๋„ ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ํŒจํ„ด๋“ค๋„ ์กด์žฌํ•œ๋‹ค.

์ฆ‰, IoC๋Š” ๋‹ค๋ฅธ ํŒจํ„ด์œผ๋กœ๋„ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์„ ์•Œ๊ณ , ๊ทธ๋Ÿผ์—๋„ ์Šคํ”„๋ง์—์„œ IoC์™€ DI๋ผ๋Š” ๋ง์ด ์™œ ํ•ญ์ƒ ๋ถ™์–ด๋‹ค๋‹๊นŒ?๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๊ธ€์„ ์ฝ๋Š”๋ฐ ๋”์šฑ ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.

ํ•„์ž๋„ ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•ด ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธธ ์ง€๋งํ•˜์ง€๋งŒ, ์ •ํ™•ํžˆ ์ด ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฌ์› ๋‹ค.

๋”ฐ๋ผ์„œ ์˜ค๋Š˜ ํฌ์ŠคํŒ…์—์„œ๋Š” DI์™€ IoC์— ๋Œ€ํ•œ ๊ฐœ๋…๊ณผ ์„ค๋ช… / Spring์—์„œ๋Š” ์–ด๋–ป๊ฒŒ DI/IoC๊ฐ€ ์ ์šฉ๋˜๋Š”์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 


 

๐Ÿ’ก 1. DI (Dependency Injection) : ์˜์กด๊ด€๊ณ„(์˜์กด์„ฑ) ์ฃผ์ž…

> 1-1. DI์— ๋Œ€ํ•œ ์š”์•ฝ ์„ค๋ช…

ํ•œ ์ค„๋กœ ์„ค๋ช…ํ•˜๋ฉด, ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์˜์กด ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ฃผ์ž… ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์•„์ง์€ ์‰ฝ๊ฒŒ ์™€๋‹ฟ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋‚˜, ํ•˜๋‹จ์˜ 1-2 ์ฑ•ํ„ฐ์—์„œ '์˜์กด ๊ด€๊ณ„'์— ๊ด€ํ•œ ์„ค๋ช…๊ณผ ๋น„์œ ๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

> 1-2. '์˜์กด๊ด€๊ณ„'์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

'๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค ํ˜น์€ ๋ชจ๋“ˆ์ด ์˜์กด๊ด€๊ณ„์— ์žˆ๋‹ค'๋ผ๋Š” ๊ฒƒ์€, ๋ˆ„๊ฐ€ ๋ˆ„๊ตฌ์—๊ฒŒ ์˜์กดํ•˜๋Š” ๊ด€๊ณ„์— ์žˆ๋‹ค๋Š” ์‹์œผ๋กœ ๋ฐฉํ–ฅ์„ฑ์ด ์žˆ๋‹ค.

์œ„์˜ UML์„ ๋ณด๋ฉด, ์˜์กด๊ด€๊ณ„๋ฅผ ์œ„์™€ ๊ฐ™์ด ์ ์„ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ณ , A๊ฐ€ B์— ์˜์กดํ•˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

'A๊ฐ€ B์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค'๋ผ๋Š” ๊ฒƒ์€, B๊ฐ€ ๋ณ€ํ™”ํ•˜๋ฉด A์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, B์˜ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€ ํ˜น์€ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜, ํ˜•์‹์ด ๋ฐ”๋€Œ๋ฉด ๊ทธ ์˜ํ–ฅ์ด A๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ A์—์„œ B์— ์ •์˜๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ์˜์กด๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐฉํ–ฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, B๋Š” A์˜ ๋ณ€ํ™”์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ๋„ ์•Œ์•„๋‘์–ด์•ผ ํ•  ์ ์ด๋‹ค.

 

> 1-3. ๋น„์œ ๋ฅผ ํ†ตํ•œ DI์— ๋Œ€ํ•œ ์ดํ•ด

์œ„์˜ '์˜์กด๊ด€๊ณ„'์— ๋Œ€ํ•ด์„œ ๊ต‰์žฅํžˆ ๋”ฑ๋”ฑํ•˜๊ฒŒ ์„ค๋ช…์„ ํ–ˆ์ง€๋งŒ, ์ข‹์€ ๋น„์œ ๋ฅผ ๋ฐœ๊ฒฌํ•ด ์ถœ์ฒ˜๋ฅผ ๋‚จ๊ธฐ๊ณ  ์ธ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

์ถœ์ฒ˜ : https://m.blog.naver.com/PostView.nhn?blogId=ljh0326s&logNo=221395815870&proxyReferer=https:%2F%2Fwww.google.com%2F

์œ„์™€ ๊ฐ™์ด ์žฅ๋‚œ๊ฐ๋“ค์ด ์žˆ๋‹ค. ์žฅ๋‚œ๊ฐ์€ ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ „๋ ฅ์„ ๊ณต๊ธ‰๋ฐ›์•„์„œ ์ž‘๋™ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋‹ค.

์žฅ๋‚œ๊ฐ์€ ๋ฐฐํ„ฐ๋ฆฌ๊ฐ€ ์žˆ์–ด์•ผ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์žฅ๋‚œ๊ฐ์€ ๋ฐฐํ„ฐ๋ฆฌ์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค.

์ฆ‰, ๋ฐฉํ–ฅ์„ฑ์œผ๋กœ ํ‘œ๊ธฐํ•˜๋ฉด ์žฅ๋‚œ๊ฐ → ๋ฐฐํ„ฐ๋ฆฌ๋กœ ํ‘œ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํด๋ž˜์Šค์˜ ๊ด€์ ์œผ๋กœ ๋ณด๋ฉด, ์žฅ๋‚œ๊ฐ ํด๋ž˜์Šค์™€ ๋ฐฐํ„ฐ๋ฆฌ ํด๋ž˜์Šค๊ฐ€ ์žˆ๊ณ , ์žฅ๋‚œ๊ฐ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์˜จ์ „ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ๋ฐฐํ„ฐ๋ฆฌ ํด๋ž˜์Šค๋กœ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์ถœ์ฒ˜ : https://m.blog.naver.com/PostView.nhn?blogId=ljh0326s&logNo=221395815870&proxyReferer=https:%2F%2Fwww.google.com%2F

 

์ด๋•Œ, ๋ฐฐํ„ฐ๋ฆฌ ์ผ์ฒดํ˜•์ธ ์žฅ๋‚œ๊ฐ๊ณผ ๋ฐฐํ„ฐ๋ฆฌ ๋ถ„๋ฆฌํ˜•์˜ ์žฅ๋‚œ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ์žˆ๋Š”๋ฐ, ์ด ๋‘ ๊ฐ€์ง€ ์žฅ๋‚œ๊ฐ์„ ๋น„๊ตํ•ด๋ณด์ž.

๋ฐฐํ„ฐ๋ฆฌ ์ผ์ฒดํ˜• ์žฅ๋‚œ๊ฐ์€ ์˜์กด๊ฐ์ฒด์ธ ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•œ ์žฅ๋‚œ๊ฐ์— ํ•ด๋‹นํ•˜๊ณ ,

๋ฐฐํ„ฐ๋ฆฌ ๋ถ„๋ฆฌํ˜• ์žฅ๋‚œ๊ฐ์€ ์˜์กด๊ฐ์ฒด์ธ ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์ฃผ์ž…(์ „๋‹ฌ)๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋Š” ์žฅ๋‚œ๊ฐ์— ํ•ด๋‹นํ•œ๋‹ค.

๋ถ„๋ฆฌํ˜• ์žฅ๋‚œ๊ฐ์€ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์ฃผ์ž…ํ•˜๊ฑฐ๋‚˜, setter method๋ฅผ ์ƒ์„ฑํ•ด ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์ฃผ์ž…ํ•œ๋‹ค.

 

> 1-4. DI๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์€ ๋ฌด์—‡์ธ๊ฐ€?

๋ฐฐํ„ฐ๋ฆฌ ์ผ์ฒดํ˜• ์žฅ๋‚œ๊ฐ์€, ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์žฅ๋‚œ๊ฐ์„ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค.

์žฅ๋‚œ๊ฐ์ด ๋ฐฐํ„ฐ๋ฆฌ์— ๊ฐ•๋ ฅํ•œ ๊ฒฐํ•ฉ์œผ๋กœ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋–„๋ฌธ์ด๋‹ค.

๋ฐ˜๋ฉด์—, ๋ฐฐํ„ฐ๋ฆฌ ๋ถ„๋ฆฌํ˜• ์žฅ๋‚œ๊ฐ์€, ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‹ค ๋–จ์–ด์ง€๋ฉด ์žฅ๋‚œ๊ฐ์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐฐํ„ฐ๋ฆฌ๋งŒ ๊ฐˆ์•„ ๋ผ์›Œ์ฃผ๋ฉด ๋œ๋‹ค.

์ด๋Š” ์žฅ๋‚œ๊ฐ์ด ๋ฐฐํ„ฐ๋ฆฌ์— ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์œผ๋กœ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ๊ฒƒ์€ ๋น„์œ ์  ํ‘œํ˜„์ด๊ณ , ์ •ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด '์ข…์† ๊ฐ์ฒด์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ฒผ๋‹ค๋ฉด'์„ ์˜๋ฏธํ•œ๋‹ค.

์ข…์† ๊ฐ์ฒด ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜์ • ๋ฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ•๋ ฅํ•œ ๊ฒฐํ•ฉ์„ ํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๋ผ๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ์ฝ”๋“œ ์—ญ์‹œ ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋‹ค.

๋ฐ˜๋ฉด ์ข…์† ๊ฐ์ฒด ๋‚ด๋ถ€์˜ ์ˆ˜์ • ๋ฐ ๋ณ€๊ฒฝ์ด ์žˆ๋”๋ผ๋„(์žˆ์„ ์˜ˆ์ •์ด๋ผ๋„) ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์„ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๋ผ๋ฉด setter method๋‚˜, ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์œ ๊ธฐ์ ์ธ ์ข…์† ๊ด€๊ณ„ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฆ‰ ๋””์ž์ธ ํŒจํ„ด์ธ DI(Dependency Injection)๋Š” ๋ชจ๋“ˆ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•œ ์ „๋žต์ ์ธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

> 1-5. DI์˜ ํ•œ๊ธ€ ๋ฒˆ์—ญ์— ์˜ํ•œ ๊ด€์ 

DI๋Š” Dependency Injection์˜ ์•ฝ์–ด๋กœ, ์ง์—ญํ•˜๋ฉด ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์–ด์„œ ๋งŽ์€ ์ž๋ฃŒ๋‚˜ ๋„์„œ์—์„œ ์ด์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•˜๊ณค ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ DI์˜ ์˜๋ฏธ๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์˜์กด์„ฑ์ด๋ผ๋Š” ๋ง๋กœ๋Š” ์ž˜ ํ‘œํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. ์ด๋Ÿฐ ๋ชจํ˜ธํ•œ ํ‘œํ˜„๋ณด๋‹ค๋Š”, ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด๋ผ๋Š” ์ •ํ™•ํ•œ ์˜๋„๋ฅผ ๊ฐ€์ง„ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜๋ฉด DI๊ฐ€ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€ ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

'Dependency Injection'์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์šฐ๋ฆฌ๋ง๋กœ ๋ฒˆ์—ญ๋ผ์„œ ์‚ฌ์šฉ๋œ๋‹ค. ๊ทธ์ค‘์—์„œ ๊ฐ€์žฅ ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด๊ฐ€ ์˜์กด์„ฑ ์ฃผ์ž…์ด๋‹ค. ํ•˜์ง€๋งŒ ์˜์กด์„ฑ์ด๋ผ๋Š” ๋ง์€ DI์˜ ์˜๋ฏธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋“œ๋Ÿฌ๋‚ด์ฃผ์ง€ ๋ชปํ•œ๋‹ค. ๋˜ํ•œ ์˜์กด(์ข…์†) ์˜ค๋ธŒ์ ํŠธ ์ฃผ์ž…์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๊ธฐ๋„ ํ•˜๋Š”๋ฐ, ์ด๋•Œ๋Š” DI๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๋ฐฉ๋ฒ•์— ์ดˆ์ ์„ ๋งž์ถ˜ ๊ฒƒ์ด๋‹ค. ์—„๋ฐ€ํžˆ ๋งํ•ด์„œ ์˜ค๋ธŒ์ ํŠธ๋Š” ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์— ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ ์•„๋‹ˆ๋‹ค. ์˜ค๋ธŒ์ ํŠธ์˜ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์ „๋‹ฌ๋  ๋ฟ์ด๋‹ค. DI๋Š” ์˜ค๋ธŒ์ ํŠธ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ œ๊ณต(์ฃผ์ž…)๋ฐ›๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์—ฌํƒ€ ์˜ค๋ธŒ์ ํŠธ์™€ ๋‹ค์ด๋‚ด๋ฏนํ•˜๊ฒŒ ์˜์กด๊ด€๊ณ„๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค. ์šฉ์–ด๋Š” ๋™์ž‘๋ฐฉ์‹(๋ฉ”์ปค๋‹ˆ์ฆ˜)๋ณด๋‹ค๋Š” ์˜๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์ด๋ฆ„์„ ์ง“๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๊ทธ๋Ÿฐ ๋ฉด์—์„œ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด๋ผ๋Š” ๋ฒˆ์—ญ์ด ์ ์ ˆํ•  ๋“ฏ์‹ถ๊ณ , ์ด ์ฑ…์—์„œ๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ DI๊ฐ€ ๋ฌด์—‡์ธ์ง€๋งŒ ์ž˜ ์ธ์‹ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์–ด๋–ค ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ƒ๊ด€์—†๋‹ค. ์˜๋„๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚ด๋Š” '์˜์กด๊ด€๊ณ„ ์„ค์ •'์ด๋ผ๋Š” ์šฉ์–ด๋„ ๋‚˜์˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
- ํ† ๋น„์˜ ์Šคํ”„๋ง 3.1์—์„œ ๋ฐœ์ทŒ


 

๐Ÿ’ก 2. IoC(Inversion of Control) : ์ œ์–ด์˜ ์—ญ์ „

> 2-1. ์ œ์–ด์˜ ์—ญ์ „์€ ๋ฌด์—‡์ธ๊ฐ€?

IoC๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์—์„œ ํด๋ž˜์Šค๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋Š์Šจํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์ œ์–ด๋ฅผ ๋ฐ˜์ „์‹œํ‚ฌ ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋Š” ๋””์ž์ธ ์›์น™์ด๋‹ค.

IoC์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ๊ต‰์žฅํžˆ ํ—ท๊ฐˆ๋ฆฌ๋Š” ์ด์œ ๋Š”, ์šฉ์–ด๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ฒ”์œ„๊ฐ€ ๊ต‰์žฅํžˆ ๊ด‘๋ฒ”์œ„ํ•˜๋‹ค.

๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์ œ์–ด๋ฅผ ๋ฐ˜์ „์‹œํ‚ค๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋Š” IoC๋ผ๋Š” ๋‹จ์–ด๋Š”,

๊นŠ๊ฒŒ๋Š” ์ข…์†์„ฑ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด ์ƒ์„ฑ ์ œ์–ด๋ฅผ ์—ญ์ „ํ•˜๋Š” ๊ฒƒ(์ œ์–ด๋ฅผ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์œ„์ž„)์— ์“ฐ์ด๋Š” ์ž๋ฃŒ๋„ ๋ณด์•˜๊ณ ,

์–•๊ฒŒ๋Š” ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ IoC ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์— ์“ฐ์ด๋Š” ์ž๋ฃŒ๋„ ๋ณด์•˜๋‹ค.

์ข…์†์„ฑ์„ ๊ฐ€์ง„ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด ์ƒ์„ฑ ์ œ์–ด๋ฅผ ์—ญ์ „ํ•˜๋Š” ๊ฒƒ(์ œ์–ด๋ฅผ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์œ„์ž„)์ด IoC ์›์น™์„ ๋”ฐ๋ฅธ ๊ฒƒ ์ค‘์˜ ํ•˜๋‚˜๋ฅผ ์ž˜ ๋‚˜ํƒ€๋‚ด๋Š” ๋ง์ด๊ณ ,

๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ IoC ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์€ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ IoC ์›์น™๊ณผ DI ํŒจํ„ด์„ ์ผ์ผํžˆ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋„๋ก ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•œ ๋ง์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

> 2-2. Spring์—์„œ์˜ DI์™€ IoC / DI(IoC) Container์˜ ์žฅ์ 

์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด, ์Šคํ”„๋ง์—์„œ๋Š” IoC ์›์น™๊ณผ DI ํŒจํ„ด์„ ์ผ์ผํžˆ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋„๋ก IoC ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์Šคํ”„๋ง์—์„œ DI์™€ IoC๊ฐ€ ๋”ฐ๋ผ๋‹ค๋‹Œ ์ด์œ ๋Š”, IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ IoC ์›์น™์„ ๋”ฐ๋ฅธ ๋‹ค๋ฅธ ํŒจํ„ด์„ ๋Œ€์‹ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ IoC, DIP, DI์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ์šฐ๋ฆฌ ๋Œ€์‹  ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด์ฒ˜๋Ÿผ IoC๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ง์˜ ๋ฒ”์œ„๊ฐ€ ๋„ˆ๋ฌด ๋„“๊ธฐ ๋•Œ๋ฌธ์—, DI Container๋ผ๊ณ  ํ‘œ๊ธฐํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

ํ•œ ๊ฐ€์ง€ ์งš๊ณ  ๋„˜์–ด๊ฐˆ ๊ฒƒ์€ ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•˜๋Š” IoC๋ผ๋Š” ์šฉ์–ด์ธ๋ฐ, IoC๊ฐ€ ๋งค์šฐ ๋Š์Šจํ•˜๊ฒŒ ์ •์˜๋ผ์„œ ํญ๋„“๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด๋ผ๋Š” ์ ์ด๋‹ค. ๋•Œ๋ฌธ์— ์Šคํ”„๋ง์„ IoC ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ ๋งŒ ํ•ด์„œ๋Š” ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ํŠน์ง•์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์Šคํ”„๋ง์ด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์ฒ˜๋Ÿผ ์„œ๋ฒ„์—์„œ ๋™์ž‘ํ•˜๋Š” ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ๋ผ๋Š” ๋œป์ธ์ง€, ์•„๋‹ˆ๋ฉด ๋‹จ์ˆœํžˆ IoC ๊ฐœ๋…์ด ์ ์šฉ๋œ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์„ ์ด์šฉํ•ด ๋งŒ๋“ค์–ด์ง„ ํ”„๋ ˆ์ž„์›Œํฌ์ธ์ง€, ์•„๋‹ˆ๋ฉด ๋˜ ๋‹ค๋ฅธ IoC ํŠน์ง•์„ ์ง€๋‹Œ ๊ธฐ์ˆ ์ด๋ผ๋Š” ๊ฒƒ์ธ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๋‹ค. ๊ทธ๋ž˜์„œ ์ƒˆ๋กœ์šด ์šฉ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ํƒ์›”ํ•œ ์žฌ๋Šฅ์ด ์žˆ๋Š” ๋ช‡๋ช‡ ์‚ฌ๋žŒ์˜ ์ œ์•ˆ์œผ๋กœ ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” IoC ๋ฐฉ์‹์˜ ํ•ต์‹ฌ์„ ์งš์–ด์ฃผ๋Š” ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…(Dependency Injection)์ด๋ผ๋Š”, ์ข€ ๋” ์˜๋„๊ฐ€ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚˜๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์Šคํ”„๋ง IoC ๊ธฐ๋Šฅ์˜ ๋Œ€ํ‘œ์ ์ธ ๋™์ž‘์›๋ฆฌ๋Š” ์ฃผ๋กœ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค. ๋ฌผ๋ก  ์Šคํ”„๋ง์ด ์ปจํ…Œ์ด๋„ˆ์ด๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ˆ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘์›๋ฆฌ๊ฐ€ ๋ชจ๋‘ IoC ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์Šคํ”„๋ง์ด ์—ฌํƒ€ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์ฐจ๋ณ„ํ™”๋ผ์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์€ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ถ„๋ช…ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚œ๋‹ค. ๊ทธ๋ž˜์„œ ์ดˆ๊ธฐ์—๋Š” ์ฃผ๋กœ IoC ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋˜ ์Šคํ”„๋ง์ด ์ง€๊ธˆ์€ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ๊ทธ ์˜๋ฌธ์•ฝ์ž๋ฅผ ์จ์„œ DI ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ๋” ๋งŽ์ด ๋ถˆ๋ฆฌ๊ณ  ์žˆ๋‹ค.
- ํ† ๋น„์˜ ์Šคํ”„๋ง 3.1์—์„œ ๋ฐœ์ทŒ

 

์—ฌ๊ธฐ๊นŒ์ง€ ์Šคํ”„๋ง์ด DI Container๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ์—๊ฒŒ ๋ฌด์—‡์„ ์ œ๊ณตํ•˜๋Š”์ง€ ์•Œ์•˜๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ์ œ๊ณตํ•ด์•ผ ์Šคํ”„๋ง์˜ DI Container๊ฐ€ IoC, DIP, DI์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ์ œ๊ณตํ• ๊นŒ? ๋˜ ์–ด๋–ป๊ฒŒ ์ด๋Ÿฌํ•œ ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์„๊นŒ?

์ด๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด Spring Bean๋ถ€ํ„ฐ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์˜ค๋Š˜์€ DI์™€ IoC์— ๋Œ€ํ•œ ์ค‘์ ์ ์ธ ์„ค๋ช…์ด๋ฏ€๋กœ, Spring Bean์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ๋งŒ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ฉด, Spring Bean์€ DI ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ด ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ฐ์ฒด๋ฅผ DI ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์˜์กด ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…์‹œํ‚จ๋‹ค.

์‚ฌ์šฉ์ž์˜ ์‹œ๊ฐ„ ์ ˆ์•ฝ๊ณผ ๋ฐ˜๋ณต ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ DI๋ฅผ ๋Œ€์‹ ํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์€, ๋‚ด๊ฐ€ ๋งŒ๋“  ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„œ๋„ Spring Bean์œผ๋กœ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ด Spring Bean์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜์กด๊ด€๊ณ„์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ Spring์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋Š” XML์„ ํ†ตํ•ด์„œ, ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด์„œ, ์ž๋ฐ”๋ฅผ ํ†ตํ•ด์„œ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

์œ„ ๋‹ค์ด์–ด๊ทธ๋žจ์€, Spring์˜ DI Container๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ถ”์ƒํ™”ํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์ด๋‹ค.

org.springframework.context.ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค๋Š” DI Container๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํด๋ž˜์Šค๋“ค์€ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ๊ฒฐํ•ฉ๋˜์–ด, ApplicationContext๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ดˆ๊ธฐํ™”๋œ ์ดํ›„์—๋Š” ๋“œ๋””์–ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ณ  ์˜จ์ „ํžˆ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋œ๋‹ค.

์ธ์Šคํ„ด์Šค ์ƒ์„ฑ๋ถ€ํ„ฐ ์†Œ๋ฉธ๊นŒ์ง€์˜ ์ธ์Šคํ„ด์Šค ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋Œ€์‹  ํ•ด์ฃผ๋Š” ๊ฒƒ์€, ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ต‰์žฅํžˆ ๋งค๋ ฅ์ ์ธ ์žฅ์ ์ด๋‹ค. ๊ฐ์ฒด๊ด€๋ฆฌ ์ฃผ์ฒด๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ(Container)๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋Š” ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • IoC ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ์ฑ…์ž„์ง€๊ณ , ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
  • POJO์˜ ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”, ์„œ๋น„์Šค, ์†Œ๋ฉธ์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง„๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋“ค์ด ์ง์ ‘ POJO๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ๋งก๊ธด๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ์ฒด ์ƒ์„ฑ ์ฝ”๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ TDD๊ฐ€ ์šฉ์ดํ•˜๋‹ค

 

> 2-3. ์™œ Spring์€ 'ํ”„๋ ˆ์ž„์›Œํฌ'์ธ๊ฐ€?

'ํ”„๋ ˆ์ž„์›Œํฌ'์™€ '๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ'์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ๋Š” IoC์ด๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ๋ฆ„์„ ์ง์ ‘ ์ œ์–ดํ•œ๋‹ค. ๋‹จ์ง€ ๋™์ž‘ํ•˜๋Š” ์ค‘์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์„ ๋•Œ ๋Šฅ๋™์ ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋ฟ์ด๋‹ค. ๋ฐ˜๋ฉด์— ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ฑฐ๊พธ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๋ณดํ†ต ํ”„๋ ˆ์ž„์›Œํฌ ์œ„์— ๊ฐœ๋ฐœํ•œ ํด๋ž˜์Šค๋ฅผ ๋“ฑ๋กํ•ด๋‘๊ณ , ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ๋ฆ„์„ ์ฃผ๋„ํ•˜๋Š” ์ค‘์— ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์ด๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ์—๋Š” ๋ถ„๋ช…ํ•œ ์ œ์–ด์˜ ์—ญ์ „ ๊ฐœ๋…์ด ์ ์šฉ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์งœ๋†“์€ ํ‹€์—์„œ ์ˆ˜๋™์ ์œผ๋กœ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค.
- ํ† ๋น„์˜ ์Šคํ”„๋ง 3.1 ์ค‘์—์„œ ๋ฐœ์ทŒ.


๐Ÿ’ก 3. ์š”์•ฝ

- IoC๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ๋ชจ๋“ˆ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ œ์–ด์˜ ๋ฐ˜์ „์„ ๊ถŒ์žฅํ•˜๋Š” ๋””์ž์ธ ์›์น™์— ํ•ด๋‹นํ•˜๊ณ , DI๋Š” IoC ์›์น™์„ ๊ตฌํ˜„ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋กœ ์ƒ์„ฑ์ž์™€ setter method๋ฅผ ํ†ตํ•ด ์˜์กด ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•จ์œผ๋กœ์จ ๋ชจ๋“ˆ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ์ค„์ธ๋‹ค.

- ์Šคํ”„๋ง์€ ์ด๋Ÿฌํ•œ IoC ์›์น™๊ณผ DI ๊ตฌํ˜„์„ ๋Œ€์‹  ํ•ด์ฃผ๋Š” IoC ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

- ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ๋ถ€ํ„ฐ ์†Œ๋ฉธ๊นŒ์ง€์˜ ์ธ์Šคํ„ด์Šค ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋Œ€์‹  ํ•ด์ฃผ๋Š” ๊ฒƒ์€, ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ต‰์žฅํžˆ ๋งค๋ ฅ์ ์ธ ์žฅ์ ์ด๋‹ค. ๊ฐ์ฒด๊ด€๋ฆฌ ์ฃผ์ฒด๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ(Container)๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋Š” ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


๐Ÿ˜Ž ์ฐธ๊ณ  ์ž๋ฃŒ ์ถœ์ฒ˜

[๋„์„œ] ํ† ๋น„์˜ ์Šคํ”„๋ง 3.1 vol1. ์Šคํ”„๋ง์˜ ์ดํ•ด์™€ ์›๋ฆฌ

[๋งํฌ] https://sehun-kim.github.io/sehun/springbean-lifecycle/#2 ([Spring] ์˜ˆ์ œ๋กœ ๋ฐฐ์›Œ๋ณด๋Š” IoC/DI & Spring Bean Life Cycle)

[๋งํฌ] https://devlog-wjdrbs96.tistory.com/165 ([Spring] ์Šคํ”„๋ง ์˜์กด์„ฑ ์ฃผ์ž…(DI) ์ด๋ž€?)

[๋งํฌ] https://velog.io/@meme2367/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%8A%B8%EB%9D%BC%EC%9D%B4%EC%95%B5%EA%B8%80Spring-Triangle-IoC-AOP-PSA (์Šคํ”„๋ง ํŠธ๋ผ์ด์•ต๊ธ€(Spring Triangle) - IoC, AOP, PSA)

[๋งํฌ] https://prohannah.tistory.com/157 (Java๋กœ ์•Œ์•„๋ณด๋Š” IoC, DIP, DI, IoC Container)

[๋งํฌ] https://johngrib.github.io/wiki/inversion-of-control/ (IoC, Inversion of Control)

[๋งํฌ] https://dev-coco.tistory.com/80 ([Spring] IoC ์ปจํ…Œ์ด๋„ˆ)

 

์•„์ง ๋ฏธํกํ•˜์ง€๋งŒ ์˜์š•๋งŽ์€ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.
๊ธ€ ์ค‘์— ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ๊ฑฐ๋‚˜, ์ง€์ ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด
์ข‹์€ ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๋ฐ˜์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค :)