์คํ๋ง ๋น์ ๋ค์ด๊ฐ๊ธฐ์ ์์ ์คํ๋ง์ ๋ํ์ ์ธ 3๊ฐ์ง ํน์ฑ์ ๊ฐ๋จํ ์ดํด๋ณด๊ฒ ๋ค.
์ ์ด์ ์ญ์ IoC(Inversion of Control)
IoC ์ปจํ
์ด๋๊ฐ ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ๋ํ ๊ถํ์ ๊ฐ์ง๋ค. ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์คํํ ์ ์์ผ๋ฉฐ, ๋ง๋ค๊ณ ๋ฑ๋กํ bean๋ค์ ๊ด๋ฆฌํ๋ค.
์์กด์ฑ ์ฃผ์
DI(Dependency Injection)
์ ํ๋ฆฌ์ผ์ด์
์คํ ์์ ์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ค์ ์์กด๊ด๊ณ๊ฐ ์ฐ๊ฒฐ๋๋ ๊ฒ์ ๋งํ๋ค.
๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ AOP(Aspect Oriented Programming)
์ ํ๋ฆฌ์ผ์ด์
์ ๊ณตํต์ ์ผ๋ก ๋ํ๋๋ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ๋ค์ ๋
๋ฆฝ์ ์ผ๋ก ๋ชจ๋ํํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ด๋ค.
>>> ์ฌ๊ธฐ์ Spring IoC ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๋ ์๋ฐ ๊ฐ์ฒด๋ฅผ ๋น(Bean)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
@Controller
public class MainController implements BeanFactoryAware {
SampleBean1 sb1;
@RequestMapping("/checkBean")
public String checkBean() {
SampleBean1 bean1 = new SampleBean1();
System.out.println(bean1);
SampleBean1 bean2 = new SampleBean1();
System.out.println(bean2);
return "checkBean";
}
}
โ ์ฝ์๊ฒฐ๊ณผ
>>> ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ๊ฒ์ ๋ณผ ์ ์์!!
lazy-init >>> ํน์ Bean์ด ๋ฆ๊ฒ ์ด๊ธฐํ๋๊ธฐ๋ฅผ ์ํ ๋ ์ฌ์ฉ
defalut : ์๋ฒ ์์ ์, xml ๋ก๋ฉ ๊ณผ์ ์์ Bean ์์ฑ
true : ์ค์ Bean์ ์ ๊ทผํด์ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ์์ฑ
false : ๊ธฐ๋ณธ ๋์
<bean id="sampleBean" class="com.app.beans.SampleBean" lazy-init="true" />
scope >>> defalut๋ ์ฑ๊ธํค ๊ฐ์ฒด!
prototype : ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด๋ก ํ์ฉ! (๊ฐ์ฒด ์์ฑํ๋ฉด ๋๋ฏ๋ก ์ ์ฐ์ด์ง ์์)
<bean id="sampleBean" class="com.app.beans.SampleBean" scope="prototype" />
init-method, destroy-method >>> Bean ์์ฑ ํ ์ฝ๋ฐฑ์ผ๋ก ํธ์ถ๋๋ ๋ฉ์๋ ์ ์ธ
<bean id="initDestroyBean" class="com.app.beans.InitDestroyBean" init-method="bean_init" destroy-method="bean_destroy" />
ApplicationContext๋ฅผ ์คํ๋ง ์ปจํ
์ด๋๋ผ๊ณ ํ๋ค.
ApplicationContext๋ BeanFactory ์ธํฐํ์ด์ค์ ํ์ ์ธํฐํ์ด์ค๋ค.
์คํ๋ง ์ปจํ
์ด๋๋ ๋น์ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌํด์ค๋ค.
โ root-context.xml
<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="sampleBean1" class="com.app.beans.SampleBean1" />
</beans>
โ SampleBean1 ํด๋์ค
public class SampleBean1 {
public SampleBean1() {
System.out.println("SampleBean1 ์์ฑ์");
}
}
โ ์ปจํธ๋กค๋ฌ
@Controller
public class BeanController {
//์ด๋
ธํ
์ด์
@Autowired๋ก ์ ๊ทผ
@Autowired
ApplicationContext applicationContext;
@RequestMapping("/sb1")
public String sb1() {
SampleBean1 sb1 = (SampleBean1)applicationContext.getBean("sampleBean1");
System.out.println("/sb1 - " + sb1);
return "checkBean";
}
@RequestMapping("/sb1_2")
public String sb1_2() {
SampleBean1 sb1 = (SampleBean1)applicationContext.getBean("sampleBean1");
System.out.println("/sb1_2 - " + sb1);
return "checkBean";
}
}
โ ์ฝ์์ฐฝ ์ถ๋ ฅ๊ฒฐ๊ณผ
>>> ์คํ๋์ค ์์ฑ๋จ
>>> /sb1๊ณผ /sb1_2์ ์ ๊ทผํด๋ณด๋ฉด, ์ฑ๊ธํค์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ ๋์ผํ๊ฒ ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์์!!
์ฐ์ต๋ฌธ์
ํน์ URL ์ฃผ์๋ก ์ ๊ทผ ํ ๊ฒฝ์ฐ์, ๋ฑ๋ก๋ Bean ์ ์ ๊ทผํ์ฌ ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ฝ์ ์ฐฝ์ ์ถ๋ ฅ๋๋๋ก ์์ฑ
(๋จ, ๋ชจ๋ bean ๊ฐ์ฒด์ ์ค์ ์ xml bean ์ค์ ์ ํตํด์ ์ํํ๊ณ , ๊ฐ ํ์ธ์ ์ํด ํ์ํ Bean ๋ค์ Controller ์์ ApplicationContext ๋ฅผ ํตํ์ฌ ์ ๊ทผ)
localhost:8080/QuizBeanProject/coffeeList ๋ก ์ ์์ ๋ฆฌ์คํธ ์ถ๋ ฅ.
localhost:8080/QuizBeanProject/coffeeAme ๋ก ์ ์์ ์๋ฉ๋ฆฌ์นด๋ ธ ์ถ๋ ฅ
localhost:8080/QuizBeanProject/coffeeMoca ๋ก ์ ์์ ์นดํ๋ชจ์นด ์ถ๋ ฅ
>>>>> ํด๋์ค <<<<<
- class CupBean
ํ๋๋ณ์ CoffeeBean coffeeBean;- class CoffeeBean
ํ๋๋ณ์ name;
์ฐ์ ์์์ ์๊ตฌํ ํด๋์ค ๋๊ฐ๋ฅผ ๋จผ์ ๋ง๋ ๋ค.
โ CoffeeBean ํด๋์ค
public class CoffeeBean {
String name;
public CoffeeBean(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
โ CupBean ํด๋์ค
public class CupBean {
CoffeeBean coffee;
public CupBean(CoffeeBean coffee) {
this.coffee = coffee;
}
public CoffeeBean getCoffee() {
return coffee;
}
public void setCoffee(CoffeeBean coffee) {
this.coffee = coffee;
}
}
๋ ํด๋์ค๋ฅผ ๋ง๋ค์์ผ๋ ApplicationContext๋ก bean์ ์ ๊ทผํ๊ธฐ ์ํด root-context.xml ํ์ผ์์ ์์ฑ์ ์ด์ด๊ฐ๊ฒ ๋ค.
โ root-context.xml
<?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">
<!-- constructor-arg value="" -->
<!-- CoffeeBean์ผ๋ก ๊ฐ์ฒด ์์ฑ ํ ์๋ฉ๋ฆฌ์นด๋
ธ๋ก ๊ฐ ๋ด๊ธฐ-->
<bean id="ame" class="com.app.beans.CoffeeBean">
<constructor-arg value="์๋ฉ๋ฆฌ์นด๋
ธ" />
</bean>
<!-- CoffeeBean์ผ๋ก ๊ฐ์ฒด ์์ฑ ํ ์นดํ๋ชจ์นด๋ก ๊ฐ ๋ด๊ธฐ-->
<bean id="moca" class="com.app.beans.CoffeeBean">
<constructor-arg value="์นดํ๋ชจ์นด" />
</bean>
<!-- constructor-arg ref="" -->
<!-- ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ปต์ ๋ด๊ธฐ -->
<bean id="coffeeBean1" class="com.app.beans.CupBean">
<constructor-arg ref="ame" />
</bean>
<!-- ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ปต์ ๋ด๊ธฐ -->
<bean id="coffeeBean2" class="com.app.beans.CupBean">
<constructor-arg ref="moca" />
</bean>
</beans>
๊ฐ์ฒด ์์ฑ ์ ๊ฐ์ ๋ด์์ฃผ๋ ์์
์ ๋ง์ณค๋ค.
์ด์ ์ปจํธ๋กค๋ฌ์์ bean์ ์ ๊ทผํด ๋ถ๋ฌ๋ณด๊ฒ ๋ค.
โ ์ปจํธ๋กค๋ฌ
@Controller
public class QuizbeanController {
@Autowired
ApplicationContext applicationContext;
CupBean ame;
CupBean moca;
@RequestMapping("/coffeeList")
public String coffeeList() {
ame = (CupBean)applicationContext.getBean("coffeeBean1");
moca = (CupBean)applicationContext.getBean("coffeeBean2");
System.out.println("์ฒซ๋ฒ์งธ ์ปต์ ๋ด๊ธด ์๋ฃ์ ์ด๋ฆ - " + ame.getCoffee().getName());
System.out.println("๋๋ฒ์งธ ์ปต์ ๋ด๊ธด ์๋ฃ์ ์ด๋ฆ - " + moca.getCoffee().getName());
return "coffeeList";
}
@RequestMapping("/coffeeAme")
public String coffeeAme() {
ame = (CupBean)applicationContext.getBean("coffeeBean1");
System.out.println("์ฒซ๋ฒ์งธ ์ปต์ ๋ด๊ธด ์๋ฃ์ ์ด๋ฆ - " + ame.getCoffee().getName());
return "coffeeList";
}
@RequestMapping("/coffeeMoca")
public String coffeeMoca() {
moca = (CupBean)applicationContext.getBean("coffeeBean2");
System.out.println("๋๋ฒ์งธ ์ปต์ ๋ด๊ธด ์๋ฃ์ ์ด๋ฆ - " + moca.getCoffee().getName());
return "coffeeList";
}
}
โ ์คํ๊ฒฐ๊ณผ