포스트

Xml 파일을 이용한 설정(2)

xml파일을 이용한 설정(2)

DI 확인하기 - xml을 이용해 빈을 생성해서 주입


  • 이번에는 DI 즉 의존성 주입을 확인해보도록 한다. Car와 Engine이라는 클래스 2개를 생성한다.

Engine.java

1
2
3
4
5
6
7
8
9
10
11
package kr.or.connect.diexam01;

public class Engine {
	public Engine() {
		System.out.println("Engine 생성자");
	}
	
	public void exec() {
		System.out.println("엔진이 동작합니다.");
	}
}

Car.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package kr.or.connect.diexam01;

public class Car {
	private Engine v8;
	
	public Car() {
		System.out.println("Car 생성자"); // 객체 생성 확인 
	}
	
	public void setEngine(Engine e) {
		this.v8 = e;
	}
	
	public void run() {
		System.out.println("엔진을 이용하여 달립니다.");
		v8.exec(); 
	}
	
	public static void main(String[] args) {
	  // 위의 Car 클래스가 제대로 동작하도록 하려면 보통 다음과 같은 코드가 작성되야 한다.
		Engine e = new Engine(); // 자동차는 엔진이 필요하다. 
		Car c = new Car();
		c.setEngine(e);
		c.run();
	}
}

이미지

  • 1, 2 번째 줄을 Spring 컨테이너에게 맡기기 위해 설정파일에 다음과 같은 코드를 입력한다.
1
2
3
4
<bean id="e" class="kr.or.connect.diexam01.Engine"></bean>
<bean id="car" class="kr.or.connect.diexam01.Car">
	<property name="engine" ref="e"></property>
</bean>
  • 즉, 위의 XML설정은 다음과 같은 의미를 가진다.
1
2
3
Engine e = new Engine();
Car c = new Car();
c.setEngine( e );

applicationContext.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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="userBean" class="kr.or.connect.diexam01.UserBean"></bean>
	
	<!-- Engine과 Car의 인스턴스가 싱글톤으로 생성된다. -->
	<bean id="e" class="kr.or.connect.diexam01.Engine"></bean>
	<bean id="c" class="kr.or.connect.diexam01.Car">
		<!-- Car 인스턴스에 Engine을 set하기 위한 property 설정. name="engine"인 property는 setEngine 혹은 getEngine을 의미한다. 빈 태그 안에서는 모두 값을 설정하는 것이기에 setEngine()메서드를 의미한다. -->
		<property name="engine" ref="e"></property>
	</bean>
</beans>
  • Car.java의 메인 메소드 주석 처리, 위의 설정 파일을 읽어들여 실행하는 ApplicationContextExam02.java를 작성한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package kr.or.connect.diexam01;

public class Car {
	private Engine v8;
	
	public Car() {
		System.out.println("Car 생성자"); // 객체 생성 확인 
	}
	
	public void setEngine(Engine e) {
		this.v8 = e;
	}
	
	public void run() {
		System.out.println("엔진을 이용하여 달립니다.");
		v8.exec(); 
	}
	
//	public static void main(String[] args) {
//		Engine e = new Engine(); // 자동차는 엔진이 필요하다. 
//		Car c = new Car();
//		c.setEngine(e);
//		c.run();
//	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package kr.or.connect.diexam01;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationContextExam02 {

	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); // 스프링 컨테이너 이용. 클래스의 생성자에 해당 xml 정보를 넘겨준다.  
	
		Car car = (Car) ac.getBean("c"); // 등록했던 빈 id 이용
		car.run();
	}

}

이미지

  • 사용자는 단순히 Car 클래스만 알고 있으면 된다. 이후에 만약 Car를 상속받는 Bus 클래스가 생성되면, XML 파일만 변경하여 새로운 클래스를 추가할 수 있다. 또한, Bus 클래스가 상속받는 엔진 클래스를 변경하고자 한다면, XML 파일을 수정하여 새로운 엔진을 주입받도록 변경할 수 있다. 이렇게 변경된 설정은 실행 클래스의 코드를 수정할 필요 없이 정기 버스가 동작하는 코드로 유지될 수 있다.
  • 현재는 어노테이션과 자바 컨피그를 함께 사용하여 설정하는 방법이 더 많이 사용되고 있다. 이 방식은 XML 파일 대신 자바 코드로 설정을 관리하며, 어노테이션을 사용하여 빈을 선언하고 의존성을 주입한다. 이는 설정 파일과 코드를 한 곳에서 관리할 수 있어 더 간편하고 유연한 방식이다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.