SW/Java

Java : Spring : 의존성 주입(Dependency Injection) : 개념, 예제, 구현

얇은생각 2020. 4. 20. 19:30
반응형

Java : Spring : 의존성 주입(Dependency Injection) : 개념, 예제, 구현

 

의존성 주입(Dependency Injection)

의존성 주입은 spring에서 아주 중요한 개념이자 장점입니다. Bean 객체를 생성할 떄 Bean 객체가 관리할 값이나 객체를 주입하는 것을 의미합니다. Bean 객체 생성 후 Bean 객체가 가질 기본 값을 자바 코드로 설정하는 것이 아닌 Bean을 정의하는 xml 코드에서 정의하는 개념입니다.

 

 

생성자를 통한 주입

Bean을 정의할 떄 constructor-arg 태그를 이용해 주입하게 되면 생성자를 통해 주입할 수 있습니다.

value : 기본 자료형 값과 문자열 값을 설정합니다.
ref : 객체를 설정합니다. 
type : 저장할 값의 타입을 설정합니다.
index : 지정된 값을 주입할 생성자의 매개변수 인덱스 번호입니다.

 

 

beans.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">
	
	<bean id='obj1' class='kr.co.softcampus.beans.TestBean' lazy-init='true'/>
	
	<bean id='obj2' class='kr.co.softcampus.beans.TestBean' lazy-init='true'>
		<constructor-arg value='100' type='int'/>
	</bean>
	
	<bean id='obj3' class='kr.co.softcampus.beans.TestBean' lazy-init='true'>
		<constructor-arg value='11.11' type='double'/>
	</bean>
	
	<bean id='obj4' class='kr.co.softcampus.beans.TestBean' lazy-init='true'>
		<constructor-arg value='문자열'/>
	</bean>
	
	<bean id='obj5' class='kr.co.softcampus.beans.TestBean' lazy-init='true'>
		<constructor-arg value='200' type='int'/>
		<constructor-arg value='22.22' type='double'/>
		<constructor-arg value='안녕하세요' type='java.lang.String'/>
	</bean>
	
	<bean id='obj6' class='kr.co.softcampus.beans.TestBean' lazy-init='true'>
		<constructor-arg value='반갑습니다' type='java.lang.String'/>
		<constructor-arg value='300' type='int'/>
		<constructor-arg value='33.33' type='double'/>
	</bean>
	
	<bean id='obj7' class='kr.co.softcampus.beans.TestBean' lazy-init='true'>
		<constructor-arg value='44.44' type='double' index='1'/>
		<constructor-arg value='44' type='int' index='0'/>
		<constructor-arg value='안녕하세요' type='java.lang.String' index='2'/>
	</bean>
	
	<bean id='obj8' class='kr.co.softcampus.beans.TestBean2' lazy-init='true'>
		<constructor-arg>
			<bean class='kr.co.softcampus.beans.DataBean'/>
		</constructor-arg>
		<constructor-arg>
			<bean class='kr.co.softcampus.beans.DataBean'/>
		</constructor-arg>
	</bean>
	
	<bean id='data_bean' class='kr.co.softcampus.beans.DataBean' scope='prototype'/>
	
	<bean id='obj9' class='kr.co.softcampus.beans.TestBean2' lazy-init='true'>
		<constructor-arg ref='data_bean'/>
		<constructor-arg ref='data_bean'/>
	</bean>
	                    
</beans>

 

 

DataBean.java

package kr.co.softcampus.beans;

public class DataBean {

}

 

 

TestBean.java

package kr.co.softcampus.beans;

public class TestBean {
	
	private int data1;
	private double data2;
	private String data3;
	
	public TestBean() {
		System.out.println("TestBean의 기본 생성자");
		this.data1 = 0;
		this.data2 = 0.0;
		this.data3 = null;
	}
	
	public TestBean(int data1) {
		System.out.println("TestBean의 생성자 : int 변수 1개");
		this.data1 = data1;
		this.data2 = 0.0;
		this.data3 = null;
	}
	
	public TestBean(double data2) {
		System.out.println("TestBean의 생성자 : double 변수 1개");
		this.data1 = 0;
		this.data2 = data2;
		this.data3 = null;
	}
	
	public TestBean(String data3) {
		System.out.println("TestBean의 생성자 : String 변수 1개");
		this.data1 = 0;
		this.data2 = 0.0;
		this.data3 = data3;
	}
	
	public TestBean(int data1, double data2, String data3) {
		System.out.println("TestBean의 생성자 : 변수 3개");
		this.data1 = data1;
		this.data2 = data2;
		this.data3 = data3;
	}
	
	public void printData() {
		System.out.printf("data1 : %d\n", data1);
		System.out.printf("data2 : %f\n", data2);
		System.out.printf("data3 : %s\n", data3);
	}
}

 

 

TestBean2.java

package kr.co.softcampus.beans;

public class TestBean2 {
	
	private DataBean data1;
	private DataBean data2;
	
	public TestBean2(DataBean data1, DataBean data2) {
		this.data1 = data1;
		this.data2 = data2;
	}
	
	public void printData() {
		System.out.printf("data1 : %s\n", data1);
		System.out.printf("data2 : %s\n", data2);
	}
}

 

 

MainClass.java

package kr.co.softcampus.main;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import kr.co.softcampus.beans.DataBean;
import kr.co.softcampus.beans.TestBean;
import kr.co.softcampus.beans.TestBean2;

public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml");
		
		TestBean t1 = new TestBean();
		t1.printData();
		
		System.out.println("-------------------------");
		
		TestBean t2 = new TestBean(100);
		t2.printData();
		
		System.out.println("--------------------------");
		
		TestBean t3 = new TestBean(11.11);
		t3.printData();
		
		System.out.println("--------------------------");
		
		TestBean t4 = new TestBean("문자열");
		t4.printData();
		
		System.out.println("--------------------------");
		
		TestBean t5 = new TestBean(200, 22.22, "안녕하세요");
		t5.printData();
		
		System.out.println("--------------------------");
		
		//TestBean t6 = new TestBean("반갑습니다", 300, 33.33);
		//t6.printData();
		
		System.out.println("--------------------------");
		
		TestBean obj1 = ctx.getBean("obj1", TestBean.class);
		obj1.printData();
		
		System.out.println("--------------------------");
		
		TestBean obj2 = ctx.getBean("obj2", TestBean.class);
		obj2.printData();
		
		System.out.println("--------------------------");
		
		TestBean obj3 = ctx.getBean("obj3", TestBean.class);
		obj3.printData();
		
		System.out.println("--------------------------");
		
		TestBean obj4 = ctx.getBean("obj4", TestBean.class);
		obj4.printData();
		
		System.out.println("--------------------------");
		
		TestBean obj5 = ctx.getBean("obj5", TestBean.class);
		obj5.printData();
		
		System.out.println("--------------------------");
		
		TestBean obj6 = ctx.getBean("obj6", TestBean.class);
		obj6.printData();
		
		System.out.println("--------------------------");
		
		TestBean obj7 = ctx.getBean("obj7", TestBean.class);
		obj7.printData();
		
		System.out.println("-------------------------------");
		
		DataBean d1 = new DataBean();
		DataBean d2 = new DataBean();
		TestBean2 t200 = new TestBean2(d1, d2);
		t200.printData();
		
		System.out.println("-------------------------------");
		
		TestBean2 obj8 = ctx.getBean("obj8", TestBean2.class);
		obj8.printData();
		
		System.out.println("-------------------------------");
		
		TestBean2 obj9 = ctx.getBean("obj9", TestBean2.class);
		obj9.printData();
		
		ctx.close();
	}
}

 

bean에다가 지정해놓은 변수값을 넣어주어 의존성을 주입하는 예제를 진행해보았습니다. 의존성을 고정적으로 주입하는 과정을 통해, 유지보수성을 높일 수 있다는 것을 알게 되었습니다. 만약, 의존성 주입을 하지 않고 따로 직접 주입을 하여 개발을 한다면, 추후에 수정할 때는 해당 객체를 다 수정해야하고, 그 부분을 놓치게 된다면, 실수를 범할 수 있을 것이란 생각을 하게 되었습니다. 

반응형