์๋์ฐจ์์ ๋ง์ฝ ์์ง์ด ์ค๋๋์ ์์ง์ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด, ์๋์ ์ ์ฒด๊ฐ ์๋ ์์ง๋ง ๋ฝ์์ ๋ฐ๊ฟ์ฃผ๋ฉด ๋ฉ๋๋ค. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์๋ ํด๋์ค์ ๋ํ ๋ณ๊ฒฝ์ด ํ์ํ๋ฉด ๋ค๋ฅธ ํด๋์ค์ ์ํฅ์ ๋ผ์น์ง ์์ผ๋ฉด์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ์ํฉ์ ๋ ์์ํ๊ฒ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅ์ผ ๋์์ค์ ์๋๋ก ๋์ ๋ ๊ธฐ๋ฅ์ด ๋ฐ๋ก DI(Dependency Injection)์ IoC(Inversion of Control)์ ๋๋ค.
์๋ฐ๋ก ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฉด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ง์ ํด๋์ค์ new ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ์์ฑํ์ต๋๋ค. ํ์ง๋ง DI๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฝ๋ฉ์ ํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ์ปจํ ์ด๋๊ฐ ์ด๋ฅผ ์์ฑ์์ผ ์ฃผ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ค๋ฉด ์ฝ๋์์ ์ง์ ์ ์ธ ์ฐ๊ด ๊ด๊ณ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฐ ํด๋์ค๋ค์ ๋ณ๊ฒฝ์ด ์์ ๋ก์ ์ง๋๋ค. ์ด๋ฅผ ๋์จํ ๊ฒฐํฉ์ด๋ผ๊ณ ํฉ๋๋ค.
๊ฐ ํด๋์ค๋ค๊ฐ ๊ฒฐํฉ๋๊ฐ ๋๊ฒ๋๋ฉด ๋์ค์ ํ๋ก์ ํธ๊ฐ ๋ณต์กํด์ง์ ์ ์ง๋ณด์๊ฐ ํ๋ค๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ ํด๋์ค๋ค๊ฐ ์ฐ๊ด ๊ด๊ณ๋ฅผ ํด๋์ค ์์ฒด ๋ด์์ ๋งบ์ด์ฃผ๋ ๊ฒ์ด ์๋๋ผ ์คํ๋ง ์์ฒด์์ ์ค์ ์ ํตํด ์ฐ๊ด ๊ด๊ณ๋ฅผ ๋งบ์ด์ค์ผ๋ก์จ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ์ค๋๋ค.
ํด๋์ค์ ๋ณ๊ฒฝ ์ฌํญ์ด ์ฐ์์ ์ผ๋ก ๋ค๋ฅธ ํด๋์ค์ ์ํฅ(์๋ฐ์ฝ๋์์ ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํ๋ ๊ฒ)์ ๋ฏธ์น๋ค๋ฉด ์ข์ ๋ฐฉ๋ฒ์ ์๋๋๋ค.
public class BoardServiceImpl implements BoardService{
BoardDAO boardDAO;
public BoardService() {
boardDAO = new BoardOracleDAOImpl(); //=> ํด๋์ค์์ ์ง์ ์์ฑ
}
}
์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ์ฌ ๊ฐ ํด๋์ค๋ฅผ ๊ตฌํํ๋ฉด ๊ทธ๋๋ง ํด๋์ค๋ค ๊ฐ ์์กด ๊ด๊ณ๊ฐ ์ฝํด์ง์ง๋ง, ๋ง์ฝ ์ค๋ผํด์ด ์๋ Mysql ๋ก ํ๊ณ ์ถ๋ค๋ฉด, ์๋์ ๊ฐ์ด ํ๋ฉด ๋๋๋ฐ, ์ด๋ด ๊ฒฝ์ฐ ์ฌ์ ํ ๊ณ์ ํด๋์ค ์์ฒด์์ new ์ด์ฉํ์ฌ ํด๋์ค ๊ฐ์ฒด๋ฅผ ์์ฑ์์ผ์ค๋๋ค.
public class BoardServiceImpl implements BoardService{
BoardDAO boardDAO;
public BoardService() {
//boardDAO = new BoardOracleDAOImpl(); //=> ํด๋์ค์์ ์ง์ ์์ฑ
boardDAO = new BoardMySqlDAOImpl();
}
}
l DI๋ฅผ ํด์ผํ๋ ์ด์
DI๋ฅผ ์ฌ์ฉํ์ ๋์ ์ฅ์ ์ ๋๋ค.
- ํด๋์ค๋ค ๊ฐ ์์กด ๊ด๊ณ๋ฅผ ์ต์ํ ํ ์ ์๋ค.
- ํ๋ก์ ํธ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค.
- ๊ธฐ์กด์๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ฐ์ฒด์ ์์ฑ๊ณผ ์๋ฉธ์ ์ ์ดํ๋๋ฐ DI๋ก ์ธํด ๊ฐ์ฒด์ ์์ฑ๊ณผ ์๋ฉธ ๋ฑ ํด๋์ค๊ฐ ์์กด๊ด๊ณ๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ ์ดํด์ค๋ค.
DI๋ ๊ฐ์ฒด์ ์์ฑ, ์๋ฉธ, ์์กด ๊ด๊ณ๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ค์ ํ๋ ๊ฒ์ด ์๋๋ผ XML์ด๋ ์ ๋ํ ์ด์ ์ ํตํด ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์ ์ดํฉ๋๋ค. ๊ธฐ์กด์๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์คฌ๋ ๋ฐ๋ฉด์ ์คํ๋ง ํ๋ ์์ํฌ์์๋ ๊ฐ์ฒด์ ์ ์ด๋ฅผ ์คํ๋ง์ด ์ง์ ๋ด๋นํด์ฃผ๋ IoC ํน์ง์ ๊ฐ์ง๋๋ค.
์คํ๋ง์์๋ ์์กดํ๋ ๊ฐ์ฒด๋ฅผ ์ปจํ ์ด๋ ์คํ ์ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๊ธฐ ๋๋ฌธ์ DI๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ฌ๊ธฐ์ ๊ฐ ํด๋์ค ๊ฐ์ฒด๋ฅผ Bean(์ดํ ๋น)์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ ์ด๋ ์์กด๊ด๊ณ๋ฅผ ์ค์ ํ๋ xml ํ์ผ์์ ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ฅผ <bean> ํ๊ทธ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์คํ๋ง์์ ์์กด ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง๊ฐ ์์ต๋๋ค.
- setter๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ
- ์์ฑ์๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ
์ด 2๊ฐ์ง์ ๋ํ ์์๋ฅผ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
<bean> ํ๊ทธ์ ์์ฑ๋ค
์์ฑ ์ด๋ฆ | ์ค๋ช |
id | ๋น ๊ฐ์ฒด์ ๊ณ ์ ์ด๋ฆ์ผ๋ก, ์ด๋ฅผ ์ด์ฉํ์ฌ ๋น์ ์ ๊ทผํ๋ฉฐ ์ค๋ณต๋์ ์๋๋ค. |
name | ๋น ๊ฐ์ฒด์ ๋ณ์นญ |
class | ์์ฑํ ํด๋์ค ์ด๋ฆ (๋น ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ ํด๋์ค์ ์ด๋ฆ ) |
constructor-arg | ์์ฑ์๋ฅผ ์ด์ฉํด ๊ฐ์ ์ฃผ์ ํ ๋ ์ฌ์ฉํ๋ค. |
property | setter๋ฅผ ์ด์ฉํด ๊ฐ์ ์ฃผ์ ํ ๋ ์ฌ์ฉํ๋ค. |
l setter๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="personService" class="com.spring.ex01.PersonServiceImpl">
<!-- id๋ ๋น์ ๊ณ ์ ์ด๋ฆ, class๋ ๊ฐ์ฒด ์ฃผ์
ํ ํด๋์ค ์ด๋ฆ -->
<property name="name">
<value>ํ๊ธธ๋</value>
</property>
<property name="blood">
<value>Aํ</value>
</property>
</bean>
</beans>
new๋ฅผ ์ด์ฉํด ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ person.xml์ ์ค์ ํ ๊ฒ์ ๋๋ค.
package com.spring.ex01;
public interface PersonService {
public void sayHello();
}
package com.spring.ex01;
public class PersonServiceImpl implements PersonService{
private String name;
private int age;
private String blood;
/*
* xml <value> ํ๊ทธ์ ๊ฐ์ setter ์ด์ฉํด ์ค์
* setter ์ํด์ฃผ๋ฉด ์๋ฌ๋ธ
* ๋ง์ฝ ์ฌ๊ธฐ ํด๋์ค์ blood์ ๊ดํ ๋ณ์๊ฐ ์์ด๋
* ๋น์ฆ์์ property๋ก blood๋ฅผ ์์ฑํด์ฃผ๋ฉด
* ๊ทธ์ ๋ํ setter๊ฐ ๋ฐ๋์ ์์ด์ผํจ
* setter ๋ง๊ณ ์์ฑ์๋ก๋ ์ค์ ๊ฐ๋ฅ
* */
public void setName(String name) {
this.name = name;
}
/**
* setter์ ์ธ์๋ก ๋น์์ ์์ฑํ ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ค์ผ๋ก์จ
* ๊ฐ์ฒด๋ฅผ ์ฃผ์
ํ๊ธฐ ๋๋ฌธ์ DI๋ผ๊ณ ํ ์ ์๋ค.
* @param blood
*/
public void setBlood(String blood) {
this.blood = blood;
}
@Override
public void sayHello() {
System.out.println(this.name);
System.out.println(this.blood);
System.out.println(this.age);
}
}
PersonServiceImpl์์ ์ธํฐํ์ด์ค PersonService๋ฅผ ๊ตฌํํ๊ณ setter๋ฅผ ์ด์ฉํด person.xml์์ <value> ํ๊ทธ๋ก ์ค์ ํ ๊ฐ์ name ์์ฑ์ ์ฃผ์ ํฉ๋๋ค.
package com.spring.ex01;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
public class PersonTest {
public static void main(String[] args) {
BeanFactory factory = new XmlBeanFactory(new FileSystemResource("person.xml"));
// person.xml ํ์ผ์ ๋ถ๋ฌ์ BeanFactory ๊ฐ์ฒด๋ฅผ ์์ฑ์์ผ์ค๋๋ค. ์ฆ ๋น์ ์์ฑ์ํด
PersonService person = (PersonService) factory.getBean("personService");
//person.xml์์์ ๋น ๊ฐ์ฒด์ id๋ฅผ ๊ฐ์ ธ์์ค๋๋ค. id๋ ๊ณ ์ ์ด๋ฆ์ด๋ฏ๋ก ์ค๋ณต๋์ง ์์ต๋๋ค.
//PersonService person = new PersonServiceImpl();
// ๋์ด์ ์๋ฐ ์ฝ๋์์ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ์ง ์์๋ ๋๋ค.
person.sayHello();
}
}
์คํ ํด๋์ค๋ฅผ ์คํํ๋ฉด ์คํ๋ง์ XmlBeanFactory ํด๋์ค๋ฅผ ์ด์ฉํด person.xml์ ์ค์ ๋๋ก PersonServiceImpl ๋น์ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑํฉ๋๋ค.
ใ ฃ ์์ฑ์๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="personService1" class="com.spring.ex02.PersonServiceImpl">
<!-- id๋ ๋น์ ๊ณ ์ ์ด๋ฆ, class๋ ๊ฐ์ฒด ์ฃผ์
ํ ํด๋์ค ์ด๋ฆ -->
<constructor-arg value="์ด์์ "></constructor-arg>
</bean>
<bean id="personService2" class="com.spring.ex02.PersonServiceImpl">
<constructor-arg value="์ํฅ๋ฏผ"></constructor-arg>
<constructor-arg value="28"></constructor-arg>
</bean>
</beans>
xml์์ property ๋์ constructor-arg๋ฅผ ์ด์ฉํ์ฌ value ๋ฅผ ์ค์ ํด์ค๋๋ค.
package com.spring.ex02;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;
import com.spring.ex01.PersonService;
public class PersonTest2 {
public static void main(String[] args) {
BeanFactory factory = new XmlBeanFactory(new FileSystemResource("person2.xml"));
// person.xml ํ์ผ์ ๋ถ๋ฌ์ BeanFactory ๊ฐ์ฒด๋ฅผ ์์ฑ์์ผ์ค๋๋ค.
PersonService2 person1 = (PersonService2) factory.getBean("personService1");
//person.xml์์์ ๋น ๊ฐ์ฒด์ id๋ฅผ ๊ฐ์ ธ์์ค๋๋ค. id๋ ๊ณ ์ ์ด๋ฆ์ด๋ฏ๋ก ์ค๋ณต๋์ง ์์ต๋๋ค.
PersonService2 person2 = (PersonService2) factory.getBean("personService2");
// PersonService person = new PersonServiceImpl(); ๋์ด์ ์๋ฐ ์ฝ๋์์
// ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ์ง ์์๋ ๋๋ค.
person1.sayHello();
person2.sayHello();
}
}
setter์ ๋๊ฐ์ด ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
l ์์ฝ
- DI๋ ํด๋์ค๋ค๊ฐ ์์กด๊ด๊ณ๋ฅผ ๋ฎ์ถ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- ์คํ๋ง์์๋ ์์กด ๊ด๊ณ๋ฅผ ์คํ๋ง ์์ฒด์์ ๊ด๋ฆฌ ํด์ฃผ๋ ๋ฐ ์ด๋ฌํ ํน์ง์ IoC๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
- ์์ค ์ฝ๋ ์์ฒด์ ๊ฐ์ฒด๋ฅผ ์์ฑ์์ผ์ฃผ์ง ์๊ณ Bean์ ์ด์ฉํ์ฌ ์์กด ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ค์ผ๋ก์จ ํด๋์ค๋ค๊ฐ ์์กด๊ด๊ณ๋ฅผ ๋ฎ์ถฅ๋๋ค.
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ง๋ฌธ์ ์ธ์ ๋ ํ์ํฉ๋๋ค.
"๋ ๋ฐ๋์ ๋ฐฑ์๋ ์์ด ๋ ๊ฑฐ์ผ"
'...' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MyBatis] MyBatis ์์ํ๊ธฐ (0) | 2021.01.06 |
---|---|
[Spring] ๊ด์ ์งํฅ ํ๋ก๊ทธ๋จ(AOP) ์ดํดํ๊ธฐ (0) | 2021.01.03 |
[Java] equals() == ์ฐจ์ด ์ฝ๊ฒ ์ดํดํ๊ธฐ (2) | 2020.12.31 |
[Java] HashMap ์ฌ์ฉํ๊ธฐ (0) | 2020.12.30 |
[Java] StringUtils.isEmpty ์ฌ์ฉํ๊ธฐ (0) | 2020.12.30 |