[Spring] DI / IoC
in SPRING
Spring - DI / IoC
IoC
IoC๋ Inversion of Control์ ์ค์๋ง๋ก ํ๊ธ๋ก ๋ฒ์ญํ๋ฉด ์ ์ด์ ์ญ์ ์ด๋ผ๋ ๋ง์ด๋ค.
โ์ ์ด์ ์ญ์ โ ์ด๋ผ๋ ์๋ฏธ๋ ๋ง ๊ทธ๋๋ก ๋ฉ์๋๋ ๊ฐ์ฒด์ ํธ์ถ์์ ์ ๊ฐ๋ฐ์๊ฐ ๊ฒฐ์ ํ๋ ๊ฒ์ด ์๋๋ผ,
์ธ๋ถ์์ ๊ฒฐ์ ๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ฐ์ฒด์ ์์ฑ, ์๋ช ์ฃผ๊ธฐ์ ๊ด๋ฆฌ๊น์ง ๋ชจ๋ ๊ฐ์ฒด์ ๋ํ ์ ์ด๊ถ์ด ๋ฐ๋์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ปดํฌ๋ํธ ์์กด๊ด๊ณ ๊ฒฐ์ (component dependency resolution),
์ค์ (configuration) ๋ฐ ์๋ช ์ฃผ๊ธฐ(lifecycle)๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋์์ธ ํจํด(Design Pattern)์ด๋ค.
์ ์ด์ ์ญ์ ๊ฐ๋ ์ ์ด๋ฏธ ํญ๋๊ฒ ์ ์ฉ๋์ด ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๋ฐ ํ๋ก๊ทธ๋จ์ main() ๋ฉ์๋์์ ์์ํด์
๊ฐ๋ฐ์๊ฐ ๋ฏธ๋ฆฌ ์ ํ ์์๋ฅผ ๋ฐ๋ผ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์คํ๋๋ค.
๊ทธ๋ฐ๋ฐ ์๋ธ๋ฆฟ์ ์๊ฐํด๋ณด์. ์๋ธ๋ฆฟ์ ๊ฐ๋ฐํด์ ์๋ฒ์ ๋ฐฐํฌํ ์๋ ์์ง๋ง, ๋ฐฐํฌํ๊ณ ๋์๋ ๊ฐ๋ฐ์๊ฐ
์ง์ ์ ์ดํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ค. ๋์ ์๋ธ๋ฆฟ์ ๋ํ ์ ์ด ๊ถํ์ ๊ฐ์ง ์ปจํ ์ด๋๊ฐ ์ ์ ํ ์์ ์
์๋ธ๋ฆฟ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
์ด ๋ฐฉ์์ ๋๋ถ๋ถ์ ํ๋ ์์ํฌ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก,
๊ฐ๋ฐ์๋ ํ์ํ ๋ถ๋ถ์ ๊ฐ๋ฐํด์ ๋ผ์ ๋ฃ๊ธฐ์ ํํ๋ก ๊ฐ๋ฐํ๊ณ ์คํํ๊ฒ ๋๋ค.
ํ๋ ์์ํฌ๊ฐ ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ์๋ ํ๋ ์์ํฌ์ ํ์ํ ๋ถํ์ ๊ฐ๋ฐํ๊ณ ,
์กฐ๋ฆฝํ๋ ๋ฐฉ์์ ๊ฐ๋ฐ์ ํ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ์กฐ๋ฆฝ๋ ์ฝ๋์ ์ต์ข ํธ์ถ์ ๊ฐ๋ฐ์์ ์ํด์ ์ ์ด๋๋ ๊ฒ์ด ์๋๋ผ,
ํ๋ ์์ํฌ์ ๋ด๋ถ์์ ๊ฒฐ์ ๋ ๋๋ก ์ด๋ค์ง๊ฒ ๋๋๋ฐ, ์ด๋ฌํ ํ์์ โ์ ์ด์ ์ญ์ โ์ด๋ผ๊ณ ํํํ๋ค.
์คํ๋ง์ ๊ทธ ์์ฒด๊ฐ โ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ ์ ์๋๋ก ๋ง๋ค์ด์ก๋คโ ๋ผ๋ ๋ป์ด๋ค.
IoC๊ฐ ์๋๊ฒฝ์ฐ - new ๋ฐฉ์์ ์จ์ ๊ฐ์ฒด๊ฐ ํ์ํ ๋๋ง๋ค ์์ฑํด์ผ ํ๋ค.
IoC์ธ๊ฒฝ์ฐ - new ๋ฐฉ์์ ์จ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์์๋ค.
IoC ์ปจํ ์ด๋
์ปจํ ์ด๋๋ ๋ณดํต ์ธ์คํด์ค์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์์ฑ๋ ์ธ์คํด์ค๋ค์๊ฒ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋กํ๋ ๊ฒ์ด๋ผ ํ ์ ์๋ค.
๋ค์๋งํด, ์ปจํ ์ด๋๋ ์์ฑํ ์ฝ๋์ ์ฒ๋ฆฌ๊ณผ์ ์ ์์๋ฐ์ ๋ ๋ฆฝ์ ์ธ ์กด์ฌ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์ปจํ ์ด๋๋ ์ ์ ํ ์ค์ ๋ง ๋์ด์๋ค๋ฉด ๋๊ตฌ์ ๋์์์ด๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ค์ค๋ก ์ฐธ์กฐํ ๋ค ์์์ ๊ฐ์ฒด์ ์์ฑ๊ณผ ์๋ฉธ์ ์ปจํธ๋กคํด์ค๋ค.
์คํ๋ง ํ๋ ์์ํฌ๋ ๊ฐ์ฒด์ ๋ํ ์์ฑ ๋ฐ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์๋ค. ์ฆ, IoC ์ปจํ ์ด๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- IoC ์ปจํ ์ด๋๋ ๊ฐ์ฒด์ ์์ฑ์ ์ฑ ์์ง๊ณ , ์์กด์ฑ์ ๊ด๋ฆฌํ๋ค.
- POJO์ ์์ฑ, ์ด๊ธฐํ, ์๋น์ค, ์๋ฉธ์ ๋ํ ๊ถํ์ ๊ฐ์ง๋ค.
- ๊ฐ๋ฐ์๋ค์ด ์ง์ POJO๋ฅผ ์์ฑํ ์ ์์ง๋ง ์ปจํ ์ด๋์๊ฒ ๋งก๊ธด๋ค.
- ๋น(Bean) : ์คํ๋ง์ด ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์ง์ ๋ง๋ค๊ณ ๊ด๊ณ๋ฅผ ๋ถ์ฌํ๋ ์ค๋ธ์ ํธ
- ๋น ํฉํ ๋ฆฌ(Bean Factory) : ๋น(์ค๋ธ์ ํธ)์ ์์ฑ๊ณผ ๊ด๊ณ ์ค์ ์ ์ด๋ฅผ ๋ด๋นํ๋ IoC์ค๋ธ์ ํธ. ์ข ๋ ํ์ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ(application context)๋ฅผ ์ฃผ๋ก ์ฌ์ฉ
- ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ: (IoC ์ปจํ ์ด๋ or ์คํ๋ง ์ปจํ ์ด๋) DI๋ฅผ ์ํ ๋น ํฉํ ๋ฆฌ์ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๋ฐ ํ์ํ ์ฌ๋ฌ ๊ฐ์ง ์ปจํ ์ด๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๊ฒ
- ์ค์ ์ ๋ณด/์ค์ ๋ฉํ์ ๋ณด : ๊ตฌ์ฑ์ ๋ณด or ํ์์ ๋ณด (XML)
- ์คํ๋ง ์ปจํ ์ด๋(IoC ์ปจํ ์ด๋) : IoC ๋ฐฉ์์ผ๋ก ๋น์ ๊ด๋ฆฌํ๋ค๋ ์๋ฏธ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ ๋น ํฉํ ๋ฆฌ๋ฅผ ์๋ฏธ
IoC์ปจํ
์ด๋๋ ๋ค๋ฅธ ์ฉ์ด๋ก ๋น ํฉํ ๋ฆฌ(Bean Factory), ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ(Application Context) ๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.์คํ๋ง์ IoC ์ปจํ
์ด๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ๋ฅผ ๋งํ๋ค.
* ๋น ํฉํ ๋ฆฌ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ ๋๋ IoC์ปจํ
์ด๋๋ผ ๋งํ๊ธฐ๋ ํ์ง๋ง, ์ฌ์ค ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ๋ ๋น์ ์ข ๋ ํ์ฅํ ๊ฐ๋
์ด๋ค.
* ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ๋ ๊ทธ ์์ฒด๋ก IoC์ DI๋ฅผ ์ํ ๋น ํฉํ ๋ฆฌ(Bean Factory)์ด๋ฉด์ ๊ทธ ์ด์์ ๊ธฐ๋ฅ์ ๊ฐ์ง๋ค.
* ๋นํฉํ ๋ฆฌ์ ์ดํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ๋ ๊ฐ๊ฐ BeanFactory, ApplicationContext ๋ ๊ฐ์ ์ธํฐํ์ด์ค๋ก ์ ์ํ๋ค.
* ApplicationContext ์ธํฐํ์ด์ค๋ BeanFactory ์ธํฐํ์ด์ค๋ฅผ ์์ํ ์๋ธ์ธํฐํ์ด์ค์ด๋ค.
* ์ค์ ๋ก ์คํ๋ง ์ปจํ
์ด๋ ๋๋ IoC ์ปจํ
์ด๋๋ผ๊ณ ๋งํ๋ ๊ฒ์ ๋ฐ๋ก ์ด ApplicationContext ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ์ค๋ธ์ ํธ์ด๋ค.
* ์ปจํ
์ด๋๊ฐ ๋ณธ๊ฒฉ์ ์ธ IoC ์ปจํ
์ด๋๋ก์ ๋์ํ๋ ค๋ฉด POJOํด๋์ค์ ์ค์ ๋ฉํ์ ๋ณด๊ฐ ํ์ํ๋ค.
(์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์
: POJO ํด๋์ค์ ์ค์ ๋ฉํ์ ๋ณด๋ฅผ ์ด์ฉํด IoC ์ปจํ
์ด๋๊ฐ ๋ง๋ค์ด์ฃผ๋ ์ค๋ธ์ ํธ์ ์กฐํฉ์ด๋ค.)
IoC ์ปจํ ์ด๋
์ด๋ ํ ๊ฐ์ฒด์ ๋ช ์ธ์๋ฅผ ์์ฑํ๊ณ , ์คํ๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํด๋น ๋ช ์ธ๋๋ก ๊ฐ์ฒด๋ฅผ ์์ฑ. ์์ฑ๋ ๊ฐ์ฒด(๊ทธ๋ฆฌ๊ณ ๋ํ๋์)๋ค์ ๋ณด๊ดํ๋ ๊ณต๊ฐ์ ์๋ฏธํจ
DL(Dependency Lookup) ๊ณผ DI(Dependency Injection)
- DL : ์ ์ฅ์์ ์ ์ฅ๋์ด ์๋ Bean์ ์ ๊ทผํ๊ธฐ ์ํด ์ปจํ ์ด๋๊ฐ ์ ๊ณตํ๋ API๋ฅผ ์ด์ฉํ์ฌ Bean์ Lookup ํ๋ ๊ฒ
- DI : ๊ฐ ํด๋์ค๊ฐ์ ์์กด๊ด๊ณ๋ฅผ ๋น ์ค์ (Bean Definition) ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ปจํ
์ด๋๊ฐ ์๋์ผ๋ก ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ
- Setter Injection
- Constructor Injection
- Method Injection
DL ์ฌ์ฉ์ ์ปจํ ์ด๋ ์ข ์์ด ์ฆ๊ฐํ์ฌ, ์ฃผ๋ก DI๋ฅผ ์ฌ์ฉํจ.
IoC ์ฉ์ด ์ ๋ฆฌ
bean
: ์คํ๋ง์์ ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์ง์ ๋ง๋ค์ด ๊ด๊ณ๋ฅผ ๋ถ์ฌํ๋ ์ค๋ธ์ ํธ Java Bean, EJB์ Bean๊ณผ ๋น์ทํ ์ค๋ธ์ ํธ ๋จ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ปดํฌ๋ํธ์ด๋ค. ํ์ง๋ง ์คํ๋ง์ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ง๋ค์ด์ง๋ ๋ชจ๋ ์ค๋ธ์ ํธ๊ฐ ๋น์ ์๋๋ค. ์คํ๋ง์ ๋น์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์์ฑํ๊ณ ๊ด๊ณ์ค์ , ์ฌ์ฉ์ ์ ์ดํด์ฃผ๋ ์ค๋ธ์ ํธ๋ฅผ ๋งํ๋ค.bean factory
: ์คํ๋ง์ IoC๋ฅผ ๋ด๋นํ๋ ํต์ฌ ์ปจํ ์ด๋ Bean์ ๋ฑ๋ก/์์ฑ/์กฐํ/๋ฐํ/๊ด๋ฆฌ ํ๋ค. ๋ณดํต bean factory๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ์ง ์๊ณ ์ด๋ฅผ ํ์ฅํ application context๋ฅผ ์ด์ฉํ๋ค. BeanFactory๋ bean factory๊ฐ ๊ตฌํํ๋ interface์ด๋ค. (getBean()๋ฑ์ ๋ฉ์๋๊ฐ ์ ์๋์ด ์๋ค.)application context
: bean factory๋ฅผ ํ์ฅํ IoC ์ปจํ ์ด๋ Bean์ ๋ฑ๋ก/์์ฑ/์กฐํ/๋ฐํ/๊ด๋ฆฌ ๊ธฐ๋ฅ์ bean factory์ ๊ฐ์ง๋ง, ์ถ๊ฐ์ ์ผ๋ก spring์ ๊ฐ์ข ๋ถ๊ฐ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค. ApplicationContext๋ application context๊ฐ ๊ตฌํํด์ผ ํ๋ interface์ด๋ฉฐ, BeanFactory๋ฅผ ์์ํ๋ค.configuration metadata
: application context ํน์ bean factory๊ฐ IoC๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฉํ์ ๋ณด ์คํ๋ง์ ์ค์ ์ ๋ณด๋ ์ปจํ ์ด๋์ ์ด๋ค ๊ธฐ๋ฅ์ ์ธํ ํ๊ฑฐ๋ ์กฐ์ ํ๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ์ง๋ง ์ฃผ๋ก bean์ ์์ฑ/๊ตฌ์ฑํ๋ ์ฉ๋๋ก ์ฌ์ฉํ๋ค.container (ioC container)
: IoC ๋ฐฉ์์ผ๋ก bean์ ๊ด๋ฆฌํ๋ค๋ ์๋ฏธ์์ bean factory๋ application context๋ฅผ ๊ฐ๋ฆฌํจ๋ค. application context๋ ๊ทธ ์์ฒด๋ก ApplicationContext ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ค๋ธ์ ํธ๋ฅผ ๋งํ๊ธฐ๋ ํ๋๋ฐ, ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํต ์ฌ๋ฌ๊ฐ์ ApplicationContext ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๋ค. ์ด๋ฅผ ํต์นญํด์ spring container๋ผ๊ณ ๋ถ๋ฅผ ์ ์๋ค.
DI
DI๋ Dependency Injection์ ์ค์๋ง๋ก ํ๊ธ๋ก ๋ฒ์ญํ๋ฉด ์์กด์ฑ ์ฃผ์ ์ด๋ผ๋ ๋ง์ด๋ค.
DI๋ฅผ ๋ค์ด๊ฐ๊ธฐ ์ ์, ์์กด์ฑ์ด๋ผ๋ ๋ง๋ถํฐ ํ๋ฒ ๋ณด์
* ์์ฌ ์ฝ๋
์ด์ ์๊ฐ ์๋์ฐจ๋ฅผ ์์ฐํ๋ค.
์๋์ฐจ๋ ๋ด๋ถ์ ์ผ๋ก ํ์ด์ด๋ฅผ ์์ฐํ๋ค.
* Java ํํ
new Car();
Car ๊ฐ์ฒด ์์ฑ์์์ new Tire();
* ์ ๋ง ๊ฐ๋จํ ์์กด์ฑ์ด๋?
์์กด์ฑ์ new ์ด๋ค.
new๋ฅผ ์คํํ๋ Car์ Tire ์ฌ์ด์์ Car๊ฐ Tire์ ์์กดํ๋ค๋ผ๊ณ ํ๋ค.
์ผ์ฒดํ
- Composition : HAS-A ๊ด๊ณ
- A๊ฐ B๋ฅผ ์์ฑ์์์ ์์ฑํ๋ ๊ด๊ณ
โ์์กด์ฑ ์ฃผ์ โ์ ์ ์ด์ ์ญํ์ด ์ผ์ด๋ ๋ ์คํ๋ง์ด ๋ด๋ถ์ ์๋ ๊ฐ์ฒด๋ค๊ฐ์ ๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ ๋ ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ด๋ค.
์๋ฐ์์๋ ์ผ๋ฐ์ ์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด์ ์์กด์ ์ธ ๊ฐ์ฒด์ ๊ด๊ณ๋ฅผ ์ต๋ํ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ค.
๋ถ๋ฆฌ / ๋ํน(๋ถ์ฐฉ) ํ
- Association ๊ด๊ณ
- A๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๋ ์์ด ๋ง๋ B ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ
๊ทธ๋ฆผ ์ค๋ช
A๋ฅผ ์ค๋งํธํฐ, B๋ฅผ ๋ฐฐํฐ๋ฆฌ๋ฆฌ๋ผ ํ๋ฉด,
์ผ์ฒดํ ์ค๋งํธํฐ (์์ดํฐ)์ ๋ฐ๋ก ์ ์์ ์ผ๋ ๋์ง๋ง,
๋ฐฐํฐ๋ฆฌ ํ๋ถ์ฐฉ ํํ์ ์ค๋งํธํฐ (๊ฐค๋ญ์S)์ ์ฌ๊ธฐ์๋ ๋ฐฐํฐ๋ฆฌ๋ฅผ ๋ฃ๊ณ , ์ ์์ ๋ฃ์ด์ผ ํจ.
์ผ์ฒดํ์ A๋ผ๋ ๊ฐ์ฒด์ ๋ด๋ถ ํ๋ก์ธ์ค์ ๋ํด ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ผ๋ฉฐ, ๋ถ๋ฆฌํ์ A์ B๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ธํ
ํด ์ฃผ์ด์ผ ํจ. ๋จ, ๋ถ๋ฆฌํ์ ๋ด๊ฐ ์ํ๋ ๊ฒ(๋ค๋ฅธ ๋ฐฐํฐ๋ฆฌ)์ผ๋ก ๋ฐ๊พธ์ด ๋ถ์ฐฉํ ์ ์์. ์ด๊ฒ์ DI์ ๊ฐ๋
์ด๋ผ ๋ณด๋ฉด ๋จ.
์์กด์ฑ ์ฃผ์ ์ ๋ง ๊ทธ๋๋ก ์์กด์ ์ธ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๊ฑฐ๋ ์ ์ดํ๋ ๊ฒ์ด ์๋๋ผ,
ํน์ ๊ฐ์ฒด์ ํ์ํ ๊ฐ์ฒด๋ฅผ ์ธ๋ถ์์ ๊ฒฐ์ ํด์ ์ฐ๊ฒฐ์ํค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ฆ, ์ฐ๋ฆฌ๋ ํด๋์ค์ ๊ธฐ๋ฅ์ ์ถ์์ ์ผ๋ก ๋ฌถ์ด๋ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋ค ์ฐ๋ฉด ๋๋ ๊ฒ์ด๋ค.
๋๋จธ์ง๋ ์คํ๋ง์์ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ์์กด์ฑ ์ฃผ์ ์ผ๋ก ์ธํด ๋ชจ๋ ๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๊ณ ์ ์ฐ์ฑ์ด ๋์์ง๋ค.
- Setter Injection (Setter ๋ฉ์๋๋ฅผ ์ด์ฉํ ์์กด์ฑ ์ฝ์
) : ์์กด์ฑ์ ์
๋ ฅ ๋ฐ๋ setter ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ ํตํด ์์กด์ฑ์ ์ฃผ์
ํ๋ค.
- Constructor Injection (์์ฑ์๋ฅผ ์ด์ฉํ ์์กด์ฑ ์ฝ์
) : ํ์ํ ์์กด์ฑ์ ํฌํจํ๋ ํด๋์ค์ ์์ฑ์๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ ํตํด ์์กด์ฑ์ ์ฃผ์
ํ๋ค.
- Method Injection (์ผ๋ฐ ๋ฉ์๋๋ฅผ ์ด์ฉํ ์์กด์ฑ ์ฝ์ ) : ์์กด์ฑ์ ์ ๋ ฅ ๋ฐ๋ ์ผ๋ฐ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ ํตํด ์์กด์ฑ์ ์ฃผ์ ํ๋ค.
๋ค์ ์์ ๋ฅผ ์ดํด๋ณด์. Player ๊ฐ์ฒด์ ์๋ Weapon์ด๋ผ๋ ์์กด์ฑ ์ฃผ์ ์ ์ธํฐ๋ฅผ ํตํด์ ํ๊ณ ์๋ค. Gun์ผ๋ก ํ๋ Spike๋ก ํ๋ ๋ฌด๊ธฐ๋ฅผ ๋ฐ๊ฟ ๋ ๊ทธ ๋ฌด๊ธฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋จ์ํ ์ฃผ์ ํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
class Knife implements Weapon{
public void useWeapon() {
System.out.println("Use Knife");
}
}
class Gun implements Weapon{
public void useWeapon() {
System.out.println("Use Gun");
}
}
class Spike implements Weapon{
public void useWeapon() {
System.out.println("Use Spike");
}
}
interface Weapon {
void useWeapon();
}
public class Player {
private Weapon weapon;
Player(){
}
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
public void usePlayerWeapon() {
weapon.useWeapon();
}
}
public class Main {
public static void main(String[] args) {
/**
* ์์กด์ฑ ์ฃผ์
์ ํตํด ์์กด ์์๋ค์ ์ฝ๊ฒ ๊ฐ์ ๋ผ์ธ ์ ์๋ค.
*/
Player player = new Player();
player.setWeapon(new Gun()); // Player์ Gun ๊ฐ์ฒด๋ฅผ ํตํ ์์กด์ฑ ์ฃผ์
player.usePlayerWeapon();
player.setWeapon(new Spike()); // Player์ Spike ๊ฐ์ฒด๋ฅผ ํตํ ์์กด์ฑ ์ฃผ์
player.usePlayerWeapon();
player.setWeapon(new Knife()); // Player์ Knife ๊ฐ์ฒด๋ฅผ ํตํ ์์กด์ฑ ์ฃผ์
player.usePlayerWeapon();
}
}
์คํ๋ง์๋ ํฌ๊ฒ (1)XML๋ก ์์ฑ๋ Bean ์ ์ ํ์ผ์ ์ด์ฉํ DI
(2)์ด๋ ธํ ์ด์ ์ ์ด์ฉํ DI
(3)JavaConfig์ ์ํ DI๊ฐ ์์ต๋๋ค.
(1-1) XML config.xml
๊ฐ์ฒด์ ์์ฑ๊ณผ ๋ํน์ ๋ํ ๋ด์ฉ์ด ์์ค ์ฝ๋ ์์ ์๋ ๊ฒ์ด ์๋ ๋ณ๋์ ํ ์คํธ ํ์ผ(XML ์ค์ ํ์ผ)์ ๋ถ๋ฆฌํ์ฌ ์กด์ฌ. (JAVA์์ค ์ปดํ์ผ ์์ด XML ๋ณ๊ฒฝ๋ง์ผ๋ก ๋ด์ฉ ๋ณ๊ฒฝ ๊ฐ๋ฅ)
XML (์คํ๋ง DI) config.xml
<bean id=โrecordโ class=โdi.SprRecordโ></bean> // ๋น ๊ฐ์ฒด ์์ฑ
<bean id=โviewโ class=โdi.SprRecordViewโ> // ๋น ๊ฐ์ฒด ์์ฑ
<property name=โrecordโ ref=โrecordโ></property> // setRecord() ํธ์ถ
</bean>
XML (์คํ๋ง DI) : ๊ฐ์ฒด ์์ฑ ์, ํจํค์ง๋ช
์ ํฌํจํ ํ ํด๋์ค ๋ค์ ์์ฑ.
XML์ ์์ฑ๋ ๋ช
์ธ์๋ฅผ ๋ณด๊ณ , IoC์ปจํ
์ด๋๊ฐ ๊ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ๊ฐ์ ์ฃผ์
ํด์ค.
์ฌ๊ธฐ์ ApplicationContext ๊ฐ IoC์ปจํ
์ด๋ ์ญํ ์ ํจ.
JAVA
// XML์ ํ์ฑํ์ฌ ์ปจํ
์ด๋์ ๋ด๋ ์์
ApplicationContext ctx = new ClassPathXmlApplicationContext(โconfig.xmlโ);
RecordView = (RecordView) ctx.getBean(โviewโ);
(1-2) XML(Bean) Sample
* ๋น(Bean) ๊ฐ์ฒด๋ ๋ฐ๋์ ํด๋์ค๋ฅผ ์ฌ์ฉ. ์ธํฐํ์ด์ค๋ ์ถ์ํด๋์ค๋ ๊ฐ์ฒด ์์ฑ์ด ๋ถ๊ฐ๋ฅํจ.
* ๋น ๊ฐ์ฒด ์์ฑ, ๊ฐ์ฒด ์ด๊ธฐํ, ๊ฐ์ฒด ๊ฐ(๋๋ ๋ ํผ๋ฐ์ค) ์ฃผ์
.
1)
<bean id=โrecordโ name=โr1,r2 r3;r4โ class=โdi.SprRecordโ>
<property name=โkorโ value=โ20โ></property>
</bean>
2)
<bean id=โrecordโ name=โr1,r2 r3;r4โ class=โdi.SprRecordโ>
<constructor-arg value=โ20โ></constructor-arg>
</bean>
3)
<bean id=โrecordโ name=โr1,r2 r3;r4โ class=โdi.SprRecordโ>
<constructor-arg name=โkorโ value=โ20โ></constructor-arg>
</bean>
4)
<bean id=โrecordโ โ name=โr1,r2 r3;r4โ class=โdi.SprRecordโ
p:kor=โ50โ p:eng=โ60โ p:math=โ70โ>
5)
<bean id=โviewโ class=โdi.SprRecordViewโ>
<property name=โrecordโ ref=โrecordโ></property>
</bean>
id : ๋น ๊ฐ์ฒด ๊ณ ์ ์ด๋ฆ (์ ๊ทผ ๊ฐ๋ฅ์)
name : ๊ฐ์ฒด์ ์ด๋ฆ(๋ณ์นญ)
class : ์์ฑํ ํด๋์ค
constructor-arg : ์ด๊ธฐ๊ฐ ์ค์ (์์ฑ์ ํจ์ ์ฌ์ฉ)
property : ์ด๊ธฐ๊ฐ ์ค์ (Setterํจ์ ์ฌ์ฉ)
1) ์ด๋ฆ์ด record์ธ ๋น ๊ฐ์ฒด ์์ฑ / ๋ณ๋ช
4๊ฐ : r1,r2,r3,r4 / SprReocrd ํด๋์ค ๊ฐ์ฒด ์์ฑ.
์ด๊ธฐ๊ฐ์ผ๋ก kor ๋ผ๋ ํ๋กํผํฐ์ 20๊ฐ ๋์
(setํจ์๊ฐ ์กด์ฌํด์ผ ์์ ๊ฐ์ ํ๋กํผํฐ ์ค์ ์ด ๊ฐ๋ฅ).
2) ์ด๋ฆ์ด record์ธ ๋น ๊ฐ์ฒด ์์ฑ / ์์ฑ์(์ธ์๊ฐ ํ๋์ธ)๋ฅผ ํตํด์ ๊ฐ ๋์
& ์์ฑ.
3) ์์ฑ์ ์ค์์ kor ๊ฐ์ ์
๋ ฅ๋ฐ๋ ์์ฑ์๋ฅผ ํตํด์ 20๊ฐ ๋์
ํ๊ณ , ์์ฑ.
4) 3๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋ ์์ฑ์๋ฅผ ํตํด kor = 50, eng = 60, math = 70 ๋์
& ์์ฑ.
5) ์์ฑ๋ record ๊ฐ์ฒด๋ฅผ setํจ์๋ฅผ ํตํด ํ๋กํผํฐ์ ์ ์ฅํ๊ณ SprRecordView๋ฅผ ์์ฑ.
์ฐธ๊ณ ๋ก ๊ฐ์ ๋์
ํ๋ ๊ฒฝ์ฐ์๋ value, ์ฐธ์กฐ(๋ ํผ๋ฐ์ค)๋ฅผ ๋์
ํ๋ ๊ฒฝ์ฐ์๋ ref ๋ฅผ ์ฌ์ฉ.
(2-1)์ด๋ ธํ ์ด์ ์ ์ด์ฉํ DI
@Autowired์ @Component
์ธ์คํด์ค ๋ณ์ ์์ @Autowired
๋ฅผ ๋ถ์ด๋ฉด DI ์ปจํ
์ด๋๊ฐ ๊ทธ ์ธ์คํด์ค ๋ณ์์ ํ์ ๋์
ํ ์ ์๋ ํด๋์ค๋ฅผ @Component
๊ฐ ๋ถ์ ํด๋์ค ์ค์์ ์ฐพ์๋ด ๊ทธ ์ธ์คํด์ค๋ฅผ ์ธ์ ์
ํด์ค๋๋ค(์ ํํ๋ Bean ์ ์์์ ํด๋์ค๋ฅผ ์ค์บํ ๋ฒ์๋ฅผ ์ ํด์ผ ํฉ๋๋ค). ์ธ์คํด์ค ๋ณ์๋ก์ ์ธ์ ์
์ ์ ๊ทผ ์ ์ด์๊ฐ private๋ผ๋ ์ธ์ ์
ํ ์ ์์ผ๋ฏ๋ก Setter ๋ฉ์๋๋ฅผ ๋ง๋ค ํ์๋ ์์ต๋๋ค. (๊ณผ๊ฑฐ์ ์บก์ํ์ ์ ๋ณด ์๋์ ๋ฐํ๋ ๊ฒ์ด ์๋๋๋ ๋
ผ์๊ฐ ์์์ง๋ง, ํ์ฌ๋ ํธ๋ฆฌํจ์ ๋ฐ๋ ค ๊ทธ๋ฐ ๋
ผ์๋ฅผ ๋ณด๊ธฐ ํ๋ค์ด์ก์ต๋๋ค.)
๋ง์ฝ @Component๊ฐ ๋ถ์ ํด๋์ค๊ฐ ์ฌ๋ฌ ๊ฐ ์์ด๋ ํ์ด ๋ค๋ฅด๋ฉด @Autowired๊ฐ ๋ถ์ ์ธ์คํด์ค ๋ณ์์ ์ธ์ ์
๋์ง ์์ต๋๋ค. ์ด๋ ๊ฒ ํ์ ๋ณด๊ณ ์ธ์ ์
ํ๋ ๋ฐฉ๋ฒ์ byType
์ด๋ผ๊ณ ํฉ๋๋ค.
@Autowired
@Autowired๋ ์ธ์คํด์ค ๋ณ์ ์์ ๋ถ์ด๋ ๊ฒ ์ธ์๋, ๋ค์๊ณผ ๊ฐ์ด ์ ๋นํ ๋ฉ์๋ ์ ์ธ ์์๋ ๋ถ์ผ ์ ์์ต๋๋ค.
@Autowired
public void setFoo(Foo foo) {
this.foo = foo;
}
@Autowired
public void setFoo(Foo foo, Bar bar) {
this.foo = foo;
this.bar = bar;
}
๋ํ ์์ฑ์์๋ ์ด์ฉํ ์ ์์ต๋๋ค.
public class Foo {
@Autowired
public Food(Bar b) {...}
}