Spring_XML Bean Property

JW__1.7·2022년 10월 31일
0

Spring 공부일지

목록 보기
5/9

Bean

기존 자바는 객체를 생성할 때 아래와 같이 new 객체를 이용하여 생성한다.

Board board = new Board();

스프링 Bean을 이용하면 프레임워크가 만든 Bean을 가져다 쓰기 때문에 Spring 프레임워크를 사용하지 않아도 된다.

XML에 저장된 Bean 가져오는 클래스

  • GenericXmlApplicationContext
  • ClassPathXmlApplicationContext
AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:패키지/Bean.xml"); 
// 컨테이너에 있는 Bean을 가져다 쓸 때 사용하는 클래스
객체 변수명 = ctx.getBean("xml에 등록되어있는 id", 객체.타입);

Setter Injection

Property가 자바의 클래스에 데이터를 주입하는 방법을 말한다.
Java의 Class에서 필드값과 Getter/Setter를 만들어주면, 그 Setter를 이용해 값을 주입한다.

property의 value 태그를 이용한 Bean 통신

프로젝트의 src/main/java에 xml의 정보를 담을 Java 파일을 생성하기 위해 패키지를 만들어주고, Calculator 클래스를 만들어준다.

Calculator Class

package com.gdu.app01.xml01;

public class Calculator {
	
	// method
	public void add(int a, int b) {
		System.out.println(a + "+" + b + "=" + (a+b));
	}
	public void sub(int a, int b) {
		System.out.println(a + "-" + b + "=" + (a-b));
	}
	public void mul(int a, int b) {
		System.out.println(a + "*" + b + "=" + (a*b));
	}
	public void div(int a, int b) {
		System.out.println(a + "/" + b + "=" + (a/b));
	}

}

Student Class

package com.gdu.app01.xml01;

public class Student {
	
	// field
	private String name;
	private String school;
	private Calculator calculator;
	
	// method(getter + setter)
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSchool() {
		return school;
	}
	public void setSchool(String school) {
		this.school = school;
	}
	public Calculator getCalculator() {
		return calculator;
	}
	public void setCalculator(Calculator calculator) {
		this.calculator = calculator;
	}

} 

src/main/resources 에 Spring Bean Configuration File을 만들어준다.

Spring Bean Configuration File은 Bean을 만드는 xml이다.
Bean을 만들어서 Container에 보관한다.

Spring Bean Configuration File : appCtx.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">

	<!--  
		안녕, 난 Spring Been Configuration File이야.
		난 Bean을 만드는 xml이야.
		내가 만든 Bean은 컨테이너(Container)에 보관되지.
	-->
	
	<!--  
		1. 디폴트 생성자 + setter (property 태그)
	-->
	<bean id="calc" class="com.gdu.app01.xml01.Calculator"></bean>	<!-- xml인데 java랑 연결되어 있다. -->
	<bean id="haksang" class="com.gdu.app01.xml01.Student">
		<property name="name">
			<value>홍길동</value>	<!-- setName() 연결. (property라는 태그는 setter랑 연결) -->
		</property>
		<property name="school">	<!-- 각종 데이터타입은 value태그안 byte, int, String, char 등 -->
			<value>한국대학교</value>  <!-- setSchool() 연결. -->
		</property>
		<property name="calculator">
			<ref bean="calc" />		<!-- setCalculator() 연결. ref태그는 참조타입이라 bean id="calc"와 이름 맞춰야 한다. -->
		</property>
</beans>

Setter Injection 타입

  • <value> : byte, short, int, long, float, double, boolean 등 기본 타입
  • <property> : 기본 타입을 제외한 참조 타입

SpringMain Class

package com.gdu.app01.xml01;

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

public class SpringMain {

	public static void main(String[] args) {
		
		// 기존 개발자
		// 개발자가 Bean을 만들었다.
		// Calculator calculator = new Calculator();

		// 새로운 프레임워크
		// 프레임워크가 만든 Bean을 가져다 쓴다.
		AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:xml01/appCtx.xml");
		Calculator calculator = ctx.getBean("calculator", Calculator.class);
		calculator.add(5, 2);
		calculator.sub(5, 2);
		calculator.mul(5, 2);
		calculator.div(5, 2);
  
  		// XML에 저장된 Bean 가져오는 클래스
		// GenericXmlApplicationContext
		// ClassPathXmlApplicationContext
  
  		AbstractApplicationContext ctx = new GenericXmlApplicationContext("xml01/appCtx.xml");	// "classpath:xml01/appCtx.xml"과 동일
		Student student = ctx.getBean("haksang", Student.class);	// Student student = (Student)ctx.getBean("haksang");
		System.out.println(student.getName());
		System.out.println(student.getSchool());
		student.getCalculator().add(7, 3);
		student.getCalculator().sub(7, 3);
		student.getCalculator().mul(7, 3);
		student.getCalculator().div(7, 3);
		
		ctx.close();	// 생략가능
		
	}

}

결과값

문제. 차종 및 연비

Engine Class

package com.gdu.app01.xml02;

public class Engine {

	// field
	private String fuel;		// 연료(디젤, 가솔린)
	private double efficency;	// 연비(12.5)
	private int cc;				// 배기량(1998)
	
	// method (getter/setter)
	public String getFuel() {
		return fuel;
	}
	public void setFuel(String fuel) {
		this.fuel = fuel;
	}
	public double getEfficency() {
		return efficency;
	}
	public void setEfficency(double efficency) {
		this.efficency = efficency;
	}
	public int getCc() {
		return cc;
	}
	public void setCc(int cc) {
		this.cc = cc;
	}
	
}  

Car Class

package com.gdu.app01.xml02;

public class Car {

	// field
	private String model;
	private String maker;
	private Engine engine;
	
	// method (getter/setter)
	public String getModel() {
		return model;
	}
	public void setModel(String model) {
		this.model = model;
	}
	public String getMaker() {
		return maker;
	}
	public void setMaker(String maker) {
		this.maker = maker;
	}
	public Engine getEngine() {
		return engine;
	}
	public void setEngine(Engine engine) {
		this.engine = engine;
	}
	
}  

Engine 클래스를 참조하는 Car 클래스가 있다.

Spring Bean Configuration File : appCtx.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="crdi" class="com.gdu.app01.xml02.Engine">
		<property name="fuel" value="가솔린" />
		<property name="efficency" value="12.5" />
		<property name="cc" value="1998" />
	</bean>
	
	<bean id="dreamCar" class="com.gdu.app01.xml02.Car">
		<property name="model" value="소나타" />
		<property name="maker" value="현대" />
		<property name="engine" ref="crdi"></property>	<!-- bean id="crdi"을 ref에 넣는다. -->
	</bean>

</beans>  

Setter Injection

위에서 언급했듯이 <value> 태그는 value="" value 속성으로 대체할 수 있다.

SpringMain Class

package com.gdu.app01.xml02;

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

public class SpringMain {

	public static void main(String[] args) {
		
		AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("xml02/appCtx.xml");
		Car myCar = ctx.getBean("dreamCar", Car.class);	// 이름, 타입 전달
		
		System.out.println(myCar.getModel());
		System.out.println(myCar.getMaker());
		Engine engine = myCar.getEngine();
		System.out.println(engine.getFuel());
		System.out.println(engine.getEfficency());
		System.out.println(engine.getCc());

		ctx.close();
	}

}  

결과값

Namespaces 탭에서 "p" 옵션을 체크하면 <property> 태그를 <bean> 태그의 p: 속성으로 바꿔서 사용할 수 있다.

상단 beans의 속성에 xmlns:p 라는 속성이 추가 된다.
<property> 태그를 <bean> 태그의 p: 속성으로 바꿔서 사용할 수 있다.

Address Class

package com.gdu.app01.xml03;

public class Address {
	
	// field
	private String jibun;
	private String road;
	private String zipCode;
	
	// method (getter/setter)
	public String getJibun() {
		return jibun;
	}
	public void setJibun(String jibun) {
		this.jibun = jibun;
	}
	public String getRoad() {
		return road;
	}
	public void setRoad(String road) {
		this.road = road;
	}
	public String getZipCode() {
		return zipCode;
	}
	public void setZipCode(String zipCode) {
		this.zipCode = zipCode;
	}
	
}  

Person Class

package com.gdu.app01.xml03;

public class Person {
	
	// field
	private String name;
	private int age;
	private Address addr;
	
	// method (getter/setter)
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Address getAddr() {
		return addr;
	}
	public void setAddr(Address addr) {
		this.addr = addr;
	}

}  

Spring Bean Configuration File : appCtx.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"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!--  
		Namespaces 탭에서 "p" 옵션을 체크하면
		<property> 태그를  <bean> 태그의 p: 속성으로 바꿔서 사용할 수 있다.
	-->

	<bean id="myAddr" class="com.gdu.app01.xml03.Address" p:jibun="가산동" p:road="디지털로" p:zipCode="12345" />
	
	<bean id="select" class="com.gdu.app01.xml03.Person" p:name="손현우" p:age="31" p:addr-ref="myAddr" />

</beans>  

Setter Injection

<property> 태그를 <bean> 태그의 p: 속성으로 바꿔서 사용할 수 있다.

SpringMain.java

package com.gdu.app01.xml03;

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

public class SpringMain {

	public static void main(String[] args) {
		
		AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("xml03/appCtx.xml");
		Person person = ctx.getBean("select", Person.class);
		
		System.out.println(person.getName());
		System.out.println(person.getAge());
		Address address = person.getAddr();
		System.out.println(address.getJibun());
		System.out.println(address.getRoad());
		System.out.println(address.getZipCode());
		
		ctx.close();
	}

}  

결과값

<bean> 태그의 scope 속성

  • scope="singleton"
    • bean을 하나만 만들어둔다.
    • 생략하면 singleton이 사용된다.
  • scope="prototype"
    • bean을 요청할 때마다 새로 만들어준다.
    • 자주 사용되지 않는다.

Dao Class

package com.gdu.app01.xml04;

public class Dao {

	//method
	public void list() {
		System.out.println("목록 가져오기");
	}
   
	public void detail() {
		System.out.println("상세보기");
	}
	
} 

String Bean Configuration File : appCtx.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="dao" class="com.gdu.app01.xml04.Dao" scope="prototype" />

</beans>  

Setter Injection

scope="prototype"을 주어서 Main Class에서 getBean을 요청할 때마다 bean을 생성해준다.

SpringMain Class

package com.gdu.app01.xml04;

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

public class SpringMain {

	public static void main(String[] args) {
		
		AbstractApplicationContext ctx = new GenericXmlApplicationContext("xml04/appCtx.xml");
		
		Dao dao1 = ctx.getBean("dao", Dao.class);
		Dao dao2 = ctx.getBean("dao", Dao.class);
		Dao dao3 = ctx.getBean("dao", Dao.class);
		
		System.out.println(dao1 == dao2);
		System.out.println(dao2 == dao3);
		System.out.println(dao1 == dao3);

		ctx.close();
	}

}  

결과값

  • scope가 "singleton" 경우에는 true 값이 나오고,
  • scope가 "prototype" 경우에는 false 값이 나온다.

오라클 Connection 생성 및 해제

MyConnection Class

package com.gdu.app01.xml05;

import java.sql.Connection;
import java.sql.DriverManager;

public class MyConnection {
	
	// field
	private String driverClassName;
	private String url;
	private String username;
	private String password;
	
	// method (getter + setter)
	public String getDriverClassName() {
		return driverClassName;
	}
	public void setDriverClassName(String driverClassName) {
		this.driverClassName = driverClassName;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	// Connection 반환 메소드
	public Connection getConnection() {
		Connection con = null;
		try {
			con = DriverManager.getConnection(url, username, password);
			System.out.println("Connection 생성 완료");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return con;
	}
	
}

Spring Bean Configuration File : appCtx.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="conn" class="com.gdu.app01.xml05.MyConnection">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
		<property name="username" value="SCOTT" />
		<property name="password" value="TIGER" />
	</bean>

</beans>  

Setter Injection

SCOTT 계정 로그인 정보를 넘겨주었다.

SpringMain Class

프로젝트의 [Build Path]에 ojdbc6.jar 등록하고 실행한다.

package com.gdu.app01.xml05;

import java.sql.Connection;

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

public class SpringMain {

	public static void main(String[] args) throws Exception {
		
		AbstractApplicationContext ctx = new GenericXmlApplicationContext("xml05/appCtx.xml");
		MyConnection myCon = ctx.getBean("conn", MyConnection.class);
		Connection con = myCon.getConnection();
		
		if(con != null) {
			con.close();
  			System.out.println("Connection 해제 완료");
		}
		
		ctx.close();
	}

}  

실행값

0개의 댓글