본문 바로가기

BackEnd/Spring

DI(Dependency Injection)

1. DI는 디자인 패턴의 일종이다.

DI(Dependency Injection) 의존성 주입을 이해하기 위해서 의존성이 무엇인지 살펴 보았다.

public class ElectronicCarToy {
	
	private Battery battery;
	
	public ElectronicCarToy() {
		battery = new NormalBattery();
	}
	
}

해당 클래스 안에는 새로운 Battery라는 객체를 생성한다.

이와 같이 클래스 안에 다른 클래스를 가지게 되는것을 의존성을 가졌다고 말한다.

 

그런데 이와 같은 코드에서

Battery가 다른 객체로 바뀌어야 할 경우에는 ElectronicCarToy 객체 마저 변해야 한다.

 

이를 막고자 의존성 주입이라는 디자인 패턴이 있다.

 

public class ElectronicRadioToy {
	
	private Battery battery;
	
	public ElectronicRadioToy(Battery battery) {
		this.battery = battery;
	}
	
	public void setBattery(Battery battery) {
		this.battery = battery;
	}
	
}

위의 코드는 생성자 생성 시 혹은 메소드를 이용하여 파라미터를 받아 전달할 뿐이다.

 

2. Spring은 동적으로 DI를 해준다.

< Spring의 DI >

XML을 통해서 Bean과 BeanContainer를 만들 수 있다.

Bean객체를 생성할 때,

생성자에서 혹은 메소드에서 전달 할 수 있게 된다.

 

3. 실습

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:c="http://www.springframework.org/schema/c"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="라디오" class="lec06Pjt001.toy.ElectronicRadioToy" >
		<constructor-arg ref="충전배터리"></constructor-arg>
	</bean>

	<bean id="충전배터리" class="lec06Pjt001.battery.ChargeBattery" >
		<property name="type" value="충전형"> </property>
	</bean>

	<bean id="일반배터리" class="lec06Pjt001.battery.NormalBattery" >
		<property name="type" value="일반형"> </property>
	</bean>


</beans>

< applicationContext.xml >

첫번째 빈은  라디오 객체를 생성하는 빈이다.

idBean의 이름을 뜻하고 class어떤 클래스 인지 경로를 설정해준다.

그리고 constructor-arg는 생성자의 전달값을 설정한다.

이 때 ref 에는 빈 객체를 입력해준다.

 

public class MainClass {

	public static void main(String[] args) {
      ClassPathXmlApplicationContext context  = new ClassPathXmlApplicationContext("applicationContext.xml");
      Toy radioToy = (Toy) context.getBean("라디오");
      radioToy.checkBattry();
      context.close();
      
      //Toy radioToy = new ElectronicRadioToy(new ChargeBattery());
      //radioToy.checkBattry();
	}

}

< MainClass.java >

위는 스프링을 이용한 DI

아래는 기본 자바의 DI 이다.

 

실제 ClassPathXmlApplicationContext를 통해서 xml파일에서 Container를 생성한다.

그리고 그 중 생성된 라디오 객체를 가져온 모습이다.

 

public class ElectronicRadioToy implements Toy {
	
	private Battery battery;
	
	public ElectronicRadioToy(Battery battery) {
		this.battery = battery;
	}	
	
	public void checkBattry() {
		battery.checker();
	}
	
	/*
	 * public void setBatteryType()  { 
	 * 	battery.setType("충전형");
	 * }
	 */
}

 

< ElectronicRadioToy.java >

구현체인 라디오장난감 객체이다.

 

Battery 객체를 가지고 있고

Battery 객체의 checker 메소드를 불러오는 메소드를 가지고 있다.

 

아래의 주석처리된 setBatteryType() 은 battery의 Type을 설정해주는 메소드인데,

Battery 객체가 Toy에 완전히 종속되어 있어서, Toy 이외에서 battery의 메소드를 불러올 수 없게 된다.

 

	<bean id="충전배터리" class="lec06Pjt001.battery.ChargeBattery" >
		<property name="type" value="충전형"> </property>
	</bean>

< applicationContext.xml >

이를 빈 객체를 생성하므로써 문제를 해결 할 수 있다.

property는 set메소드의 파라미터값을 넘겨주게 된다.

 

public class ChargeBattery implements Battery {

	String type;
	
	public void setType(String type) {
		this.type = type;
	}
	
	public void checker() {
		System.out.println(type+"오케이");
	}

}

< ChargeBattery >

 

보시다시피 setBatteryType이 주석처리됬음에도 불구하고 오류가 없이 실행된다.

'BackEnd > Spring' 카테고리의 다른 글

Tomcat  (0) 2019.07.02
Maven  (0) 2019.07.02
[실습] DB데이터로 Navigation 만들기 (Mybatias,Gson)  (0) 2019.06.04
Tiles설치 및 사용하여 html 템플릿 관리하기  (0) 2019.06.03
JSP-Servelet 게시판 제작하기 (1)  (0) 2019.05.31