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 라이센스를 따릅니다.