웹 프로그래밍/Spring

[Spring] DI 실습(4) :Dependency 응용, 집합객체 설정 : list, map

산을넘는다 2020. 8. 14. 11:15

List

 

 

ListAddress.java

package di.collection;

import java.util.List;

public class ListAddress {

	private List<String> address;
	private List<Integer> numbers;
	

	public ListAddress() {
	}


	public ListAddress(List<String> address) {
		this.address = address;
	}
	
	public ListAddress(List<String> address, List<Integer> numbers) {
		super();
		this.address = address;
		this.numbers = numbers;
	}

	
	public List<String> getAddress() {
		return address;
	}

	public void setAddress(List<String> address) {
		this.address = address;
	}
	
	
	
}

 

ListMain.java

package di.collection;

import java.util.ArrayList;
import java.util.List;

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

public class ListMain {

	
	public static void main(String[] args) {

	
		ApplicationContext container = new GenericXmlApplicationContext("di-collection01.xml");
		ListAddress list = container.getBean("list", ListAddress.class); // 생성자
		ListAddress list2 = container.getBean("list02", ListAddress.class); // property
		ListAddress list3 = container.getBean("list03", ListAddress.class); // property
		
		for(String addr : list.getAddress()) {
			System.out.println(addr);
		}
		
		System.out.println("======================");
		
		for(String addr : list2.getAddress()) {
			System.out.println(addr);
		}
		
		System.out.println("======================");
		
		for(String addr : list3.getAddress()) {
			System.out.println(addr);
		}
	
	}
}

 

di-collection01.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 " >
	   					   
	
    <!-- propery네. 즉 세터 주입이네. setAddress() 메소드가 호출되겠군. -->
    <!-- 그런데, 상수값은 value 속성에 담아 보냈는데, list 객체에 add는 어떻게 할까? -->
    <!-- 바로 <list></list> 태그 내에 value를 써서 보내면 된다. -->
    <!-- 즉. list.add("서울시 서초구"); list.add("경기도~"); list.add("부산~"); -->
    
    <bean class = "di.collection.ListAddress" id = "list">
		<property name = "address">
			<list>
				<value>서울시 서초구</value>
				<value>경기도 광명시 철산동</value>
				<value>부산광역시 동구</value>
			</list>
		</property>
	</bean>
	
    
    <!-- constructor-arg네. 즉, 생성자 주입방식이네. -->
    <!-- 이때도 list에 add 하려면 <list> 태그 내에 <value>에 값을 보내면 된다. -->
	<bean class = "di.collection.ListAddress" id = "list02">
		<constructor-arg>
			<list value-type="java.lang.String">
			<!-- <list> -->
				<value>서울시 서초구</value>
				<value>경기도 광명시 철산동</value>
				<value>부산광역시 동구</value>
			</list>
		</constructor-arg>
	</bean>
    
    
	<!-- constructor-arg 태그가 2개 있네. 즉, 매개변수가 2개인 생성자로 객체를 만들겠네. -->
    <!-- 그리고 List<String>, List<Integer> 두 개의 객체가 매개변수겠구나. -->
    <!-- 각 리스트에 값을 담아 보내자. -->
    
		<bean class="di.collection.ListAddress" id="list03">
		<constructor-arg>
			<list value-type="java.lang.String">
				<value>10</value>
				<value>20</value>
				<value>30</value>
			</list>
		</constructor-arg>
		<constructor-arg>
			<list value-type="java.lang.Integer">
				<value>100</value>
				<value>200</value>
				<value>300</value>
			</list>
		</constructor-arg>
	</bean>	   	
	   					   
	   					   
</beans>

Map

 

MapAddress.java

package di.collection;

import java.util.Map;

public class MapAddress {

	private Map<String, String> address;

	public MapAddress() {
	}

	public MapAddress(Map<String, String> address) {
		super();
		this.address = address;
	}

	public Map<String, String> getAddress() {
		return address;
	}

	public void setAddress(Map<String, String> address) {
		this.address = address;
	}
	
	
}

 MapMain.java

package di.collection;

import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

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

public class MapMain {

	public static void main(String[] args) {
		ApplicationContext context = new GenericXmlApplicationContext("di-collection02.xml");
		//MapAddress 타입의 map 객체를 받아온다. 
        MapAddress map = context.getBean("map", MapAddress.class);
		
        //map 객체 내에 Address라는 멤버변수가 있다. 이것은 map임.
        //그러니 Map 타입으로 받아야 한다.
		Map<String, String> addrs = map.getAddress();
        // entrySet() 메소드는 key와 value가 모두 필요한 경우 사용하고
        // keySet() 메소드는 key의 값만 필요할 때 사용한다.
		Set<Entry<String, String>> address = addrs.entrySet();
		
		for(Entry<String, String> a : address) {
			System.out.println(a.getKey() + " : " + a.getValue());
		}
		
	}
}

di-collection02.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 " >
		   				
                        
                        
    <!-- property네. 세터 주입이다. setAddress() 메소드가 실행되겠다. -->
    <!-- 값을 담은 map 객체를 어떻게 만들어서 세터에 값을 전달할까? -->
    <!-- 바로 <map> 태그 내에 entry로 값을 담으면 된다. -->
    <!-- 즉, entry 태그의 내용들이 map.put()의 인자가 되는 것이다. -->
    <!-- 아래는 entry 태그가 3개이므로, put 과정이 세번 일어난 것이다. -->
    <!-- 그런데, map은 key,value 쌍이므로 또 <key> <value>태그로 구분하여 담아야 함. -->
    <!-- 구체적인 방법은 아래와 같다. -->
    
	<bean class = "di.collection.MapAddress" id = "map">
		<property name="address">
			<map>
				<entry>
					<key><value>홍기리보이</value></key> <!-- value : 객체 외의 값을 쓸 때 -->
					<value>서울시 서초구</value>
				</entry>
				<entry>
					<key><value>강기리보이</value></key>
					<value>서울시 강남구</value>
				</entry>
				<entry>
					<key><value>조기리보이</value></key>
					<value>경기도 분당구</value>
				</entry>
			
			</map>
		</property>
	</bean>		   					   

</beans>