DI(Dependency Injection)란?
문자 그대로 의존성을 주입시킨다는 의미입니다. 객체를 직접 생성하는게 아니라 외부에서 생성한 후 주입을 시켜주는 방식입니다.
사실 Spring에서 나온 개념이 아닌 Java에서도 존재하였지만, Spring에서 좀 더 체계화 되었습니다.
Java에서도 Battery 라는 객체를 새로운 객체인 Robot, Phone, Laptop 이라는 객체로 주입할 수 있습니다.
package lesson02_DI_Basic;
import lesson02_DI_Basic_Battery.Battery;
import lesson02_DI_Basic_Battery.ChargedBattery;
import lesson02_DI_Basic_Battery.UnChargedBattery;
import lesson02_DI_Basic_Stuff.Laptop;
import lesson02_DI_Basic_Stuff.Phone;
import lesson02_DI_Basic_Stuff.Robot;
public class Main {
public static void main(String[] args) {
Battery chargedBattery = new ChargedBattery();
Battery battery = new UnChargedBattery();
// 로봇이 객체를 만들 때, 건전지가 내장되어 만들어 집니다.
Robot robot = new Robot();
// Phone 객체를 만들때, setBattery를 통하여 외부에서 값을 넣어 줄 수 있습니다.
Phone phone = new Phone();
phone.setBattery(chargedBattery);
// 노트북 객체를 만들때, setBattery를 통하여 외부에서 값을 넣어 줄 수 있습니다.
Laptop laptop = new Laptop(battery);
}
}
Robot 은 기본 생성자 안에 battery 객체를 생성시킵니다. ( Robot 호출 시, Battery 를 바꿀 수 없습니다.)
package lesson02_DI_Basic_Stuff;
import lesson02_DI_Basic_Battery.Battery;
import lesson02_DI_Basic_Battery.ChargedBattery;
public class Robot {
private Battery battery;
// 로봇이 객체를 만들 때, 건전지가 내장되어 만들어 집니다.
public Robot() {
battery = new ChargedBattery();
}
}
Phone 은 객체를 생성하면 기본 생성자를 호출합니다. ( Phone 호출 시, 외부에서 Battery 를 바꿉니다.)
package lesson02_DI_Basic_Stuff;
import lesson02_DI_Basic_Battery.Battery;
public class Phone {
private Battery battery;
public Phone() {
// TODO Auto-generated constructor stub
}
// Phone 객체를 만들때, setBattery를 통하여 외부에서 값을 넣어 줄 수 있습니다.
public void setBattery(Battery battery) {
this.battery = battery;
}
}
Laptop 은 외부에서 생성된 battery가 객체 호출시 , 기본 생성자 안에 들어갑니다.
( Laptop 호출 시, 외부에서 Battery 를 바꿀수있습니다.)
package lesson02_DI_Basic_Stuff;
import lesson02_DI_Basic_Battery.Battery;
public class Laptop {
private Battery battery;
// 노트북 객체를 만들 때, 건전지가 내장되어 만들어 집니다.
public Laptop(Battery battery) {
this.battery = battery;
}
// 노트북 객체를 만들때, setBattery를 통하여 외부에서 값을 넣어 줄 수 있습니다.
public void setBattery(Battery battery) {
this.battery = battery;
}
}
Spring에서도 Battery 라는 객체를 새로운 객체인 Robot, Phone, Laptop 이라는 객체로 주입할 수 있습니다.
package lesson02_DI_Spring;
import org.springframework.context.support.GenericXmlApplicationContext;
import lesson02_DI_Spring_Battery.Battery;
import lesson02_DI_Spring_Stuff.Laptop;
import lesson02_DI_Spring_Stuff.Phone;
import lesson02_DI_Spring_Stuff.Robot;
public class Main {
public static void main(String[] args) {
// applicationContext 호출하여 사용하겠다고 선언합니다.
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationContext.xml");
Robot robot = ctx.getBean("robot",Robot.class);
Phone phone = ctx.getBean("phone",Phone.class);
Laptop laptop = ctx.getBean("laptop",Laptop.class);
ctx.close();
}
}
Spring 에서는 applicationContext.xml 에서 Bean 을 선언하면 스프링 컨테이너가 생성 시 메모리에 등록이 됩니다.
등록된 객체들은 getBean을 통하여 "호출" 할 수 있습니다.
<?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">
<!-- class 안에 패키지 명부터 작성해주면 메모리에 올라가게됩니다.-->
<bean id="battery" class="lesson02_DI_Spring_Battery.Battery"/>
<bean id="robot" class="lesson02_DI_Spring_Stuff.Robot"/>
<bean id="phone" class="lesson02_DI_Spring_Stuff.Phone">
<property name="Number" value="01012345678"/>
</bean>
<bean id="laptop" class="lesson02_DI_Spring_Stuff.Laptop">
<constructor-arg ref="battery"></constructor-arg>
<property name="SerialNo" value="123456789"/>
</bean>
</beans>
Spring 에서는 applicationContext.xml 주입하기 위해서는 GenericXmlApplicationContext 혹은 import resource 를 통하여 가져올 수 있습니다.
또한 기존에는 new 를 통해 객체를 생성해서 만들었다면 (참조되는 주소값이 다름) ,
Spring 에서는 스프링 컨테이너가 먼저 실행되면서 객체를 모두 담아둡니다. 이후 객체를 호출만 해서 사용합니다.
(참조되는 주소값 같음)
이와같은 형태를 SingleTon Pattern 이라고 합니다. 반대 되는 개념으로는 프로토 타입이라고하며 거의 사용되지는 않습니다.
GenericXmlApplicationContext 를 이용
import resource를 통하여 다른 설정 파일을 주입할 수 있습니다.
'Web Programming > Spring' 카테고리의 다른 글
6. Spring 로그인 만들기를 통한 기능 엿보기 (0) | 2020.04.05 |
---|---|
5. Spring 프로젝트의 구조 분석 (0) | 2020.04.04 |
4. Spring 웹 프로그래밍 설계 모델 (0) | 2020.04.03 |
3. Spring 어노테이션 Autowired, Resource, Inject (0) | 2020.03.31 |
1. Maven 의 개요 및 스프링의 이해 (0) | 2020.03.29 |