Java/Spring

[Spring] 04. 생성된 객체 가져오기

담크 2021. 6. 16. 23:38

오늘은 이미 만들어져 있는 객체를 가져와서(참조해서) 사용하는 방법을 배워보겠습니다.

그 전에 생성자 주입, setter주입은 같이 사용할 수도 있다는거 알고 계셨나요?

com.test03 패키지를 만들어서 간단히 보여드리겠습니다.

Developer.java

package com.test03;

public class Developer extends Emp {
	
	private String dept;
	
	public Developer() {
	}

	public Developer(String name, int salary) {
		super(name, salary);
	}
	
	public void setDept(String dept) {
		this.dept = dept;
	}

	@Override
	public String toString() {
		return super.toString() + " 부서 : " + dept;
	}
}

Emp.java

package com.test03;

public class Emp {
	
	private String name;
	private int salary;
	
	
	public Emp() {
	}
	public Emp(String name, int salary) {
		super();
		this.name = name;
		this.salary = salary;
	}
	
	@Override
	public String toString() {
		return "이름 : " + name + " 월급 : " + salary;
	}

}

Engineer.java

package com.test03;

public class Engineer extends Emp {
	
	private String dept;

	public Engineer() {
	}

	public Engineer(String name, int salary) {
		super(name, salary);
	}
	
	public void setDept(String dept) {
		this.dept = dept;
	}

	@Override
	public String toString() {
		return super.toString() + " 부서 : " + dept;
	}
}

MTest.java

package com.test03;

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

public class MTest {
	
	public static void main(String[] args) {
		ApplicationContext factory = new ClassPathXmlApplicationContext("com/test03/applicationContext.xml");
		
		Emp hong = (Emp) factory.getBean("hong");
		Emp lee = factory.getBean("lee", Emp.class);
		
		System.out.println(hong);
		System.out.println(lee);
	}

}

applicationContext.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="hong" class="com.test03.Engineer">
		<constructor-arg name="name" value="홍길동" />
		<constructor-arg name="salary" value="3000000" />
		<property name="dept" value="기술" />
	</bean>
	
	<bean id="lee" class="com.test03.Developer">
		<constructor-arg name="name" value="이순신" />
		<constructor-arg name="salary" value="2500000" />
		<property name="dept" value="개발" />
	</bean>
</beans>

코드 실행결과

 

이 코드는 더욱 간단하게 그림으로 설명하겠습니다.

선이 조금 삐뚤빼뚤한점 양해부탁드립니다...ㅜ

- applicationContext에 <constructor-arg>의 값이 Engineer(Developer도 같습니다.)의 생성자에 담긴다.

- 그렇게 담겨져 있는값은 super( )에 의해 부모의 것으로 간다(Engineer와 Developer는 Emp 클래스를 상속받고 있습니다.)

- <property>의 값은 Engineer의 setter의 값으로 들어가게 된다.

이렇게 객체를 만들면서 생성자 주입과 setter주입은 한번에 사용도 가능합니다.

 

 


이제 본격적으로 만들어진 객체를 가져오는것을 해보겠습니다.

com.test04 패키지를 만듭니다. (패키지 구조는 비슷하게 만들었습니다.)

Developer.java

package com.test04;

public class Developer {
	
	private Emp emp;
	private String dept;
	
	public Developer() {
	}
	public Developer(Emp emp, String dept) {
		super();
		this.emp = emp;
		this.dept = dept;
	}
	
	@Override
	public String toString() {
		return emp + "\t 부서 : " + dept;
	}
}


Emp.java

package com.test04;

public class Emp {
	
	private String name;
	private int salary;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	@Override
	public String toString() {
		return "이름 : " + name + "\t 월급 : " + salary;
	}
}


Engineer.java

package com.test04;

public class Engineer {
	
	private Emp emp;
	private String dept;
	public Engineer() {
	}
	public Engineer(Emp emp, String dept) {
		super();
		this.emp = emp;
		this.dept = dept;
	}
	@Override
	public String toString() {
		return emp + "\t 부서 : " + dept;
	}
}


MTest.java

package com.test04;

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

public class MTest {
	
	public static void main(String[] args) {
		ApplicationContext factory = new ClassPathXmlApplicationContext("com/test04/beans.xml");
		
		Developer lee = factory.getBean("lee-ss", Developer.class);
		Engineer hong = (Engineer) factory.getBean("hong-gd");
		
		System.out.println(lee);
		System.out.println(hong);
	}

}

 

이번에는 완성된 beans.xml을 보기전에 어떤걸 해야하는지 먼저 알아보겠습니다.

이렇게 만들어진 객체에다가

이 객체값을 넣어서 사용하고 싶은겁니다.

그러려면 객체를 가지고 와야하는데

이런식으로 사용하게되면 왜인지 모를 에러가 발생하게 되는데요

위의 Developer를 보면 첫번 째 생성자 파라미터가 emp이고 두번 째 생성자 파라미터가 String입니다.

String이나 int의 경우 value속성으로 값을 넣어주면 됩니다.

객체를 가져올 때는 value 속성대신 ref(참조:레퍼런스) 속성을 가져와서 사용해주면 됩니다.

 

이렇게 완성된 beans.xml을 보시면
beans.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="lee" class ="com.test04.Emp">
		<property name="name" value="이순신"/>
		<property name="salary" value="3000000"/>
	</bean>
	
	<bean id="hong" class ="com.test04.Emp">
		<property name="name" value="홍길동"/>
		<property name="salary" value="2500000"/>
	</bean>
	
	<bean id="lee-ss" class ="com.test04.Developer">
		<constructor-arg name="emp" ref="lee"/>
		<constructor-arg name="dept" value="개발"/>
	</bean>
	
	<bean id="hong-gd" class ="com.test04.Engineer">
		<constructor-arg name="emp" ref="hong"/>
		<constructor-arg name="dept" value="기술"/>
	</bean>
</beans>

코드 실행결과

이렇게 동작하게 됩니다.