์ฐ๋ฆฌ๋ ์ง๋ ์๊ฐ ๋ฌด์์ด Framework์ด๋ฉฐ ์ Spring์ด์ด์ผ ํ๋๊ฐ์ ๋ํด์ ์์๋ณด์๋ค.
Framework์ ํน์ฑ์ด IoC, ์ฆ ์ ์ด์ ์ญ์ ์ด๋ผ๊ณ ํ์๋๋ฐ ์ค๋์ ๊ทธ ์ ์ด์ ์ญ์ ์ ์๋ฏธ์ ์ด๋ป๊ฒ ํ๋ฉด ์ ์ด๋ฅผ ์ญ์ ์ํฌ ์ ์๋์ง์ ๋ํ DI์ ๋ํด ์์๋ณด๋ ค ํ๋ค.
๊ฒฐ๋ก ์ ๋ฏธ๋ฆฌ ๋ง ํ์๋ฉด Spring IoC Container๋ ๋ฉํ๋ฐ์ดํฐ์ ์ค์ ์ ํตํด์ Bean์ ๊ด๋ฆฌํ๋ค.
์ง๊ธ ์ด ๋ง์ ํ๋๋ ์ดํดํ์ง ๋ชปํ๋ ๊ฒ์ด ์ ์์ด๋ค.
์ฐ๋ฆฌ๋ ํ๋์ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ์ง๋ฉดํ์ผ๋ ํ๋ ํ๋ Divide And Conquer ๋ฅผ ํด๋ณด์
์ฐ๋ฆฌ๋ ์์ ๋ฌธ์ฅ์ ์๊ฒ ๋๋ ๋ณผ ๊ฒ์ด๋ค.
- IoC Container
- Bean
- ๋ฉํ๋ฐ์ดํฐ
์ด 3 ๊ฐ์ง๋ง ์๋ฉด ์์ ๋ฌธ์ฅ์ ๋ํ ์ดํด๊ฐ ์กฐ๊ธ ๊ฐ ๊ฒ ๊ฐ๋ค.
IoC Container
Framework๊ณผ Library์ ์ฐจ์ด๋ฅผ ๊ตฌ๋ถ์ง๋ ์์๋ ๋ฐ๋ก ๋๊ฐ ๊ฐ๋ฐ์ ์ฃผ๋๊ถ์ ๊ฐ๋ ๋ผ๊ณ ํ์๋ค.
์ฐ๋ฆฌ๋ Framework๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ ์ด๋ฅผ ์ญ์ ์์ผ์ผ ํ๋๋ฐ ๊ทธ ์ญ์ ์ํค๋ ๋์์ด ๋ฐ๋ก IoC Container, Inversion Of Control ์ปจํ
์ด๋์ด๋ค.
์ํคํผ๋์์์๋ ์ ์ด์ ์ญ์ ์ ๋ฐ๋ก ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ฑํ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฌ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ฆ ์ ์ด๋ฅผ ๋ฐ๊ฒ ๋๋ ์ํํธ์จ์ด ๋์์ธ ํจํด
๋ผ๊ณ ์ค๋ช
ํ๋ค.
Spring์์๋ ์ด๋ฌํ IoC Container๊ฐ Metadata๋ฅผ ํตํด์ Bean๋ค์ ๊ด๋ฆฌํ๋ค.
- DI ์ปจํ ์ด๋
- Spring ์ปจํ ์ด๋
ApplicationContext
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ์ค๋ธ์ ํธ- Bean Factory
๋ผ๋ ์ฌ๋ฌ ๊ด์ ์ ๋ฐ๋ผ ๋ค์ํ๊ฒ ๋ถ๋ฆฌ๋๋ฐ ๊ทธ ์ค์ ํนํ DI ์ปจํ ์ด๋๋ ์๋์ ์กฐ๊ธ ๋ ์์๋ณด์.
IoC ์ปจํ ์ด๋์ ๋ํ ๋ฌธ์ ๋ ํด๊ฒฐํ์ง๋ง ์์ง Bean์ด๋ผ๋ ์๋ฏธ๋ฅผ ์ดํดํ์ง ๋ชปํ๋ค.
Bean
Bean์ ํ๋์ Object๋ก, Spring์ด ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์ง์ ๋ง๋ค๋ฉฐ ๊ด๊ณ๋ฅผ ๋ถ์ฌํ๋ Object์ด๋ค.
Bean์ ๋ค๋ฅธ ์๋ฏธ๋ก๋ POJO(Plain Old Java Object)์ธ ํด๋์ค๋ฅผ ์๋ฏธํ๊ธฐ๋ ํ๋ค.
์ฝ๊ฒ IoC Container์ ์ํด ๊ด๋ฆฌ๋๋ Object๋ฅผ Bean์ด๋ผ๊ณ ํ๋ค.
์ ํํ๋ ์์์ ์ ๊น ์ธ๊ธํ DI ์ปจํ
์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด์ด๋ค
์ด๋ฌํ ๊ฐ์ฒด๋ฅผ POJO(Plain Object Java Object)๋ผ๊ณ ํ๋๋ฐ, ์ฌ์ ์ ์ ์๋
ํน๋ณํ ์ ํ์ ์ข ์๋์ง ์๊ณ , ํด๋์ค ํจ์ค(class path)๋ฅผ ํ์๋ก ํ์ง ์๋ ์ผ๋ฐ์ ์ธ Java Object๋ฅผ ์๋ฏธํฉ๋๋ค.
์ด์ ๊ด๋ จํด์ ๋ ๊น์ ๋ด์ฉ์POJO๋ ๋ฌด์์ผ๊น์์ ์์ธํ ๋ด์ฉ์ ์ฝ์ด๋ณด๋ ๊ฒ์ ๊ถ๊ณ ํ๋ค.
๋จ์ง ์ปจํ
์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด์ผ ๋ฟ์ด์ง ๋ค๋ฅธ ์ผ๋ฐ ์๋ฐ ๊ฐ์ฒด์ ๋ค๋ฅผ ๊ฒ ํ๋ ์์ผ๋ Bean์ด๋ผ๊ณ ํด์ ํน๋ณํ ์กด์ฌ๋ผ๊ณ ์๊ฐํ์ง ๋ง๋๋ก ํ์.
์ด๋ฌํ Bean์ Metadata์ ์ํด์ ์ปจํ ์ด๋์๊ฒ ๋ด๊ฐ Bean์ด๋ ๋๋ฅผ ๊ด๋ฆฌํด์ฃผ์ธ์ ๋ผ๊ณ ์๋ ค์ฃผ๊ฒ ๋๋ ๊ฒ์ด๋ค.
DI Container
์คํ๋ง์์๋ IoC Container์ด๋ผ๋ ๋ป์ด ๋๋ฌด ๋ชจํธํ๊ณ ๊ฐ๋ ์ ์ด๋ผ๋ ์ด์ ๋ก DI ์ปจํ ์ด๋๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
DI Container์๋ ํฌ๊ฒ 2๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค.
- BeanFactory
- ApplicationContext
BeanFactory
Spring DI Container๊ฐ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ค์ ์ฐ๋ฆฌ๋ Bean์ด๋ผ๊ณ ํ๋๋ฐ, BeanFactory๋ ์ด๋ฌํ Bean์ ๋ฑ๋ก, ์์ฑ, ์กฐํ, ์๋ฉธ์ ๊ด๋ฆฌํ๋ ์ปจํ ์ด๋์ด๋ค.
BeanFactory
๋ getBean()
์ด๋ผ๋ ๋ฉ์๋๊ฐ ์ ์๋์ด ์๋ค.
์ด๋ฌํ BeanFactory๋ ๋ฐ๋ก ์ฌ์ฉ๋์ง ์๊ณ ์ข ๋ ํ์ฅ๋ ApplicationContext๋ฅผ ์ฌ์ฉํ๋ค.
ApplicationContext
BeanFactory
์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ApplicationContext
๋ AOP, Message Handling, Event handling๊ณผ ๊ฐ์ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ด๋ฌํ ApplicationContext
๋ฅผ ๊ตฌํํ ํด๋์ค๋ฅผ ์ฐ๋ฆฌ๋ ์ฃผ๋ก ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ธ๋ฐ ๋ํ์ ์ผ๋ก๋
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
GenericXmlApplicationContext
๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
DI
Dependency Injection์ ๋น ์ค์ ํ์ผ์ ์์กด ๊ด๊ณ๊ฐ ํ์ํ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ๊ณผ์ ์ด๋ค.
์ด๋ ๊ฐ์ฒด ๋ ํผ๋ฐ์ค๋ฅผ ์ปจํ ์ด๋๋ก๋ถํฐ ์ฃผ์ ๋ฐ์์, ๋ฐํ์ ์์ ์ ๋์ ์ผ๋ก ์์กด ๊ด๊ณ๊ฐ ์์ฑ๋๋ค.
Container์๊ฒ Bean ์ ๋ณด๋ฅผ ๋๊ฒจ์ฃผ๊ธฐ
์ด์ ๋์ถฉ IoC ์ปจํ ์ด๋๊ฐ ๋ฌด์์ด๋ฉฐ Bean์ด ๋ฌด์์ธ์ง์ ๋ํด์ ์๊ฒ ๋์๊ณ , IoC๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํตํด์ Bean ์ ๋ณด๋ฅผ ํ์ธํ๋ค๋ ๊ฒ๋ ์๊ฒ ๋์๋ค.
๋ง์ง๋ง์ผ๋ก metadata์ ๋ํด์ ์์๋ณด์.
metadata๋ ์ค์ ํ์ผ์ด๋ค.
์ด๋ค ๊ฐ์ฒด๊ฐ Bean์ผ๋ก ๋ฑ๋ก์ด ๋ ๊ฒ์ธ์ง, ์ด๋ค ๊ฐ์ฒด์๋ ์ด๋ค ๊ฐ์ด ๋ด๊ฒจ์ผ ํ ์ง, ์ด๋ค ๊ฐ์ฒด๊ฐ Bean์ผ๋ก ์ฌ์ฉ๋ ์ง๋ฅผ ๊ธฐ์ ํด ๋๋ ํ์ผ์ด๋ค.
์ด๋ฌํ metadata๊ฐ ๋๊ธฐ ์ํด์๋ ๋จ์ํ Class๊ฐ ๋ ์๋ ์๊ณ , XML ํ์ผ์ด ๋ ์ ์์ผ๋ฉฐ ํน์ Field๊ฐ ๋ ์๋ ์๋ค.
Annotation Based Metadata
@Configuration
public class ApplicationConfig {
@Bean
public MyClass getService() {
// Do something.
}
@Bean
public MyClass1 getService() {
// Do something.
}
}
XML Based Metadata
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="hello2" class="Hello">
<constructor-arg index="0" value="Spring"/>
<constructor-arg index="1" ref="printer"/>
</bean>
<bean id="hello" class="Hello">
<property name="name" value="Spring"/>
<property name="printer" ref="printer"/>
</bean>
<bean id="printer" class="StringPrinter" />
<bean id="consolePrinter" class="ConsolePrinter" />
</beans>
XML์ผ๋ก Bean์ ์ฃผ์ ํ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ (DI)
XML์์ Bean์ ์ฃผ์ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์๋ค.
- setter Injection
- constructor Injection
setter Injection
์์กด์ฑ์ ์ ๋ ฅ๋ฐ๋ Setter ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ ํตํด์ ์์กด์ฑ์ ์ฃผ์ ํ๋ค.
setter ๋ฉ์๋๋ฅผ ํตํด์ ์์กด๊ด๊ณ๊ฐ ์๋ Bean์ ์ฃผ์
ํ๋ ๊ฐ๋
์ผ๋ก xml ํ์ผ์์๋ <property>
ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค.
<bean id="hello" class="Hello">
<property name="name" value="Spring"/>
<property name="printer" ref="printer"/>
</bean>
์ค์ ๋ก ์ฌ์ฉํ๋ค๋ฉด ์์ ๊ฐ์ ํ์์ 2๊ฐ์ง ํํ์ ์์ฑ ๊ฐ์ด ์๋ค.
ref
: ๊ธฐ์กด์ Bean์ผ๋ก ๋ฑ๋ก๋ ๊ฐ์ฒด๋ฅผ Bean-name์ ์ด์ฉํด์ ๋ ํผ๋ฐ์ค ํ์ ์ผ๋ก ์ฐ๊ฒฐ์ํจ๋ค.value
: ๋ ํผ๋ฐ์คํ์ ์ด ์๋ Primitive ํ์ ์ ๊ฐ์ ์ฃผ์ ํ ๋ ์ฌ์ฉํ๋ค.
๋จ์
์ด๋ฌํ setter Injection์๋ ์น๋ช ์ ์ธ ๋จ์ ์ด ์กด์ฌํ๋๋ฐ, ๋ฐ๋ก ํ ๋ฒ์ ํ๋์ ์์กด ๊ด๊ณ๋ง ์ฃผ์ ํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
Constructor Injection
Constructor Injection์ ํ์ํ ์์กด์ฑ์ ํฌํจํ๋ ํด๋์ค์ ์์ฑ์๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ ํตํด ์์กด์ฑ ์ฃผํ๋ค.
Setter Injection๊ณผ๋ ๋ค๋ฅด๊ฒ ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ์์กด ๊ด๊ณ๋ฅผ ์ฃผ์
ํ ์ ์๋ค๋ ํน์ง์ด ์๋ค.
์์ฑ์๋ฅผ ํตํด ์์กด ๊ด๊ณ๊ฐ ์๋ Bean์ ์ฃผ์
ํ๋ ๊ฐ๋
์ผ๋ก <constructor-arg>
ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ฌํ constructor Injection์๋ 2๊ฐ์ง ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
- index ์ค์
- name ์ค์
index ์ค์
<bean id="hello" class="packagename.hello">
<constructor-arg index="0" value="Spring"/>
<constructor-arg index="1" ref="printer"/>
</bean>
name ์ค์
<bean id="hello" class="packagename.hello">
<constructor-arg name="name" value="Spring"/>
<constructor-arg name="printer" ref="printer"/>
</bean>
๋ง์น๋ฉฐ
Spring IoC/Di ํํธ๋ฅผ ๊ณต๋ถํ๋ฉด์ ๋๊ผ๋ ์ ์ ๋น์ทํ ๊ฐ๋ ์ ๊ฐ์ง ์ฉ์ด๊ฐ ๋งค์ฐ ๋ง๋ค๋ ๊ฒ์ด๋ค.
๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ์กฐ๊ธ์ฉ ๋ค๋ฅธ ์๋ฏธ๋ก ์ฌ์ฉ๋๋ ์ฉ์ด์ด์ง๋ง ์ ์ ์๊ณ ๋ณธ๋ค๋ฉด ๋น์ทํ ๊ฐ๋ ์ ์ค๋ช ํ๋ ๋จ์ด๋ค์ด ๋ง์๊ณ ์ด๋ค ์ฌ์ด์์๋ ์๋ก ํผ์ฉ๋์ด ๊ฐ์๋ฅผ ํํํ๊ธฐ๋ ํ๋ ๊ตฌ์กฐ๊ฐ ๋๋ฅผ ํฌํจํ ์ ๋ฌธ์์๊ฒ๋ ์กฐ๊ธ ํผ๋์ ์ค ์ ์๋ค๊ณ ์๊ฐํ๋ค.
ํ์ง๋ง ์ฉ์ด๋ ๋ง ๊ทธ๋๋ก ์ฉ์ด์ผ ๋ฟ์ด์ง ์ ํํ Concept๋ง ์๊ณ ์๋ค๋ฉด ์ฝ๊ฒ ์ดํด๋ฅผ ํ ์ ์์ผ๋ ์ฌ๋ฌ ์ฉ์ด๋ฅผ ํ ๋ฒ ์ ๋ฆฌํด์ ํ์ ํ๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ๋ค.
- Bean
- POJO
- BeanFactory
- ApplicationContext
- configuration metadata
- container
- IoC-Container
- Bean
๋๊ธ