SpringFramework 01. IoC & Container - swkim0128/PARA GitHub Wiki
IoC/DI
๊ฐ์ฒด์งํฅ ์ธ์ด์์ Object ๊ฐ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ๋ฐํ์์ ๊ฒฐ์
๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๊ฐ ๋์จํ๊ฒ ์ฐ๊ฒฐ๋จ(loose coupling)
IoC์ ๊ตฌํ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ DI
IoC ์ ํ
-
Dependency Lookup
์ปจํ ์ด๋๊ฐ lookup contenxt๋ฅผ ํตํด์ ํ์ํ Resource๋ Object๋ฅผ ์ป๋ ๋ฐฉ์.
JNDI ์ด์ธ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๋ฉด JNDI ๊ด๋ จ ์ฝ๋๋ฅผ ์ค๋ธ์ ํธ ๋ด์์ ์ผ์ผ์ด ๋ณ๊ฒฝํด ์ฃผ์ด์ผ ํจ
Lookup ํ Object๋ฅผ ํ์ํ ํ์ ์ผ๋ก Casting ํด ์ฃผ์ด์ผ ํจ.
Naming Exception์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ก์ง์ด ํ์
-
Dependency Injection
Object์ lookup ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ปจํ ์ด๋๊ฐ ์ง์ ์์กด ๊ตฌ์กฐ๋ฅผ Object์ ์ค์ ํ ์ ์๋๋ก ์ง์ ํด ์ฃผ๋ ๋ฐฉ์
Object๊ฐ ์ปจํ ์ด๋์ ์กฐ์ฌ ์ฌ๋ถ๋ฅผ ์ ํ์๊ฐ ์์
Lookup ๊ด๋ จ๋ ์ฝ๋๋ค์ด Object ๋ด์์ ์ฌ๋ผ์ง
Setter Injection๊ณผ Constructor Inject
-
Container๋?
๊ฐ์ฒด์ ์์ฑ, ์ฌ์ฉ ์๋ฉธ์ ํด๋นํ๋ ๋ผ์ดํ ์ฌ์ดํด์ ๋ด๋น
๋ผ์ดํ์ฌ์ดํด์ ๊ธฐ๋ณธ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ฉ์ ํ์ํ ์ฃผ์ ๊ธฐ๋ฅ์ ์ ๊ณต
-
Container ๊ธฐ๋ฅ
๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ
Dependency ๊ฐ์ฒด ์ ๊ณต
Thread ๊ด๋ฆฌ
๊ธฐํ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ํ์ํ ํ๊ฒฝ
-
Container ํ์์ฑ
๋น์ฆ๋์ค ๋ก์ง ์ธ์ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ๋ค์ ๋ํด์๋ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌ๋๋๋ก ํ๊ธฐ ์ํจ
์๋น์ค look up์ด๋ Configuration์ ๋ํ ์ผ๊ด์ฑ์ ๊ฐ๊ธฐ ์ํจ
์๋น์ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๊ฐ๊ฐ Factory ๋๋ Singleton ํจํด์ ์ง์ ๊ตฌํํ์ง ์์๋ ๋จ
-
IoC Container
์ค๋ธ์ ํธ์ ์์ฑ๊ณผ ๊ด๊ณ์ค์ , ์ฌ์ฉ, ์ ๊ฑฐ๋ฑ์ ์์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ๋์ ๋ ๋ฆฝ๋ ์ปจํ ์ด๋๊ฐ ๋ด๋น
์ปจํ ์ด๋๊ฐ ์ฝ๋ ๋์ ์ค๋ธ์ ํธ์ ๋ํ ์ ์ด๊ถ์ ๊ฐ๊ณ ์์ด IoC๋ผ๊ณ ๋ถ๋ฆ
์ด๋ฐ ์ด์ ๋ก, ์คํ๋ง ์ปจํ ์ด๋๋ฅผ IoC์ปจํ ์ด๋๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํจ.
์คํ๋ง์์ IoC๋ฅผ ๋ด๋นํ๋ ์ปจํ ์ด๋์๋ BeanFactory, ApplicatoinContext๊ฐ ์์.
-
Spring DI Container
Spring DI Container๊ฐ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ฅผ ๋น(Bean)์ด๋ผ ํ๊ณ , ์ด ๋น๋ค์ ์๋ช ์ฃผ๊ธฐ(Life-Cycle)๋ฅผ ๊ด๋ฆฌํ๋ ์๋ฏธ๋ก ๋นํฉํ ๋ฆฌ(BeanFactory)๋ผ ํ๋ค.
Bean Factory์ ์ฌ๋ฌ ๊ฐ์ง ์ปจํ ์ด๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ApplicationContext๋ผ ํ๋ค.
๊ฐ์ฒด ์ ์ด ๋ฐฉ์
- ๊ธฐ์กด : ํ์ํ ์์น์์ ๊ฐ๋ฐ์๊ฐ ํ์ํ ๊ฐ์ฒด ์์ฑ ๋ก์ง ๊ตฌํ
- IoC : ๊ฐ์ฒด ์์ฑ์ Container ์๊ฒ ์์ํ์ฌ ์ฒ๋ฆฌ
IoC ์ฌ์ฉ์ ๋ฐ๋ฅธ ์ฅ์
- ๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋จ์ด๋จ๋ฆด ์ ์์ (loose coupling)
๊ฐ์ฒด๊ฐ ๊ฒฐํฉ๋๊ฐ ๋์ผ๋ฉด?
- ํด๋น ํด๋์ค๊ฐ ์ ์ง๋ณด์ ๋ ๋ ๊ทธ ํด๋์ค์ ๊ฒฐํฉ๋ ๋ค๋ฅธ ํด๋์ค๋ ๊ฐ์ด ์ ์ง ๋ณด์ ๋์ด์ผ ํ ๊ฐ๋ฅ์ฑ์ด ๋์.
๊ฐ์ฒด๊ฐ ๊ฐํ ๊ฒฐํฉ
-
ํด๋์ค ํธ์ถ ๋ฐฉ์
-
ํด๋์ค ๋ด์ ์ ์ธ๊ณผ ๊ตฌํ์ด ๋ชจ๋ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ค์ํ ํํ๋ก ๋ณํ๊ฐ ๋ถ๊ฐ๋ฅ
๊ฐ์ฒด ๊ฐ์ ๊ฐํ ๊ฒฐํฉ์ ๋คํ์ฑ์ ํตํด ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถค.
-
์ธํฐํ์ด์ค ํธ์ถ ๋ฐฉ์
-
๊ตฌํ ํด๋์ค ๊ต์ฒด๊ฐ ์ฉ์ดํ์ฌ ๋น์ผํ ํํ๋ก ๋ณํ๊ฐ๋ฅ
-
ํ์ง๋ง ์ธํฐํ์ด์ค ๊ต์ฒด ์ ํธ์ถ ํด๋์ค๋ ์์ ํด์ผ ํจ.
๊ฐ์ฒด ๊ฐ์ ๊ฐํ ๊ฒฐํฉ์ Factory๋ฅผ ํตํด ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถค
-
ํฉํ ๋ฆฌ ํธ์ถ ๋ฐฉ์
-
ํฉํ ๋ฆฌ ๋ฐฉ์์ ํฉํ ๋ฆฌ๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์์ฑํ๋ฏ๋ก ํด๋์ค๋ ํฝํ ๋ฆฌ๋ฅผ ํธ์ถ
-
์ธํฐํ์ด์ค ๋ณ๊ฒฝ ์ ํฉํ ๋ฆฌ๋ง ์์ ํ๋ฉด ๋จ. ํธ์ถ ํด๋์ค์๋ ์ํฅ์ ๋ฏธ์น์ง ์์
-
ํ์ง๋ง ํด๋์ค์ ํฉํ ๋ฆฌ๋ฅผ ํธ์ถํ๋ ์์ค๊ฐ ๋ค์ด๊ฐ์ผํจ. ๊ทธ๊ฒ ์์ฒด๊ฐ ํฉํ ๋ฆฌ์ ์์กดํจ์ ์๋ฏธํ๋ค.
๊ฐ์ฒด ๊ฐ์ ๊ฐํ ๊ฒฐํฉ์ Assembler๋ฅผ ํตํด ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถค
-
IoC ํธ์ถ ๋ฐฉ์
-
ํฉํ ๋ฆฌ ํจํด์ ์ฅ์ ์ ๋ํ์ฌ ์ด๋ ํ ๊ฒป์๋ ์์กดํ์ง ์์ ํํ๊ฐ ๋จ.
-
์คํ์์ (Runtime)์ ํด๋์ค ๊ฐ์ ๊ด๊ณ๊ฐ ํ์ฑ์ด ๋จ
-
๋น(Bean)
์คํ๋ง์ด IoC ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ ์ค๋ธ์ ํธ๋ฅผ ๋งํ๋ค.
์คํ๋ง์ด ์ง์ ๊ทธ ์์ฑ๊ณผ ์ ์ด๋ฅผ ๋ด๋นํ๋ ์ค๋ธ์ ํธ๋ง์ Bean์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
-
๋น ํฉํ ๋ฆฌ(BeanFactory)
์คํ๋ง์ด IoC๋ฅผ ๋ด๋นํ๋ ํต์ฌ ์ปจํ ์ด๋
Bean์ ๋ฑ๋ก, ์์ฑ, ์กฐํ, ๋ฐํํ๋ ๊ธฐ๋ฅ์ ๋ด๋น
์ผ๋ฐ์ ์ผ๋ก BeanFactory๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ์ง ์๊ณ ์ด๋ฅผ ํ์ฅํ ApplicationContext๋ฅผ ์ด์ฉํ๋ค.
-
์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ(ApplicationContext)
BeanFactory๋ฅผ ํ์ฅํ IoC ์ปจํ ์ด๋์ด๋ค.
Bean์ ๋ฑ๋กํ๊ณ ๊ด๋ฆฌํ๋ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ BeanFactory์ ๋์ผํ๋ค
์คํ๋ง์ด ์ ๊ณตํ๋ ๊ฐ์ข ๋ถ๊ฐ ์๋น์ค๋ฅผ ์ถ๊ฐ๋ก ์ ๊ณตํ๋ค.
BeanFactory๋ผ๊ณ ๋ถ๋ฅผ ๋๋ ์ฃผ๋ก ๋น์ ์์ฑ๊ณผ ์ ์ด์ ๊ด์ ์์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ด๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ผ๊ณ ํ ๋๋ ์คํ๋ง์ด ์ ๊ณตํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ง์ ๊ธฐ๋ฅ์ ๋ชจ๋ ํฌํจํด์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
-
์ค์ ์ ๋ณด / ์ค์ ๋ฉํ ์ ๋ณด(configuration metadata)
์คํ๋ง์ ์ค์ ์ ๋ณด๋ ApplicationContext ๋๋ BeanFactory๊ฐ IoC๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฉํ ์ ๋ณด๋ฅผ ๋งํ๋ค. ์ด๋ ๊ตฌ์ฑ ์ ๋ณด ๋ด์ง๋ ํ์์ ๋ณด๋ผ๋ ์๋ฏธ์ด๋ค.
์ค์ ์ ๋ณด๋ IoC ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ Bean๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ตฌ์ฑํ ๋ ์ฌ์ฉ๋จ.
-
์คํ๋ง ํ๋ ์์ํฌ
์คํ๋ง ํ๋ ์์ํฌ๋ IoC์ปจํ ์ด๋, ApplicationContext๋ฅผ ํฌํจํด์ ์คํ๋ง์ด ์ ๊ณตํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ํตํ์ด ๋งํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.