๐ 0. ์๋ก
์คํ๋ง ํ๋ ์์ํฌ์ ๋ํด ํ์ตํ๊ณ ์ ํ๋ค๋ฉด, DI์ IoC
๋ ํ ๋ฒ์ฏค์ ๋ค์ด๋ณด์์ ํค์๋์ด๋ค.
"์คํ๋ง์ด๋ IoC์ AOP๋ฅผ ์ง์ํ๋ ๊ฒฝ๋์ ์ปจํ ์ด๋ ํ๋ ์์ํฌ์ด๋ค." - ์คํ๋ง์ ๋ํ ํ ์ค ์ค๋ช
์คํ๋ง์ 3๋ ์์๋ฅผ ๋ํ๋ด๋ ์คํ๋ง ํธ๋ผ์ด์ต๊ธ์์ ๋น๋นํ ํ ์๋ฆฌ๋ฅผ ์ฐจ์งํ๊ณ ์๋ DI/IoC๋ ์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ํ์ฉํ๊ธฐ ์ํด ๋ฐ๋์ ์์์ผ ํ๋ ๊ฐ๋ ์ด๋ค.
์ฌ์ค, DI์ IoC๋ ์คํ๋ง์๋ง ๊ตญํ๋ ๊ฐ๋ ์ด ์๋๋ค.
์ฌ๊ธฐ์ ๋ณผ ์ ์๋ฏ์ด, DI์ IoC๋ ๊ฐ๊ฐ ๋์์ธ ํจํด, ๋์์ธ ์์น์ ํด๋นํ๋ ๊ฒ์ผ๋ก
๊ผญ ์คํ๋ง์ด ์๋๋๋ผ๋ ์ง์ ๊ตฌํํ ์ ์๊ฑฐ๋, ๋ค๋ฅธ ํ๋ ์์ํฌ์์๋ ๋์ฌ ์ ์๋ ๊ฐ๋ ์ด๋ค.
๋์์ธ ์์น์ ํน์ ํ ํจ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ๊ถ์ฅํ๋ ๋ฐฉ์์ ์๋ฏธํ๋ ๊ฒ์ด๋ค. ์ฆ, best practice๋ฅผ ์งํฅํ๋ ์ง์นจ์ด์ง๋ง, ์ ํํ ์ธ๋ถ ๊ตฌํ ๋ฐฉ๋ฒ์ ์ ์ํ์ง๋ ์๋๋ค๋ ๊ฒ์ด๋ค.
๋์์ธ ํจํด์, ๋์์ธ ์์น์ ๋ํด ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ ์ํ๋ ๊ฒ์ผ๋ก ๋น๋ฒํ๊ฒ ๋ํ๋๋ ๊ตฌํ ๋ฐฉ๋ฒ์ ํจํด์ผ๋ก์จ ์ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ฐ๋ผ์, DI๋ 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์ ๋ํ ์ดํด
์์ '์์กด๊ด๊ณ'์ ๋ํด์ ๊ต์ฅํ ๋ฑ๋ฑํ๊ฒ ์ค๋ช ์ ํ์ง๋ง, ์ข์ ๋น์ ๋ฅผ ๋ฐ๊ฒฌํด ์ถ์ฒ๋ฅผ ๋จ๊ธฐ๊ณ ์ธ์ฉํ๋ ค๊ณ ํ๋ค.
์์ ๊ฐ์ด ์ฅ๋๊ฐ๋ค์ด ์๋ค. ์ฅ๋๊ฐ์ ๋ฐฐํฐ๋ฆฌ๋ฅผ ํตํด ์ ๋ ฅ์ ๊ณต๊ธ๋ฐ์์ ์๋ํ๋ ๊ตฌ์กฐ๋ก ๋์ด์๋ค.
์ฅ๋๊ฐ์ ๋ฐฐํฐ๋ฆฌ๊ฐ ์์ด์ผ ๋์ํ ์ ์์ผ๋ฏ๋ก, ์ฅ๋๊ฐ์ ๋ฐฐํฐ๋ฆฌ์ ์์กดํ๊ณ ์๋ค.
์ฆ, ๋ฐฉํฅ์ฑ์ผ๋ก ํ๊ธฐํ๋ฉด ์ฅ๋๊ฐ → ๋ฐฐํฐ๋ฆฌ๋ก ํ๊ธฐํ ์ ์๋ค.
ํด๋์ค์ ๊ด์ ์ผ๋ก ๋ณด๋ฉด, ์ฅ๋๊ฐ ํด๋์ค์ ๋ฐฐํฐ๋ฆฌ ํด๋์ค๊ฐ ์๊ณ , ์ฅ๋๊ฐ ํด๋์ค์ ๊ธฐ๋ฅ์ ์จ์ ํ๊ฒ ๊ตฌํํ๊ธฐ ์ํด์ ๋ฉค๋ฒ ๋ณ์๋ก ๋ฐฐํฐ๋ฆฌ ํด๋์ค๋ก ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๊ฐ๊ณ ์๋ค๊ณ ๋ณผ ์ ์๋ค.
์ด๋, ๋ฐฐํฐ๋ฆฌ ์ผ์ฒดํ์ธ ์ฅ๋๊ฐ๊ณผ ๋ฐฐํฐ๋ฆฌ ๋ถ๋ฆฌํ์ ์ฅ๋๊ฐ์ผ๋ก ๋๋์ด์ ธ์๋๋ฐ, ์ด ๋ ๊ฐ์ง ์ฅ๋๊ฐ์ ๋น๊ตํด๋ณด์.
๋ฐฐํฐ๋ฆฌ ์ผ์ฒดํ ์ฅ๋๊ฐ์ ์์กด๊ฐ์ฒด์ธ ๋ฐฐํฐ๋ฆฌ๋ฅผ ์ง์ ์์ฑํ ์ฅ๋๊ฐ์ ํด๋นํ๊ณ ,
๋ฐฐํฐ๋ฆฌ ๋ถ๋ฆฌํ ์ฅ๋๊ฐ์ ์์กด๊ฐ์ฒด์ธ ๋ฐฐํฐ๋ฆฌ๋ฅผ ์ฃผ์ (์ ๋ฌ)๋ฐ์ ์ฌ์ฉํ๋ ์ฅ๋๊ฐ์ ํด๋นํ๋ค.
๋ถ๋ฆฌํ ์ฅ๋๊ฐ์ ์์ฑ์๋ฅผ ํตํด ๋ฐฐํฐ๋ฆฌ๋ฅผ ์ฃผ์ ํ๊ฑฐ๋, 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 ์ปจํ ์ด๋)
์์ง ๋ฏธํกํ์ง๋ง ์์๋ง์ ๊ฐ๋ฐ์์ ๋๋ค.
๊ธ ์ค์ ํ๋ฆฐ ๋ด์ฉ์ด ์๊ฑฐ๋, ์ง์ ์ฌํญ์ด ์๋ค๋ฉด
์ข์ ๋๊ธ ๋จ๊ฒจ์ฃผ์๋ฉด ๋ฐ์ํ๊ฒ ์ต๋๋ค :)