1. DI(Dependency Injection) 란?

- 스프링 IoC 컨테이너 핵심 개념 중 하나

- 다양한 프레임워크에 이미 적용되어 있는 기능

- 객체 간의 의존 관계를 외부의 조립기가 관리

- 불필요한 의존 관계를 없애거나 줄일 수 있음

- 단위테스트 수행 수월

- 설정파일과 애노테이션을 이용하여 객체 간의 의존 관계를 설정

- 각 객체를 빈(bean)으로 관리




* 1번째 기본 어플리케이션 의존 관계 - 코드에 직접 의존 클래스를 생성하는 문제와 수정해야하는 경우 코드를 수정해야 하는 범위가 넓어진다.

package di1.com.tistory.gangzzang;

public class Hello {
	public static void main(String[] args) {
		MessageBean bean = new MessageBean();
		bean.say("Spring");
	} // main
} // Hello
package di1.com.tistory.gangzzang;

public class MessageBean {
	public void say(String name) {
		System.out.println("Hello, " + name + " !");
	} // say
} // MessageBean



* 2번째 인터페이스를 이용한 어플리케이션 의존 관계 - 코드를 수정해야 하는 범위가 적어질 수는 있지만 코드에서 직접 의존하는 객체를 생성하는 문제점이 있다.

package di2.com.tistory.gangzzang;

public interface MessageBean {
	public void say(String name);
} // MessageBean
package di2.com.tistory.gangzzang;

public class Hello {
	public static void main(String[] args) {
		MessageBeanEn bean = new MessageBeanEn();
		bean.say("Spring");
		MessageBeanKo bean2 = new MessageBeanKo();
		bean2.say("스프링");
	} // main
} // Hello
package di2.com.tistory.gangzzang;

public class MessageBeanEn implements MessageBean {
	@Override
	public void say(String name) {
		System.out.println("Hello, " + name + " !");
	} // say
} // MessageBeanEn
package di2.com.tistory.gangzzang;

public class MessageBeanKo implements MessageBean {
	@Override
	public void say(String name) {
		System.out.println("안녕하세요, " + name + " !");
	} // say
} // MessageBeanKo



* 스프링을 이용한 어플리케이션 의존 관계 - 객체 생성을 스프링 설정파일(xml, 애노테이션)에서 객체 생성과 의존 관계를 설정한다.

package di3.com.tistory.gangzzang.copy;

public interface MessageBean {
	public void say(String name);
} // MessageBean

package di3.com.tistory.gangzzang.copy;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

public class Hello {
	public static void main(String[] args) {
		
		Resource resource = new ClassPathResource("beans.xml");
		BeanFactory beanFactory = new XmlBeanFactory(resource);
		
		MessageBeanEn bean = (MessageBeanEn) beanFactory.getBean("messageBeanEn");
		bean.say("Spring");
		
		MessageBeanKo bean2 = (MessageBeanKo) beanFactory.getBean("messageBeanKo");
		bean2.say("스프링");
	} // main
} // Hello




2. 빈(Bean) 생성과 의존 관계 설정

- 컨테이너와 저장될 빈 객체와 각 빈 객체간이 연관관계는 XML 파일이나 애노테이션을 통해서 설정




2.1. 빈 객체 설정 및 컨테이너를 통한 빈 객체 사용

- 스프링 IoC 컨테이너가 관리할 빈 객체를 생성하기 위해서는 <bean> 태그를 사용

- <bean> 태그의 class 속성은 생성할 빈 객체의 완전한 클래스 이름

- <bean> 태그의 id 속성 혹은 name 속성에 빈 객체 식별 값 이름, getBean() 메서드에 전달

- getBean() 메서드의 리턴 타입은 Object이기 떄문에 형 변환이 필요, 3.0부터는 제네릭을 이용한 메서드 제공

- 생성자와 관련된 정보<constructor-arg> 태그를 명시하지 않았다면, 인자가 없는 기본 생성자로 객체를 생성

- static 메서드를 이용하여 객체를 구해야하는 클래스의 경우, <bean> 태그에 factory-method 속성 값으로 static 메서드를 지정


2.2. 의존 관계 설정

- 객체 간의 의존 관계도 XML 파일을 통해 명시

- 생성자, 프로퍼티 설정, 룩업 메서드 인젝션 세가지 방식으로 지정


2.2.1. 생성자 방식

- 의존하는 객체를 생성자를 통해서 전달

- <constructor-arg> 태그를 이용하여 의존 객체 전달

- <ref> 태그 또는 <constructor-arg> 태그의 ref 속성으로 빈 객체를 전달

<value> 태그 또는 <constructor-arg> 태그의 value 속성으로 기본 데이터 타입이나 String 타입 값을 전달

- 파라미터가 2개 이상인 경우 파라미터 개수만큼 <constructor-arg> 태그를 설정

- 개수가 같은 파라미터일 경우 <value> 태그의 type 속성 또는 <constructor-arg> 태그의 type 속성으로 타입을 명시


2.2.2. 프로퍼티 설정 방식

- <property> 태그를 이용하여 값을 전달

- <ref> 태그를 이용하여 객체를 전달


2.2.3. XML 네임스페이스를 이용한 프로퍼티 설정

- XML 네임스페이스를 이용하면 <property> 태그 대신 간단한 방법으로 설정 가능

- p:프로퍼티이름 형식을 사용할 경우 이름이 Ref로 끝나는 프로퍼티에 대해서는 설정할 수 없음

// MemberDAO.java

package com.tistory.gangzzang.injection;

public class MemberDAO {
	private static MemberDAO instance = new MemberDAO();
	
	public static MemberDAO getInstance() {
		return instance;
	}
	
	private MemberDAO() {
	}
	
	public void insert() {
		System.out.println("회원 가입 완료~~~~~~~");
	}
} // MemberDAO
// MemberDTO.java

package com.tistory.gangzzang.injection;

public class MemberDTO {
	private String id;
	private String pwd;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	@Override
	public String toString() {
		return "MemberDTO [id=" + id + ", pwd=" + pwd + "]";
	}
} // MemberDTO
// MemberService.java

package com.tistory.gangzzang.injection;

public class MemberService {
	private MemberDAO memberDAO;

	
	public MemberService() {
		super();
	}

	public MemberService(MemberDAO memberDAO) {
		super();
		this.memberDAO = memberDAO;
	}
	
	public void insert() {
		memberDAO.insert();
	}
} // MemberService




	
		
		
	
	
	
	
	
	
	
		
	

// MemberTest.java

package com.tistory.gangzzang.injection;

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

public class MemberTest {

	public static void main(String[] args) {
			ApplicationContext context = new ClassPathXmlApplicationContext("com/tistory/gangzzang/injection/beans.xml");
			
			MemberDTO memberDTO = (MemberDTO) context.getBean("memberDTO");
			System.out.println(memberDTO.toString());
			
			MemberDTO memberDTO2 = (MemberDTO) context.getBean("memberDTO2");
			System.out.println(memberDTO2.toString());
			
			MemberService memberService = (MemberService) context.getBean("memberService");
			memberService.insert();
	} // main
} // MemberTest

/*
 * 실행결과
 * 
 * MemberDTO [id=Gz, pwd=1234]
 * MemberDTO [id=Gz2, pwd=12345]
 * 회원 가입 완료~~~~~~~
 */

2.2.4. 룩업 메서드 인젝션 방식

- 필요한 객체를 제공하는 룩업(look up) 메서드를 구현하는 방식

- <lookup-method> 태그를 사용, name 속성은 룩업 메서드의 이름 bean 속성은 룩업 메서드가 리턴할 빈 객체 식별값

- 룩업 메서드 규칙

- 접근 수식어는 public이나 protected, 리턴 타입은 void이면 안됨, 인자를 가질 수  없음, 추상 메서드 가능, final이면 안됨


2.2.5. 임의 빈 객체 전달

- 식별값을 갖지 않는 빈객체를 생성해서 전달

- <constructor-arg> 태그나 <property> 태그안에 <bean> 태그를 중첩 사용


2.3. 컬렉션 타입 프로퍼티 설정

- 프로퍼티 타입이 컬렉션 타입인 경우 컬렉션 타입을 입력 받기 위한 스프링 태그

 태그

 컬렉션 타입 

 설명 

 <list> 

 java.util.List, 배열

 List 타입이나 배열에 값 목록을 전달할 때 사용  

 <map> 

 java.util.Map 

 Map 타입에 <키, 값> 목록을 전달 할 때 사용 

 <set> 

 java.util.Set 

 Set 타입에 값 목록을 전달 할 때 사용 

 <props> 

 java.util.Properties 

 Properties 타입에<프로퍼티이름, 프로퍼티값> 목록을 전달 할 때 사용 


2.3.1. List 타입, 배열

- <ref> 태그는 객체, <bean> 태그는 식별값을 갖지 않는 임의 객체, <value> 태그는 래퍼 타입 또는 String 타입 값 (단, 타입을 명시)

- 제네릭(generic) 을 명시할 경우 <value> 태그의 타입을 명시하지 않아도 타입이 변환 됨

- <list>, <map>, <props>, <set> 컬렉션 객체

- <null> null 래퍼런스를 값으로 사용


2.3.2. Map 타입

- <entry> 태그는 Map에 저장될 한개의 <키, 값>을 표현

- <entry> 태그 속성의 <key>, <value>, <key-ref>, <value-ref>, <key-type>, <value-type> 속성을 이용하여 지정


2.3.3. Properties 타입

- 특별한 타입의 Map, 키와 값이 모두 String

- <props> 태그를 이용하여 프로퍼티를 설정

- <prop> 태그는 한개의 프로퍼티를 표현


2.3.4. Set 타입

- List와 같은 방법으로 값을 지정

// ListTest.java

package com.tistory.gangzzang.collection;

import java.util.List;

public class ListTest {
	private List list1;
	private List<Double> list2;

	public void setList1(List list1) {
		this.list1 = list1;
	}

	public void setList2(List<Double> list2) {
		this.list2 = list2;
	}

	@Override
	public String toString() {
		return "ListTest [list1=" + list1 + ", list2=" + list2 + "]";
	}
} // ListTest
// MapTest.java

package com.tistory.gangzzang.collection;

import java.util.Map;

public class MapTest {
	private Map map1;
	private Map<String, memberDTO> map2;

	public void setMap1(Map map1) {
		this.map1 = map1;
	}

	public void setMap2(Map<String, memberDTO> map2) {
		this.map2 = map2;
	}

	@Override
	public String toString() {
		return "MapTest [map1=" + map1 + ", map2=" + map2 + "]";
	}
} // MapTest
// PropertiesTest.java

package com.tistory.gangzzang.collection;

import java.util.Properties;

public class PropertiesTest {
	private Properties properties;

	public void setProperties(Properties properties) {
		this.properties = properties;
	}
	
	public void connect() {
		String serverIP = properties.getProperty("server");
		System.out.println("serverIP : " + serverIP);
	}

	@Override
	public String toString() {
		return "PropertiesTest [properties=" + properties + "]";
	}
} // PropertiesTest
// SetTest.java

package com.tistory.gangzzang.collection;

import java.util.Set;

public class SetTest {
	private Set set1;
	private Set<Double> set2;

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

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

	@Override
	public String toString() {
		return "SetTest [set1=" + set1 + ", set2=" + set2 + "]";
	}
} // SetTest




	
		
		
	
	
	
	
		
			
				
				
				1.0
				리스트
			
		
		
			
				0.6
				2.4
			
		
	
	
	
	
		
			
				
				
			
		
			
			
				
			
		
	
	
	
	
		
			
				192.168.0.1
				5000
			
		
	
	
	
	
		
			
				
				
				1.0
				
			
		
		
			
				0.6
				2.4
			
		
	
	

// MainTest.java

package com.tistory.gangzzang.collection;

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

public class MainTest {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("com/tistory/gangzzang/collection/beans.xml");
		
		ListTest listTest = (ListTest) context.getBean("listTest");
		System.out.println(listTest.toString());
		
		MapTest mapTest = (MapTest) context.getBean("mapTest");
		System.out.println(mapTest.toString());
		
		PropertiesTest propertiesTest = (PropertiesTest) context.getBean("propertiesTest");
		System.out.println(propertiesTest.toString());
		propertiesTest.connect();
		
		SetTest setTest = (SetTest) context.getBean("setTest");
		System.out.println(setTest.toString());
	} // main
} // MainTest

/*
 * 실행결과
 * 
 * ListTest [list1=[com.tistory.gangzzang.collection.MemberDTO@4bfe2bf3, com.tistory.gangzzang.collection.MemberDAO@1bf7857f, 1.0, 리스트], list2=[0.6, 2.4]]
 * MapTest [map1={key=value, member=com.tistory.gangzzang.collection.MemberDTO@4bfe2bf3}, map2={member=com.tistory.gangzzang.collection.MemberDTO@4bfe2bf3}]
 * PropertiesTest [properties={connectionTimeout=5000, server=192.168.0.1}]
 * serverIP : 192.168.0.1
 * SetTest [set1=[com.tistory.gangzzang.collection.MemberDTO@4bfe2bf3, com.tistory.gangzzang.collection.MemberDAO@1bf7857f, 1.0, 셋], set2=[0.6, 2.4]]
 */

2.4. 의존 관계 자동 설정

- 의존하는 빈 객체의 타입이나 이름을 이용하여 의존 객체를 자동으로 설정

- byName : 프로퍼티의 이름과 같은 이름을 갖는 빈 객체를 설정

- byType : 프로퍼티의 타입과 같은 타입을 갖는 빈 객체를 설정

- constructor : 생성자 파라미터 타입과 같은 타입을 갖는 빈 객체를 생성자에 전달

- autodetect : constructor 방식을 먼저 적용하고, byType 방식을 적용하여 의존 객체를 설정

- 위 4가지의 방식 중 특정방식을 <bean> 태그의 autowire 속성의 값에 지정, 기본 값은 default (default는 default-autowire 속성의 값을 사용한다는 것)

- 설정 파일에 포함된 모든 빈 객체에 자동 설정을 적용은 <beans> 태그의 default-autowire 속성의 값에 지정, 기본 값은 no (no는 자동설정을 사용하지 않는 것)


2.4.1. 프로퍼티 이름 의존 관계 자동 설정

- 프로퍼티 이름과 동일한 이름을 갖는 빈 객체를 프로퍼티 값으로 설정


2.4.2. 프로퍼티 타입 의존 관계 자동 설정

- 프로퍼티 타입과 동일한 타입을 갖는 빈 객체를 프로퍼티 값으로 설정

- 동일한 타입의 빈객체를 한개만 설정할 수 있음


2.4.3. 생성자 파라미터 타입 의존 관계 자동 설정

- 생성자 타입과 동일한 타입을 갖는 빈 객체를 프로퍼티 값으로 설정

동일한 타입의 빈객체를 한개만 설정할 수 있음


2.4.4. 자동설정과 직접설정의 혼합

- 자동 설정과 함께 프로퍼티 중 일부는 자동 설정을 하지 않고 직접적으로 명시하여 빈 객체를 프로퍼티 값으로 설정

- 자동 설정에 의해 초기화 되지 않도록 하려면 <null> 태그를 이용하여 프로퍼티의 값을 null로 설정





	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
		
	


// MainTest.java

package com.tistory.gangzzang.autoinjection;

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

public class MainTest {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("com/tistory/gangzzang/autoinjection/beans.xml");

		NameAutowire nameAutowire = (NameAutowire) context.getBean("nameAutowire");
		System.out.println(nameAutowire.toString());
		System.out.println("getBoardDTO, getNo : " + nameAutowire.getBoardDTO().getNo());
		System.out.println("getBoardDTO, getPwd : " + nameAutowire.getBoardDTO().getPwd());
		System.out.println("getBoardDTO, getWriter : " + nameAutowire.getBoardDTO().getWriter());
		System.out.println("getMemberDTO, getId : " + nameAutowire.getMemberDTO().getId());
		System.out.println("getMemberDTO, getPwd : " + nameAutowire.getMemberDTO().getPwd());
		
		System.out.println("------------------------------------------------------------------------------------");
		
		TypeAutowire typeAutowire = (TypeAutowire) context.getBean("typeAutowire");
		System.out.println(typeAutowire.toString());
		
		System.out.println("------------------------------------------------------------------------------------");
		
		ConstructorAutowire constructorAutowire = (ConstructorAutowire) context.getBean("constructorAutowire");
		System.out.println(constructorAutowire.toString());
		System.out.println("getCarDTO, getCar_name : " + constructorAutowire.getCarDTO().getCar_name());
		System.out.println("getCarDTO, getCar_price : " + constructorAutowire.getCarDTO().getCar_price());
		
		System.out.println("------------------------------------------------------------------------------------");
		
		MixAutowire mixAutowire = (MixAutowire) context.getBean("mixAutowire");
		System.out.println(mixAutowire.toString());
		System.out.println("getPhone_shop : " + mixAutowire.getPhone_shop());
		System.out.println("getPhoneDTO, getPhone_name : " + mixAutowire.getPhoneDTO().getPhone_name());
		System.out.println("getPhoneDTO,  getPhone_price : " + mixAutowire.getPhoneDTO().getPhone_price());
	} // main
} // MainTest

/*
 * 실행결과
 * 
 * NameAutowire [boardDTO=com.tistory.gangzzang.autoinjection.BoardDTO@4a2ff5a5, memberDTO=com.tistory.gangzzang.autoinjection.MemberDTO@12a849b0]
 * getBoardDTO, getNo : 1
 * getBoardDTO, getPwd : 1234
 * getBoardDTO, getWriter : Gz
 * getMemberDTO, getId : Gz
 * getMemberDTO, getPwd : 1234
 * ------------------------------------------------------------------------------------
 * 안녕하세요
 * TypeAutowire [message=com.tistory.gangzzang.autoinjection.MessageKo@667dcb61]
 * ------------------------------------------------------------------------------------
 * ConstructorAutowire [carDTO=com.tistory.gangzzang.autoinjection.CarDTO@4cb381d8]
 * getCarDTO, getCar_name : 부릉
 * getCarDTO, getCar_price : 1029321
 * ------------------------------------------------------------------------------------
 * MixAutowire [phone_shop=신촌점, phoneDTO=com.tistory.gangzzang.autoinjection.PhoneDTO@1d11b33f]
 * getPhone_shop : 신촌점
 * getPhoneDTO, getPhone_name : iphone
 * getPhoneDTO,  getPhone_price : 893200
 */


// BoardDTO.java

package com.tistory.gangzzang.autoinjection;

public class BoardDTO {
	private int no;
	private String writer;
	private String pwd;

	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
} // BoardDTO
// memberDTO.java

package com.tistory.gangzzang.autoinjection;

public class MemberDTO {
	private String id;
	private String pwd;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
} // MemberDTO
// NameAutowire.java

package com.tistory.gangzzang.autoinjection;

public class NameAutowire {
	private BoardDTO boardDTO;
	private MemberDTO memberDTO;

	public BoardDTO getBoardDTO() {
		return boardDTO;
	}

	public void setBoardDTO(BoardDTO boardDTO) {
		this.boardDTO = boardDTO;
	}

	public MemberDTO getMemberDTO() {
		return memberDTO;
	}

	public void setMemberDTO(MemberDTO memberDTO) {
		this.memberDTO = memberDTO;
	}

	@Override
	public String toString() {
		return "NameAutowire [boardDTO=" + boardDTO + ", memberDTO=" + memberDTO + "]";
	}
} // NameAutowire


// Message.java

package com.tistory.gangzzang.autoinjection;

public interface Message {
	public void message();
} // Message
package com.tistory.gangzzang.autoinjection;

public class MessageEn implements Message {
	@Override
	public void message() {
		System.out.println("Hi");
	} // message
} // Message
package com.tistory.gangzzang.autoinjection;

public class MessageKo implements Message {
	@Override
	public void message() {
		System.out.println("안녕하세요");
	} // message
} // Message
// TypeAutowire.java

package com.tistory.gangzzang.autoinjection;

public class TypeAutowire {
	private Message message;

	public Message getMessage() {
		return message;
	}

	public void setMessage(Message message) {
		this.message = message;
	}
	
	@Override
	public String toString() {
		message.message();
		return "TypeAutowire [message=" + message + "]";
	}
} // TypeAutowire


// CarDTO.java

package com.tistory.gangzzang.autoinjection;

public class CarDTO {
	private String car_name;
	private int car_price;

	public String getCar_name() {
		return car_name;
	}

	public void setCar_name(String car_name) {
		this.car_name = car_name;
	}

	public int getCar_price() {
		return car_price;
	}

	public void setCar_price(int car_price) {
		this.car_price = car_price;
	}
} // CarDTO
// ConstructorAutowire.java

package com.tistory.gangzzang.autoinjection;

public class ConstructorAutowire {
	private CarDTO carDTO;

	public ConstructorAutowire(CarDTO carDTO) {
		super();
		this.carDTO = carDTO;
	}

	public CarDTO getCarDTO() {
		return carDTO;
	}

	@Override
	public String toString() {
		return "ConstructorAutowire [carDTO=" + carDTO + "]";
	}
} // ConstructorAutowire


// phoneDTO.java

package com.tistory.gangzzang.autoinjection;

public class PhoneDTO {
	private String phone_name;
	private int phone_price;

	public String getPhone_name() {
		return phone_name;
	}

	public void setPhone_name(String phone_name) {
		this.phone_name = phone_name;
	}

	public int getPhone_price() {
		return phone_price;
	}

	public void setPhone_price(int phone_price) {
		this.phone_price = phone_price;
	}
} // PhoneDTO
// MixAutowire.java

package com.tistory.gangzzang.autoinjection;

public class MixAutowire {
	private String phone_shop;
	private PhoneDTO phoneDTO;

	public String getPhone_shop() {
		return phone_shop;
	}

	public void setPhone_shop(String phone_shop) {
		this.phone_shop = phone_shop;
	}

	public PhoneDTO getPhoneDTO() {
		return phoneDTO;
	}

	public void setPhoneDTO(PhoneDTO phoneDTO) {
		this.phoneDTO = phoneDTO;
	}

	@Override
	public String toString() {
		return "MixAutowire [phone_shop=" + phone_shop + ", phoneDTO=" + phoneDTO + "]";
	}
} // AutoDetectAutowire


2.5 부모 빈 설정 재사용

- <bean> 태그의 설정 정보가 중복되는 경우 부모 빈(parent bean)을 정의, 부모 빈 정보를 재사용

- <bean> 태그의 abstract 속성의 값을 ture 지정되면 빈 객체를 생성하지 않고 설정 정보만 존재

- <bean> 태그의 parent 속성의 값을 abstract 속성이 지정된 빈 객체의 식별값을 지정

- 부모 설정에서 변경 할 값이 있다면 추가로 입력

- 프로퍼티 뿐만 아니라 클래스도 새롭게 지정 가능

// ParentTest.java

package com.tistory.gangzzang.parent;

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

public class ParentTest {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("com/tistory/gangzzang/parent/beans.xml");
		
		PhoneDTO phoneDTO_apple1 = (PhoneDTO) context.getBean("phoneDTO_apple1");
		System.out.println("phoneDTO_apple1, getManufacturer : " + phoneDTO_apple1.getManufacturer());
		System.out.println("phoneDTO_apple1, getName : " + phoneDTO_apple1.getName());
		
		System.out.println("------------------------------------------------------------------------------------");
		
		PhoneDTO phoneDTO_apple2 = (PhoneDTO) context.getBean("phoneDTO_apple2");
		System.out.println("phoneDTO_apple2, getManufacturer : " + phoneDTO_apple2.getManufacturer());
		System.out.println("phoneDTO_apple2, getName : " + phoneDTO_apple2.getName());
		
		System.out.println("------------------------------------------------------------------------------------");
		
		PhoneDTO phoneDTO_apple3 = (PhoneDTO) context.getBean("phoneDTO_apple3");
		System.out.println("phoneDTO_apple3, getManufacturer : " + phoneDTO_apple3.getManufacturer());
		System.out.println("phoneDTO_apple3, getName : " + phoneDTO_apple3.getName());
		
		System.out.println("------------------------------------------------------------------------------------");
		
		PhoneDTO2 phoneDTO2_apple = (PhoneDTO2) context.getBean("phoneDTO2_apple");
		System.out.println("phoneDTO2_apple, getManufacturer : " + phoneDTO2_apple.getManufacturer());
		System.out.println("phoneDTO2_apple, getName : " + phoneDTO2_apple.getName());
		System.out.println("phoneDTO2_apple, getName : " + phoneDTO2_apple.getPrice());
		
		System.out.println("------------------------------------------------------------------------------------");
		
		PhoneDTO phoneDTO_samsung1 = (PhoneDTO) context.getBean("phoneDTO_samsung1");
		System.out.println("phoneDTO_samsung1, getManufacturer : " + phoneDTO_samsung1.getManufacturer());
		System.out.println("phoneDTO_samsung1, getName : " + phoneDTO_samsung1.getName());
		
		System.out.println("------------------------------------------------------------------------------------");
		
		PhoneDTO phoneDTO_samsung2 = (PhoneDTO) context.getBean("phoneDTO_samsung2");
		System.out.println("phoneDTO_samsung2, getManufacturer : " + phoneDTO_samsung2.getManufacturer());
		System.out.println("phoneDTO_samsung2, getName : " + phoneDTO_samsung2.getName());
		
		System.out.println("------------------------------------------------------------------------------------");
		
		PhoneDTO phoneDTO_samsung3 = (PhoneDTO) context.getBean("phoneDTO_samsung3");
		System.out.println("phoneDTO_samsung3, getManufacturer : " + phoneDTO_samsung3.getManufacturer());
		System.out.println("phoneDTO_samsung3, getName : " + phoneDTO_samsung3.getName());

		System.out.println("------------------------------------------------------------------------------------");
		
		PhoneDTO2 phoneDTO2_samsung = (PhoneDTO2) context.getBean("phoneDTO2_samsung");
		System.out.println("phoneDTO2_samsung, getManufacturer : " + phoneDTO2_samsung.getManufacturer());
		System.out.println("phoneDTO2_samsung, getName : " + phoneDTO2_samsung.getName());
		System.out.println("phoneDTO2_samsung, getName : " + phoneDTO2_samsung.getPrice());
	} // main
} // ParentTest

/*
 * 실행결과
 *
 * phoneDTO_apple1, getManufacturer : apple
 * phoneDTO_apple1, getName : iPhone 5S
 * ------------------------------------------------------------------------------------
 * phoneDTO_apple2, getManufacturer : apple
 * phoneDTO_apple2, getName : iPhone 5S
 * ------------------------------------------------------------------------------------
 * phoneDTO_apple3, getManufacturer : apple
 * phoneDTO_apple3, getName : iPhone 5C
 * ------------------------------------------------------------------------------------
 * phoneDTO2_apple, getManufacturer : apple
 * phoneDTO2_apple, getName : iPhone 5S
 * phoneDTO2_apple, getName : 981283823
 * ------------------------------------------------------------------------------------
 * phoneDTO_samsung1, getManufacturer : samsung
 * phoneDTO_samsung1, getName : GALAXY Note3
 * ------------------------------------------------------------------------------------
 * phoneDTO_samsung2, getManufacturer : samsung
 * phoneDTO_samsung2, getName : GALAXY S4
 * ------------------------------------------------------------------------------------
 * phoneDTO_samsung3, getManufacturer : samsung
 * phoneDTO_samsung3, getName : GALAXY S4
 * ------------------------------------------------------------------------------------
 * phoneDTO2_samsung, getManufacturer : samsung
 * phoneDTO2_samsung, getName : GALAXY S4
 * phoneDTO2_samsung, getName : 8210312
 */




	
	
		
		
	

	
		
		
	
	
	
	
	
		
	
	
		
	
	
	
		
	
	
	
	
		
	
	

// PhoneDTO.java

package com.tistory.gangzzang.parent;

public class PhoneDTO {
	private String name;
	private String manufacturer;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getManufacturer() {
		return manufacturer;
	}

	public void setManufacturer(String manufacturer) {
		this.manufacturer = manufacturer;
	}
} // PhoneDTO
// PhoneDTO2.java

package com.tistory.gangzzang.parent;

public class PhoneDTO2 {
	private String name;
	private String manufacturer;
	private int price;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getManufacturer() {
		return manufacturer;
	}

	public void setManufacturer(String manufacturer) {
		this.manufacturer = manufacturer;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}
} // PhoneDTO2


+ Recent posts