Spring

[Spring] μŠ€ν”„λ§ XML μ„€μ • 파일 μž‘μ„± 방법 정리

Leica 2020. 4. 13. 03:30
λ°˜μ‘ν˜•

[Spring] μŠ€ν”„링 XML μ„€μ • νŒŒμΌ μž‘μ„± λ°©λ²• μ •λ¦¬

πŸ“„ λͺ©μ°¨

1. μŠ€ν”„λ§ XML μ„€μ • 파일 포맷
- 기본 포맷
- μ• λ…Έν…Œμ΄μ…˜ 섀정을 μ‚¬μš©ν•˜κΈ° μœ„ν•œ 포맷

2. 빈(Bean) μ„€μ • μ˜ˆμ‹œ
- μžλ™ μ£Όμž… μ„€μ • - autowire 속성

3. DI(Dependency Injection) μ„€μ •
- μƒμ„±μž μ£Όμž…
- ν”„λ‘œνΌν‹° μ£Όμž…
- ν”„λ‘œνΌν‹° μ£Όμž… - List νƒ€μž…
- ν”„λ‘œνΌν‹° μ£Όμž… - Set νƒ€μž…
- ν”„λ‘œνΌν‹° μ£Όμž… - Map νƒ€μž…
- ν”„λ‘œνΌν‹° μ£Όμž… - Properties νƒ€μž…

4. ApplicationContext 객체 생성
- μŠ€ν”„λ§ XML μ„€μ • 파일이 ν•œ 개인 경우
- μŠ€ν”„λ§ XML μ„€μ • 파일이 μ—¬λŸ¬ 개인 경우
- μŠ€ν”„λ§ XML μ„€μ • 파일이 μ—¬λŸ¬ 개인 경우(import νƒœκ·Έ μ‚¬μš©)

 

1. μŠ€ν”„λ§ XML μ„€μ • 파일 포맷

기본 포맷

πŸ‘‰ 빈 등둝, 빈 섀정을 λͺ¨λ‘ 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">

</beans>

μœ„μ™€ 같은 λ„€μž„ μŠ€νŽ˜μ΄μŠ€μ™€ μŠ€ν‚€λ§ˆ 속성을 κ°–λŠ” <beans> νƒœκ·Έ μ•ˆμ— μŠ€ν”„λ§ 빈 섀정을 μž‘μ„±ν•œλ‹€.

 

μ• λ…Έν…Œμ΄μ…˜ 섀정을 μ‚¬μš©ν•˜κΈ° μœ„ν•œ 포맷

πŸ‘‰ 빈 등둝은 XML, 빈 섀정은 μžλ°” μ• λ…Έν…Œμ΄μ…˜μœΌλ‘œ ν•  경우 이 포맷을 μ‚¬μš©ν•œλ‹€.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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 
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>
</beans>

context λ„€μž„ μŠ€νŽ˜μ΄μŠ€μ™€ <context:annotation-config/> μ½”λ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ 빈 섀정을 XML 파일이 μ•„λ‹Œ 빈 클래슀의 μ• λ…Έν…Œμ΄μ…˜μ„ 검색해 λ°˜μ˜ν•œλ‹€.

 

 

2. 빈(Bean) μ„€μ • μ˜ˆμ‹œ

<bean> νƒœκ·Έλ₯Ό μ΄μš©ν•΄ λΉˆμ„ μ •μ˜ν•œλ‹€.

<bean id="studentDao" class="ems.member.dao.StudentDao" />

<bean> νƒœκ·Έμ˜ ν•„μˆ˜ 속성은 class 속성 ν•˜λ‚˜ 뿐이닀.

idλŠ” 빈의 idλ₯Ό 톡해 μ°Έμ‘°ν•  κ²½μš°κ°€ μžˆλŠ” κ²½μš°μ—λ§Œ μ„€μ •ν•˜λ©΄ λœλ‹€.

μžλ°” μ½”λ“œμ—μ„œ getBean()으둜 λΉˆμ„ κ°€μ Έμ˜€λ˜μ§€, μ£Όμž… μ„€μ •μ—μ„œ ref μ†μ„±μœΌλ‘œ λΉˆμ„ μ°Έμ‘°ν•˜λŠ” κ²½μš°μ΄λ‹€.

id, class μ™Έμ—λŠ” lazy-init, scope, primary, init-method, destroy-method 속성이 μžˆλ‹€.

 

  • id : 빈 이름(id) μ„€μ •
  • class : 빈 νƒ€μž… μ„€μ •
  • scope : 빈의 scope μ„€μ •. singleton/prototype
  • primary : trueλ₯Ό μ§€μ •ν•˜μ—¬ 같은 νƒ€μž…μ˜ 빈이 μ—¬λŸ¬κ°œ μΌλ•Œ μš°μ„ μ μœΌλ‘œ μ‚¬μš©ν•  빈 μ„€μ •
  • lazy-init : trueλ₯Ό μ§€μ •ν•˜μ—¬ λΉˆμ„ μ‚¬μš©ν•  λ•Œ 객체가 μƒμ„±λ˜λ„λ‘ μ„€μ •
  • init-method : 빈 객체가 μƒμ„±λ λ•Œ ν˜ΈμΆœν•  λ©”μ†Œλ“œ μ„€μ •
  • destroy-method : 빈 객체가 μ†Œλ©Έλ λ•Œ ν˜ΈμΆœν•  λ©”μ†Œλ“œ μ„€μ •

 

μžλ™ μ£Όμž… μ„€μ • - autowire 속성

클래슀의 μ°Έμ‘° νƒ€μž… ν•„λ“œμ— ν•œν•΄μ„œ autowire 속성을 μ‚¬μš©ν•΄ μžλ™ μ£Όμž…λ˜λ„λ‘ μ„€μ •ν•  수 μžˆλ‹€.

 

XML μ„€μ • 파일

<bean id='obj2' class='com.atoz_develop.beans.TestBean1' autowire="byName"/>

<bean id='data1' class='com.atoz_develop.beans.DataBean1'/>
<bean id='data2' class='com.atoz_develop.beans.DataBean1'/>

<bean>의 autowire 속성에 "byName"을 μ„€μ •ν•œλ‹€.

 

μžλ°” μ½”λ“œ

public class TestBean1 {

	private DataBean1 data1;
	private DataBean1 data2;
	
	public DataBean1 getData1() {
		return data1;
	}
	public void setData1(DataBean1 data1) {
		this.data1 = data1;
	}
	public DataBean1 getData2() {
		return data2;
	}
	public void setData2(DataBean1 data2) {
		this.data2 = data2;
	}
}

TestBean1 클래슀의 λΉˆμ„ 생성할 λ•Œ DataBean1 νƒ€μž…μΈ ν•„λ“œ data1, data2에 λ³€μˆ˜λͺ…κ³Ό idκ°€ λ™μΌν•œ 빈이 μžλ™μœΌλ‘œ μ£Όμž…λœλ‹€.

λ”°λΌμ„œ <bean>의 id 속성과 클래슀의 λ³€μˆ˜λͺ…이 동일해야 ν•˜λ©°, setterλ₯Ό 톡해 μ£Όμž…λ˜λ―€λ‘œ setterκ°€ ν•„μš”ν•˜λ‹€.


λ‹€μŒμœΌλ‘œ 빈의 이름(id)κ°€ μ•„λ‹Œ 빈의 νƒ€μž…μ„ ν†΅ν•œ μžλ™ μ£Όμž…μ„ μ•Œμ•„λ³΄μž.

 

XML μ„€μ • 파일

<bean id='obj3' class='com.atoz_develop.beans.TestBean2' autowire="byType"/>

<bean id='data_bean2' class='com.atoz_develop.beans.DataBean2'/>

<bean>의 autowire 속성에 "byType"을 μ„€μ •ν•œλ‹€.

 

μžλ°” μ½”λ“œ

public class TestBean2 {

	private DataBean2 data1;
	private DataBean2 data2;
	
	public DataBean2 getData1() {
		return data1;
	}
	public void setData1(DataBean2 data1) {
		this.data1 = data1;
	}
	public DataBean2 getData2() {
		return data2;
	}
	public void setData2(DataBean2 data2) {
		this.data2 = data2;
	}
}

TestBean2 클래슀의 λΉˆμ„ 생성할 λ•Œ DataBean2 νƒ€μž…μΈ ν•„λ“œ data1, data2에 νƒ€μž…μ΄ 같은 빈이 μžλ™μœΌλ‘œ μ£Όμž…λœλ‹€.

XML 섀정에 primary μ„€μ • 없이 νƒ€μž…μ΄ λ™μΌν•œ 빈이 두 개 이상 μ •μ˜λ˜μ–΄ 있으면 μ—λŸ¬κ°€ λ°œμƒν•˜λ―€λ‘œ 이에 μ£Όμ˜ν•˜μž.

λ§ˆμ°¬κ°€μ§€λ‘œ setterλ₯Ό 톡해 μ£Όμž…λ˜λ―€λ‘œ setterκ°€ ν•„μš”ν•˜λ‹€.


μƒμ„±μžλ₯Ό ν†΅ν•œ μžλ™ μ£Όμž…μ€ λ‹€μŒκ³Ό 같이 μ„€μ •ν•œλ‹€.

 

XML μ„€μ • 파일

<bean id='data_bean2' class='com.atoz_develop.beans.DataBean2'/>
<bean id='obj5' class='com.atoz_develop.beans.TestBean3' autowire="constructor"/>

<bean>의 autowire 속성에 "constructor"λ₯Ό μ„€μ •ν•œλ‹€.

 

μžλ°” μ½”λ“œ

public class TestBean3 {

	private int data1;
	private String data2;
	private DataBean2 data3;
	private DataBean2 data4;
	
	public TestBean3(DataBean2 data3, DataBean2 data4) {
		this.data3 = data3;
		this.data4 = data4;
	}
	
	public int getData1() {
		return data1;
	}
	public void setData1(int data1) {
		this.data1 = data1;
	}
	public String getData2() {
		return data2;
	}
	public void setData2(String data2) {
		this.data2 = data2;
	}
	public DataBean2 getData3() {
		return data3;
	}
	public void setData3(DataBean2 data3) {
		this.data3 = data3;
	}
	public DataBean2 getData4() {
		return data4;
	}
	public void setData4(DataBean2 data4) {
		this.data4 = data4;
	}
}

 

 

autowire 속성을 μ΄μš©ν•œ μžλ™ μ£Όμž…μ€ μ°Έμ‘° νƒ€μž…λ§Œ κ°€λŠ₯ν•˜λ―€λ‘œ κΈ°λ³Έ νƒ€μž… ν•„λ“œλŠ” λ‹€μŒκ³Ό 같이 직접 μ„€μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

 

XML μ„€μ • 파일

<bean id='obj7' class='com.atoz_develop.beans.TestBean3' autowire="constructor">
	<constructor-arg value='200' index='0' type='int'/>
	<constructor-arg value='λ¬Έμžμ—΄2' index='1'/>
</bean>

 

μžλ°” μ½”λ“œ

public class TestBean3 {

	private int data1;
	private String data2;
	private DataBean2 data3;
	private DataBean2 data4;
	
	public TestBean3(int data1, String data2, DataBean2 data3, DataBean2 data4) {
		this.data1 = data1;
		this.data2 = data2;
		this.data3 = data3;
		this.data4 = data4;
	}
	
	public int getData1() {
		return data1;
	}
	public void setData1(int data1) {
		this.data1 = data1;
	}
	public String getData2() {
		return data2;
	}
	public void setData2(String data2) {
		this.data2 = data2;
	}
	public DataBean2 getData3() {
		return data3;
	}
	public void setData3(DataBean2 data3) {
		this.data3 = data3;
	}
	public DataBean2 getData4() {
		return data4;
	}
	public void setData4(DataBean2 data4) {
		this.data4 = data4;
	}
}

<beans> λ ˆλ²¨μ— default-autowire 속성을 μ‚¬μš©ν•΄μ„œ <bean>에 autowire 섀정이 λ˜μ–΄μžˆμ§€ μ•Šμ„ 경우 기본적으둜 μ μš©ν•  μžλ™ μ£Όμž… 방법을 μ„€μ •ν•  수 μžˆλ‹€.

 

<?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"
	default-autowire="byName">

μ΄λ ‡κ²Œ <beans>에 default-autowire 속성을 μΆ”κ°€ν•˜κ³  μ‚¬μš©ν•  μžλ™ μ£Όμž… μ˜΅μ…˜μ„ μ„€μ •ν•œλ‹€.

그리고 νŠΉμ • λΉˆμ€ μžλ™ μ£Όμž…μ„ ν•˜μ§€ μ•ŠμœΌλ €λ©΄ <bean>의 autowire 속성에 "no"λ₯Ό μ„€μ •ν•˜λ©΄ λœλ‹€.

 

<bean id='obj9' class='com.atoz_develop.beans.TestBean1' autowire="no"/>

이 λΉˆμ€ default-autowire의 영ν–₯을 받지 μ•Šκ²Œ λœλ‹€.

 

 

3. DI(Dependency Injection) μ„€μ •

μƒμ„±μž μ£Όμž…

XML μ„€μ • 파일

<bean id="studentDao" class="ems.member.dao.StudentDao" ></bean>

<bean id="registerService" class="ems.member.service.StudentRegisterService">
    <constructor-arg ref="studentDao" />
</bean>

 

μžλ°” μ½”λ“œ

public class StudentRegisterService {

	private StudentDao studentDao;
	
	public StudentRegisterService(StudentDao studentDao) {
		this.studentDao = studentDao;
	}
}

μƒμ„±μžκ°€ μ—¬λŸ¬ 개인 경우 <constructor-arg>에 type 속성을 μ‚¬μš©ν•΄μ„œ μ–΄λ–€ μƒμ„±μžλ₯Ό μ‚¬μš©ν•΄μ„œ 빈 객체λ₯Ό λ§Œλ“€ 것인지 ꡬ체적으둜 λͺ…μ‹œν•  수 μžˆλ‹€.

μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ 기본적으둜 String νƒ€μž…μ˜ μ•„κ·œλ¨ΌνŠΈλ₯Ό κ°–λŠ” μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜κ²Œ λ˜λ―€λ‘œ κ·Έ μ™Έμ˜ κΈ°λ³Έ νƒ€μž…μ„ κ°–λŠ” μƒμ„±μž μ£Όμž… μ‹œ type을 λͺ…μ‹œν•˜λŠ” 것이 μ’‹λ‹€.

 

XML μ„€μ • 파일

<bean id="obj1" class="com.atoz_develop.beans.TestBean">
	<constructor-arg value="100" type="int"/>
</bean>

<bean id="obj2" class="com.atoz_develop.beans.TestBean">
	<constructor-arg value="11.11" type="double"/>
</bean>

<bean id="obj3" class="com.atoz_develop.beans.TestBean">
	<constructor-arg value="λ¬Έμžμ—΄" type="java.lang.String"/>
</bean>

 

μžλ°” μ½”λ“œ

public class TestBean {
	
	private int data1;
	private double data2;
	private String data3;

	public TestBean(int data1) {
		this.data1 = data1;
		this.data2 = 0.0;
		this.data3 = null;
	}
	
	public TestBean(double data2) {
		this.data1 = 0;
		this.data2 = data2;
		this.data3 = null;
	}
	
	public TestBean(String data3) {
		this.data1 = 0;
		this.data2 = 0.0;
		this.data3 = data3;
	}
}

μžλ°”μ˜ new μ—°μ‚°μžλ‘œ 객체λ₯Ό μƒμ„±ν• λ•Œμ™€ 달리 μŠ€ν”„λ§ DI의 μƒμ„±μž μ£Όμž… μ„€μ • μ‹œμ—λŠ” μƒμ„±μž μ•„κ·œλ¨ΌνŠΈμ˜ μˆœμ„œλ₯Ό λ‹€λ₯΄κ²Œ ν•  수 μžˆλ‹€.

μŠ€ν”„λ§μ΄ μˆœμ„œλ₯Ό μœ μΆ”ν•˜κΈ° μ–΄λ €μšΈ λ•ŒλŠ” typeκ³Ό index 속성을 μ‚¬μš©ν•΄μ„œ μˆœμ„œλ₯Ό ꡬ체적으둜 λͺ…μ‹œν•œλ‹€.

 

XML μ„€μ • 파일

<bean id="obj1" class="com.atoz_develop.beans.TestBean">
	<constructor-arg value="λ°˜κ°‘μŠ΅λ‹ˆλ‹€" type="java.lang.String"/>
	<constructor-arg value="300" type="int"/>
	<constructor-arg value="33.33" type="double"/>
</bean>

<bean id="obj2" class="com.atoz_develop.beans.TestBean">
	<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>

 

μžλ°” μ½”λ“œ

public class TestBean {
	
	private int data1;
	private double data2;
	private String data3;
	
	public TestBean(int data1, double data2, String data3) {
		this.data1 = data1;
		this.data2 = data2;
		this.data3 = data3;
	}
}

객체 μ£Όμž… μ‹œ  <constructor-arg>에 ref 속성을 μ‚¬μš©ν•˜λŠ” 것 외에도 <constructor-arg> ν•˜μœ„μ— <bean>을 μ‚¬μš©ν•΄μ„œ λΉˆμ„ 직접 μ •μ˜ν•  수 μžˆλ‹€.

 

XML μ„€μ • 파일

<bean id="obj" class="com.atoz_develop.beans.TestBean">
	<constructor-arg>
		<bean class="com.atoz_develop.beans.DataBean"/>
	</constructor-arg>
	<constructor-arg>
		<bean class="com.atoz_develop.beans.DataBean"/>
	</constructor-arg>
</bean>

 

μžλ°” μ½”λ“œ

public class TestBean {
	
	private DataBean data1;
	private DataBean data2;
	
	public TestBean(DataBean data1, DataBean data2) {
		this.data1 = data1;
		this.data2 = data2;
	}
}

 

 

ν”„λ‘œνΌν‹° μ£Όμž…

XML μ„€μ • 파일

<bean id="dataBaseConnectionInfoDev" class="ems.member.DataBaseConnectionInfo">
	<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />
	<property name="userId" value="scott" />
	<property name="userPw" value="tiger" />
</bean>

<property>의 value 속성을 μ‚¬μš©ν•΄μ„œ 값을 μ„€μ •ν•œλ‹€.

 

μžλ°” μ½”λ“œ

public class DataBaseConnectionInfo {

    private String jdbcUrl;
    private String userId;
    private String userPw;

    public String getJdbcUrl() {
        return jdbcUrl;
    }

    public void setJdbcUrl(String jdbcUrl) {
        this.jdbcUrl = jdbcUrl;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserPw() {
        return userPw;
    }

    public void setUserPw(String userPw) {
        this.userPw = userPw;
    }
}

XML μ„€μ • 파일

<bean id="informationService" class="ems.member.service.EMSInformationService">
	<property name="info">
		<value>Education Management System program was developed in 2015.</value>
	</property>
</bean>

value 값이 κΈΈ 경우 <property>의 ν•˜μœ„μ— <value> νƒœκ·Έλ₯Ό μ‚¬μš©ν•΄μ„œ 값을 μ„€μ •ν• μˆ˜λ„ μžˆλ‹€.

 

μžλ°” μ½”λ“œ

public class EMSInformationService {

	private String info;
	
	public String getInfo() {
		return info;
	}

	public void setInfo(String info) {
		this.info = info;
	}
}

ν”„λ‘œνΌν‹°λ₯Ό ν†΅ν•œ 객체 μ£Όμž…μ€ μƒμ„±μž μ£Όμž…κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ <property> ν•˜μœ„μ— λΉˆμ„ 직접 μ •μ˜ν•˜κ±°λ‚˜ ref 속성을 μ‚¬μš©ν•΄μ„œ μ„€μ •ν•  수 μžˆλ‹€.

 

XML μ„€μ • 파일

<bean id="testBean" class="com.atoz_develop.beans.TestBean">
	<property name="data1">
		<bean class="com.atoz_develop.beans.DataBean"/>
	</property>
	<property name="data2" ref="data_bean"/>
</bean>

<bean id="dataBean" class="com.atoz_develop.beans.DataBean"/>

 

μžλ°” μ½”λ“œ

public class TestBean {

	private DataBean data1;
	private DataBean data2;

	public DataBean getData1() {
		return data1;
	}

	public void setData1(DataBean data1) {
		this.data1 = data1;
	}

	public DataBean getData2() {
		return data2;
	}

	public void setData2(DataBean data2) {
		this.data2 = data2;
	}
}

 

 

ν”„λ‘œνΌν‹° μ£Όμž… - List νƒ€μž…

XML μ„€μ • 파일

<bean id="informationService" class="ems.member.service.EMSInformationService">
	<property name="developers">
		<list>
			<value>Cheney.</value>
			<value>Eloy.</value>
			<value>Jasper.</value>
			<value>Dillon.</value>
			<value>Kian.</value>
		</list>
	</property>
</bean>

List νƒ€μž…μ€ <property>.<list> νƒœκ·Έλ₯Ό μ‚¬μš©ν•œλ‹€.

 

μžλ°” μ½”λ“œ

public class EMSInformationService {

	private List<String> developers;

	public List<String> getDevelopers() {
		return developers;
	}

	public void setDevelopers(List<String> developers) {
		this.developers = developers;
	}
}

 

μΆ”κ°€λ‘œ <value>μ—λŠ” type 속성을 μ‚¬μš©ν•΄μ„œ νƒ€μž…μ„ 지정할 수 μžˆλ‹€.

<property name="list2">
	<list>
		<value type='int'>100</value>
		<value type='int'>200</value>
		<value type='int'>300</value>
	</list>
</property>

 

valueκ°€ λ¬Έμžμ—΄μ΄ μ•„λ‹ˆλΌλ©΄ type μ†μ„±μœΌλ‘œ νƒ€μž…μ„ 지정해 μ£ΌλŠ” 것이 μ’‹λ‹€.


μ œλ„€λ¦­μ΄ Class인 List의 μ£Όμž…μ€ λ‹€μŒκ³Ό 같이 μ„€μ •ν•œλ‹€.

 

XML μ„€μ • 파일

<bean id='dataBean' class='com.atoz_develop.beans.DataBean' scope='prototype'/>

<bean id='t1' class='com.atoz_develop.beans.TestBean'>
<property name="list3">
	<list>
		<bean class='com.atoz_develop.beans.DataBean'/>
		<bean class='com.atoz_develop.beans.DataBean'/>
		<ref bean='dataBean'/>
		<ref bean='dataBean'/>
	</list>
</property>
</bean>

<bean> νƒœκ·Έλ‘œ λΉˆμ„ 직접 μ„€μ •ν•˜λ˜μ§€, <ref>λ₯Ό μ‚¬μš©ν•΄μ„œ 기쑴에 μ„€μ •λœ λΉˆμ„ μ°Έμ‘°ν•˜λ„λ‘ ν•  수 μžˆλ‹€.

 

μžλ°” μ½”λ“œ

public class TestBean {
	
	private List<DataBean> list3;

	public List<DataBean> getList3() {
		return list3;
	}

	public void setList3(List<DataBean> list3) {
		this.list3 = list3;
	}
}

 

ν”„λ‘œνΌν‹° μ£Όμž… - Set νƒ€μž…

XML μ„€μ • 파일

<bean id='dataBean' class='com.atoz_develop.beans.DataBean' scope='prototype'/>

<bean id='t1' class='com.atoz_develop.beans.TestBean'>
<!-- μ œλ„€λ¦­μ΄ String인 set -->
<property name="set1">
	<set>
		<value>λ¬Έμžμ—΄1</value>
		<value>λ¬Έμžμ—΄2</value>
		<value>λ¬Έμžμ—΄3</value>
		<value>λ¬Έμžμ—΄3</value>	<!-- Set의 νŠΉμ„±μƒ μ£Όμž…λ˜μ§€ μ•ŠμŒ -->
		<value>λ¬Έμžμ—΄3</value>	<!-- Set의 νŠΉμ„±μƒ μ£Όμž…λ˜μ§€ μ•ŠμŒ -->
	</set>
</property>
<!-- μ œλ„€λ¦­μ΄ Integer인 set -->
<property name="set2">
	<set>
		<value type='int'>100</value>
		<value type='int'>200</value>
		<value type='int'>300</value>
		<value type='int'>300</value>	<!-- Set의 νŠΉμ„±μƒ μ£Όμž…λ˜μ§€ μ•ŠμŒ -->
		<value type='int'>300</value>	<!-- Set의 νŠΉμ„±μƒ μ£Όμž…λ˜μ§€ μ•ŠμŒ -->
	</set>
</property>
<!-- μ œλ„€λ¦­μ΄ DataBean인 set -->
<property name="set3">
	<set>
		<bean class='com.atoz_develop.beans.DataBean'/>
		<bean class='com.atoz_develop.beans.DataBean'/>
		<ref bean="dataBean"/>
		<ref bean="dataBean"/>	<!-- Set의 νŠΉμ„±μƒ μ£Όμž…λ˜μ§€ μ•ŠμŒ -->
		<ref bean="dataBean"/>	<!-- Set의 νŠΉμ„±μƒ μ£Όμž…λ˜μ§€ μ•ŠμŒ -->
		<ref bean="dataBean"/>	<!-- Set의 νŠΉμ„±μƒ μ£Όμž…λ˜μ§€ μ•ŠμŒ -->
	</set>
</property>
</bean>

XML둜 μ£Όμž… 섀정을 ν•  λ•Œ Set νƒ€μž…μ˜ νŠΉμ„±μƒ μ€‘λ³΅λœ 값을 넣을 수 μ—†κΈ° λ•Œλ¬Έμ— <value>의 값이 κ°™κ±°λ‚˜ <ref>의 bean idκ°€ λ™μΌν•œ 경우 μ£Όμž…λ˜μ§€ μ•ŠλŠ”λ‹€.

특히, <bean>의 scope 속성이 prototype인 λΉˆμ„ <ref>둜 섀정해도 μ£Όμž…λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” νŠΉμ§•μ΄ 있기 λ•Œλ¬Έμ— Set νƒ€μž…μ— μ—¬λŸ¬ 개의 객체λ₯Ό μ£Όμž…ν•΄μ•Ό ν• λ•ŒλŠ” <bean> νƒœκ·Έλ‘œ 직접 μ£Όμž…ν•˜λ„λ‘ μ„€μ •ν•΄μ•Ό ν•œλ‹€.

 

μžλ°” μ½”λ“œ

public class TestBean {
	
	private Set<String> set1;
	private Set<Integer> set2;
	private Set<DataBean> set3;

	public Set<String> getSet1() {
		return set1;
	}

	public void setSet1(Set<String> set1) {
		this.set1 = set1;
	}

	public Set<Integer> getSet2() {
		return set2;
	}

	public void setSet2(Set<Integer> set2) {
		this.set2 = set2;
	}

	public Set<DataBean> getSet3() {
		return set3;
	}

	public void setSet3(Set<DataBean> set3) {
		this.set3 = set3;
	}
}

 

 

ν”„λ‘œνΌν‹° μ£Όμž… - Map νƒ€μž…

XML μ„€μ • 파일

<bean id="informationService" class="ems.member.service.EMSInformationService">
	<property name="administrators">
		<map>
			<entry>
				<key>
					<value>Cheney</value>
				</key>
				<value>cheney@springPjt.org</value>
			</entry>
			<entry>
				<key>
					<value>Jasper</value>
				</key>
				<value>jasper@springPjt.org</value>
			</entry>
		</map>
	</property>
</bean>

Map νƒ€μž…μ€ <property>.<map>.<entry>λ₯Ό μ‚¬μš©ν•œλ‹€.

 

μžλ°” μ½”λ“œ

public class EMSInformationService {

	private Map<String, String> administrators;

	public Map<String, String> getAdministrators() {
		return administrators;
	}

	public void setAdministrators(Map<String, String> administrators) {
		this.administrators = administrators;
	}
}

λ‹€μŒμ€ μ œλ„€λ¦­ νƒ€μž…μ΄ <String, Object> 인 Map의 μ£Όμž… μ„€μ • μ˜ˆμ΄λ‹€.

 

XML μ„€μ • 파일

<bean id='dataBean' class='com.atoz_develop.beans.DataBean' scope='prototype'/>

<!-- map -->
<bean id='t1' class='com.atoz_develop.beans.TestBean'>
<property name="map1">
	<map>
		<entry key="a1" value='λ¬Έμžμ—΄'/>
		<entry key='a2' value='100' value-type='int'/>
		<entry key='a3'>
			<bean class='com.atoz_develop.beans.DataBean'/>
		</entry>
		<entry key='a4' value-ref="dataBean"/>
		<entry key='a5'>
			<list>
				<value>λ¬Έμžμ—΄1</value>
				<value>λ¬Έμžμ—΄2</value>
				<value>λ¬Έμžμ—΄3</value>
			</list>
		</entry>
	</map>
</property>
</bean>

<entry>의 key, value μ†μ„±μœΌλ‘œ ν•œ 쀄에 μ„€μ •ν• μˆ˜λ„ μžˆλ‹€.

type을 μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ 기본적으둜 λ¬Έμžμ—΄λ‘œ λ“€μ–΄κ°€κΈ° λ•Œλ¬Έμ— value-type 속성을 μ‚¬μš©ν•΄μ„œ νƒ€μž…μ„ 지정해 μ£Όμ–΄μ•Ό ν•œλ‹€.

μœ„ 섀정은 "a1"μ—λŠ” λ¬Έμžμ—΄μ„, "a2"μ—λŠ” μ •μˆ˜λ₯Ό, "a3", "a4"μ—λŠ” DataBean νƒ€μž…μ˜ 객체λ₯Ό μ„œλ‘œ λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ, "a5"μ—λŠ” List 객체λ₯Ό μ£Όμž…ν•˜λŠ” 섀정이닀.

 

μžλ°” μ½”λ“œ

public class TestBean {

	private Map<String, Object> map1;

	public Map<String, Object> getMap1() {
		return map1;
	}

	public void setMap1(Map<String, Object> map1) {
		this.map1 = map1;
	}
}

 

ν”„λ‘œνΌν‹° μ£Όμž… - Properties νƒ€μž…

XML μ„€μ • 파일

<bean id='t1' class='com.atoz_develop.beans.TestBean'>
	<!-- property -->
	<property name="prop1">
		<props>
			<prop key="p1">λ¬Έμžμ—΄1</prop>
			<prop key="p2">λ¬Έμžμ—΄2</prop>
			<prop key="p3">λ¬Έμžμ—΄3</prop>
		</props>
	</property>
</bean>

 

μžλ°” μ½”λ“œ

public class TestBean {

	private Properties prop1;

	public Properties getProp1() {
		return prop1;
	}

	public void setProp1(Properties prop1) {
		this.prop1 = prop1;
	}
}

 

4. ApplicationContext 객체 생성

μŠ€ν”„λ§ XML μ„€μ • 파일이 ν•œ 개인 경우

// GenericXmlApplicationContext μ‚¬μš© - 'classpath:' prefix ν•„μš”
ApplicationContext context = new GenericXmlApplicationContext("classpath:applicationContext.xml");

// ClassPathXmlApplicationContext μ‚¬μš©
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

 

μŠ€ν”„λ§ XML μ„€μ • 파일이 μ—¬λŸ¬ 개인 경우

String[] appCtxs = {"classpath:appCtx1.xml", "classpath:appCtx2.xml", "classpath:appCtx3.xml"};
ApplicationContext context = new GenericXmlApplicationContext(appCtxs);

ApplicationContext context = new ClassPathXmlApplicationContext("appCtx1.xml", "appCtx2.xml", "appCtx3.xml");

 

μŠ€ν”„λ§ XML μ„€μ • 파일이 μ—¬λŸ¬ 개인 경우(import νƒœκ·Έ μ‚¬μš©)

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:appCtx2.xml"/>
	<import resource="classpath:appCtx3.xml"/>
</beans>

ApplicationContext 객체 생성은 XML μ„€μ • 파일이 ν•œ 개인 κ²½μš°μ™€ λ™μΌν•˜λ‹€.

 

λ‚΄μš© 및 μ˜ˆμ œμ†ŒμŠ€ 좜처

μΈν”„λŸ° - μœ€μž¬μ„±μ˜ μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ 개발자λ₯Ό μœ„ν•œ μ‹€μŠ΅μ„ ν†΅ν•œ μž…λ¬Έ κ³Όμ •

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EC%9E%85%EB%AC%B8

 

κ΄€λ ¨ κΈ€

 - [Spring] μŠ€ν”„λ§ XML μ„€μ • → μ• λ…Έν…Œμ΄μ…˜ μ„€μ • λ³€ν™˜ 방법

λ°˜μ‘ν˜•