์คํ๋ง IoC์ DI
์คํ๋ง์์ ‘bean’์ ๋จ์ํ ๊ฐ์ฒด๊ฐ ์๋, ์คํ๋ง์ด ์ง์ ์์ฑํ๊ณ , ์์กด๊ด๊ณ๋ฅผ ์ค์ ํ๋ฉฐ, ํ์ํ ์์ ์ ์ฃผ์ ๊น์ง ๋ด๋นํ๋ ์ค๋ธ์ ํธ.
์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ์ต์ ๋จ์์ด๋ฉฐ, ์คํ๋ง์ด ์ ์ด๊ถ์ ๊ฐ๊ณ ๊ด๋ฆฌํ๋ค๋ ์ ์์ ์ผ๋ฐ ๊ฐ์ฒด์ ๊ตฌ๋ถ๋จ.
IoC(Inversion of Control)๋ ์ด๋ฐ ์ ์ด๊ถ์ ๊ฐ๋ฐ์๊ฐ ์๋ ํ๋ ์์ํฌ๊ฐ ๊ฐ๋ ๊ตฌ์กฐ.
์ค๋ธ์ ํธ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ค์ ํ๊ณ ์ฃผ์ ํ๋ ์ฑ ์์ ์ธ๋ถ ์ปจํ ์ด๋์ ๋๊น์ผ๋ก์จ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฐ์ฑ๊ณผ ํ ์คํธ ์ฉ์ด์ฑ์ด ํฌ๊ฒ ํฅ์๋จ.
๋น ํฉํ ๋ฆฌ: IoC์ ํต์ฌ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ์ปจํ ์ด๋
์คํ๋ง์ด ์ ๊ณตํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ IoC ์ปจํ ์ด๋.
์ค๋ธ์ ํธ์ ์์ฑ๊ณผ ์์กด๊ด๊ณ ์ค์ ์ ๋ด๋นํ๋ฉฐ, `getBean()` ๋ฉ์๋๋ฅผ ํตํด ๋ฑ๋ก๋ ๋น์ ๊บผ๋ด ์ธ ์ ์๋๋ก ํจ.
๋ด๋ถ์ ์ผ๋ก๋ ๋น์ ์ ์์ ์ธ์คํด์ค๋ฅผ ์ค์ ๋ ์ง์คํธ๋ฆฌ์ ๋ณด๊ดํ๊ณ ๊ด๋ฆฌ.
๋น ํฉํ ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ญํ ์ ์ํํ๋ IoC ์ค๋ธ์ ํธ:
- ๋น์ ์ ์(BeanDefinition) ์ ๋ณด๋ฅผ ์ฝ๊ณ ๋ฑ๋ก
- ๋น ์ธ์คํด์ค ์์ฑ ๋ฐ ์์กด๊ด๊ณ ์ฃผ์
- ํ์ ์ ๋น์ ์ ๊ณต (lazy initialization๋ ์ง์)
์คํ๋ง 2.0 ์ดํ๋ถํฐ๋ ๋ค์ํ ์ค์ฝํ(scope)๋ฅผ ์ง์ํ๋ฉฐ, ๊ธฐ๋ณธ ์ฑ๊ธํด๋ฟ ์๋๋ผ request, session ๋ฑ์ ์ค์ฝํ ๋น๋ ๊ด๋ฆฌ ๊ฐ๋ฅ.
์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ: ๋น ํฉํ ๋ฆฌ๋ฅผ ํ์ฅํ IoC ์ปจํ ์ด๋
BeanFactory๋ฅผ ํ์ฅํ ์ปจํ ์ด๋๋ก, ์คํ๋ง์ด ์ ๊ณตํ๋ ์ข ํฉ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ง์ ๊ธฐ๋ฅ์ ํฌํจ
๋จ์ํ ์ค๋ธ์ ํธ ์์ฑ๋ฟ ์๋๋ผ, ๋ฆฌ์์ค ๋ก๋ฉ, ๊ตญ์ ํ ๋ฉ์์ง ์ฒ๋ฆฌ, ์ด๋ฒคํธ ๋ฐํ ๋ฑ ๋ค์ํ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ค๋ธ์ ํธ.
ApplicationContext๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์:
- ListableBeanFactory: ๋น ํ์ ๋ฐ ์กฐํ ๊ธฐ๋ฅ
- ResourceLoader: ๋ฒ์ฉ์ ์ธ ๋ฆฌ์์ค ์ ๊ทผ ๊ธฐ๋ฅ
- ApplicationEventPublisher: ์ด๋ฒคํธ ๋ฐํ ๊ธฐ๋ฅ
- MessageSource: ๊ตญ์ ํ ๋ฉ์์ง ์ฒ๋ฆฌ ๊ธฐ๋ฅ
- HierarchicalBeanFactory: ๋ถ๋ชจ ์ปจํ ์คํธ ์์ ๊ธฐ๋ฅ
ํ๋์ ๋ถ๋ชจ ์ปจํ ์คํธ๋ฅผ ์ฌ๋ฌ ์๋ธ๋ฆฟ์ด ๊ณต์ ํ๊ณ , ๊ฐ ์๋ธ๋ฆฟ์ด ๋ ๋ฆฝ์ ์ธ ์์ ์ปจํ ์คํธ๋ฅผ ๊ฐ์ง์ผ๋ก์จ, ๊ณ์ธต์ ์ด๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ค์ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํจ.
ApplicationContext ์ฅ์
- ํด๋ผ์ด์ธํธ๋ ๊ตฌ์ฒด์ ์ธ ํฉํ ๋ฆฌ ํด๋์ค๋ฅผ ์ ํ์๊ฐ ์์: ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ํ๋ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์
- ์ข ํฉ IoC ์๋น์ค ์ ๊ณต: ์ค๋ธ์ ํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ ์ ์๋ ๋ค์ํ ๊ธฐ๋ฅ ์ ๊ณต
- ๋น์ ๊ฒ์ํ๋ ๋ค์ํ ๋ฐฉ๋ฒ ์ ๊ณต
์ฑ๊ธํค ๋ ์ง์คํธ๋ฆฌ๋ก์์ ApplicationContext
ApplicationContext๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น์ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ.
๋์ผํ ๋น ์์ฒญ์ด ๋ฐ๋ณต๋๋๋ผ๋ ํญ์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅ.
๋ด๋ถ์ ์ผ๋ก ์์ฑํ๋ ๋๋ถ๋ถ์ ๋น์ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ๋๋ฉฐ, ๋ณ๋๋ก ๋ช ์ํ์ง ์๋ ํ ๊ธฐ๋ณธ ์ค์ฝํ๋ singleton.
๋จ์ํ POJO ํด๋์ค๋ผ๋ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์์ฑ๊ณผ ๊ด๊ณ์ค์ ์ ๋ด๋นํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ฑ๊ธํค ๋น์ผ๋ก ์ ํ๋จ.
์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ ์ค์ : @Configuration๊ณผ @Bean
`@Configuration`: ํด๋น ํด๋์ค๊ฐ ์ค์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค๋ ์ ์ธ.
ApplicationContext๋ BeanFactory๋ ์ด ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ฅผ ์ค์บํ์ฌ ์ค์ ํด๋์ค๋ก ์ธ์.
`@Bean`: ๋ฉ์๋๊ฐ IoC ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ ๋น์ ๋ฐํํ๋ค๋ ์๋ฏธ
๋ฉ์๋ ๋ด๋ถ์์ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ณ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ ํ ๋ฐํํ๋ฉด, ์ปจํ ์ด๋๊ฐ ์ด๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํจ.
@Configuration
class AppConfig {
@Bean
fun userDao(): UserDao {
val userDao = UserDao()
userDao.connectionMaker = connectionMaker()
return userDao
}
@Bean
fun connectionMaker(): ConnectionMaker {
return DConnectionMaker()
}
}
์๋ฐ ์ค์ ๋ฐฉ์์ XML์ ๋นํด ์ง๊ด์ ์ด๊ณ ํ์ ์์ ์ฑ์ด ๋์, ์ต๊ทผ์๋ ๊ฑฐ์ ํ์ค์ฒ๋ผ ์ฌ์ฉ๋๋ ๋ฐฉ์.
IoC์ DI: ์ค๋ธ์ ํธ๋ฅผ ์ ์ดํ๋ ์ฃผ์ฒด๋ฅผ ์ ํํ๋ ๊ฐ๋
IoC์ ๋ณธ์ง์ ์ค๋ธ์ ํธ์ ์ ์ด๊ถ์ ๊ฐ๋ฐ์๊ฐ ์๋ ํ๋ ์์ํฌ์๊ฒ ๋๊ธฐ๋ ๊ตฌ์กฐ.
์์ ์ด ์ฌ์ฉํ ์ค๋ธ์ ํธ๋ฅผ ์ง์ ์์ฑํ๊ฑฐ๋ ์ฐพ์ง ์๊ณ , ์ธ๋ถ์์ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด DI(Dependency Injection).
DI๋ ์์ฑ์, ์์ ์(setter), ์ผ๋ฐ ๋ฉ์๋ ๋ฑ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์์กด ์ค๋ธ์ ํธ๋ฅผ ์ฃผ์ ํ๋ฉฐ, ์ด ๊ณผ์ ์์ ์คํ๋ง์ ์ปจํ ์ด๋๊ฐ ๋ชจ๋ ์ ์ด๋ฅผ ๋ด๋น. ๊ฐ๋ฐ์๋ ๋จ์ํ “์ด ์ค๋ธ์ ํธ๊ฐ ํ์ํ๋ค”๋ ๋ช ์ธ๋ง ์ ๊ณตํ๋ฉด ๋จ.
DI๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ํ๋จ:
- ์์ ์ ๋ฉ์๋ ์ฃผ์ — ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ๋ฐฉ์
- ์ผ๋ฐ ๋ฉ์๋ ์ฃผ์ — ์ฌ๋ฌ ์์กด์ฑ์ ๋ฌถ์ด์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
- ์์ฑ์ ์ฃผ์ — final๋ก ์ ์ธ๋ ํ๋๋ฅผ ์ฃผ์ ํ ๋ ์ ์ฉ
DI๋ ์์ ์ด ์ฌ์ฉํ ์ค๋ธ์ ํธ์ ๋ํ ์์ฑ๊ณผ ์ ํ ์ฑ ์์ ์ธ๋ถ๋ก ๋๊ธฐ๊ณ , ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ๋ ์ ์์ IoC์ ์ ํ์ ์ธ ๊ตฌํ ๋ฐฉ์
IoC์ DI์ ์์
- IoC๋ ์ค๋ธ์ ํธ ์์ฑ๊ณผ ๊ด๊ณ์ค์ ์ ๋ํ ์ ์ด๊ถ์ ํ๋ ์์ํฌ์๊ฒ ์์ํ๋ ๊ฐ๋
- DI๋ ์ด ์ ์ด๊ถ ์์์ ์คํํ๋ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ์
- ์คํ๋ง์ BeanFactory์ ApplicationContext๋ฅผ ํตํด IoC/DI๋ฅผ ์คํ
- @Configuration๊ณผ @Bean์ ํ์ฉํ๋ฉด ํ์ ์์ ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ด ๋ฐ์ด๋ ์ค์ ๊ตฌ์ฑ์ด ๊ฐ๋ฅ