[Spring] 여러개로 나뉜 Spring XML 설정파일 합치기

2020. 12. 17. 18:06 Spring Framework/Spring 입문 - 개념 및 핵심

스프링 빈 설정 파일 합치기(Spring Bean Configuration XML Merge)


스프링(Spring)에서 여러개로 나뉜 XML 설정파일들을 모아서 하나의 컨테이너로 생성하는 방법은 두 가지가 있다.


1. 자바 소스코드 상에서 Sring 배열로 클래스패스의 리스트들을 명시한 후 GenericXmlApplicationContext의 인자로 전달

2. 다른 빈 XML 설정파일에서 여러 XML 설정파일을 합하는 <import resource=[XML파일명]/>을 입력한 후 클래스패스로서 전달



자바 소스코드 상에서 합치기


다음은 두 XML 설정파일이다. 현재 eclipse상의 스프링 프로젝트의 구조는 아래와 같다.




appContext.xml과 appContext2.xml 두 설정파일이 존재한다. 이 두 설정파일의 정보는 다음과 같다.


appContext.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="gun" class="com.tutorial.spring.Gun"/>
<bean id="knife" class="com.tutorial.spring.Knife"/>
<bean id="spike" class="com.tutorial.spring.Spike"/>

<bean id="gunPlayer" class="com.tutorial.spring.Player">
<constructor-arg ref="gun"/>
</bean>
<bean id="knifePlayer" class="com.tutorial.spring.Player">
<property name="weapon" ref="knife"/>
</bean>
<bean id="spikePlayer" class="com.tutorial.spring.Player">
<property name="weapon" ref="spike"/>
</bean>

</beans>


appContext2.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="resturant1" class="com.tutorial.spring.Resturant">
<property name="names">
<list>
<value>Duke</value>
<value>Mario</value>
<value>Suzy</value>
<value>Kate</value>
</list>
</property>

<property name="menus">
<map>
<entry>
<key>
<value>1</value>
</key>
<value>KingCrap</value>
</entry>
<entry>
<key>
<value>2</value>
</key>
<value>IceCream</value>
</entry>
<entry>
<key>
<value>3</value>
</key>
<value>Pork</value>
</entry>
</map>
</property>
</bean>
</beans>


Main 진입점에서 아래의 코드와 같이 두 설정파일의 String배열을 명시하고 GenericXmlApplicationContext에 인자로 준다.


import org.springframework.context.support.GenericXmlApplicationContext;

public class Main {

public static void main(String[] args) {
String[] xmlConfigPath = {"classpath:appContext.xml", "classpath:appContext2.xml"}; // 설정파일 합치는 방법 1

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(xmlConfigPath);

Player gunPlayer = ctx.getBean("gunPlayer", Player.class);
gunPlayer.usePlayerWeapon();

Player spikePlayer = ctx.getBean("spikePlayer", Player.class);
spikePlayer.usePlayerWeapon();

Player knifePlayer = ctx.getBean("knifePlayer", Player.class);
knifePlayer.usePlayerWeapon();

Resturant resturant = ctx.getBean("resturant1", Resturant.class);

System.out.println("--- names property ---");
resturant.getNames().stream().forEach(System.out::println);
System.out.println("--- menus property ---");
resturant.getMenus().forEach((k, v) -> {
System.out.println("key : " + k + " " + "value : " + v);
});
}
}
// 결과
Use Gun
Use Spike
Use Knife
--- names property ---
Duke
Mario
Suzy
Kate
--- menus property ---
key : 1 value : KingCrap
key : 2 value : IceCream
key : 3 value : Pork

XML 설정파일에서 두 파일 합치기

XML 설정파일 상에서 두 파일을 합쳐서 하나로 묶을 수가 있다.



appContextAll.xml에 appContext.xml, appContext2.xml 이 두 파일을 합친다.


appContextAll.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">

<import resource="classpath:appContext.xml"/>
<import resource="classpath:appContext2.xml"/>
</beans>


appContextAll.xml을 불러오기만 하면 위 두 개의 파일을 소스 코드상에서 합친 것과 동일한 효과를 얻을 수 있다.

import org.springframework.context.support.GenericXmlApplicationContext;

public class Main {

public static void main(String[] args) {
//String[] xmlConfigPath = {"classpath:appContext.xml", "classpath:appContext2.xml"}; // 설정파일 합치는 방법 1
String xmlConfigPath = "classpath:appContextAll.xml";

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(xmlConfigPath);

Player gunPlayer = ctx.getBean("gunPlayer", Player.class);
gunPlayer.usePlayerWeapon();

Player spikePlayer = ctx.getBean("spikePlayer", Player.class);
spikePlayer.usePlayerWeapon();

Player knifePlayer = ctx.getBean("knifePlayer", Player.class);
knifePlayer.usePlayerWeapon();

Resturant resturant = ctx.getBean("resturant1", Resturant.class);

System.out.println("--- names property ---");
resturant.getNames().stream().forEach(System.out::println);
System.out.println("--- menus property ---");
resturant.getMenus().forEach((k, v) -> {
System.out.println("key : " + k + " " + "value : " + v);
});
}
}

//결과
Use Gun
Use Spike
Use Knife
--- names property ---
Duke
Mario
Suzy
Kate
--- menus property ---
key : 1 value : KingCrap
key : 2 value : IceCream
key : 3 value : Pork



출처: https://engkimbs.tistory.com/680?category=767795 [새로비]