[ Spring ] Spring xml bean property

duck-ach·2022년 10월 26일
0

Spring

목록 보기
3/16
post-custom-banner

스프링 프레임 워크와 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

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

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

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

Calculator Class

package com.gdu.app1.xml;

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.app1.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 Been Configuration File이라는 파일을 만들어준다.

String Bean Configuration File은 Bean을 만드는 xml이다.
Bean을 만들어서 컨테이너(Container)에 보관된다.

Spring Bean Configuration File

<?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">
	 
	<!-- 
	 	디폴트 생성자 + setter
	-->
	<bean id="calc" class="com.gdu.app1.xml01.Calculator"></bean>
	<bean id="haksang" class="com.gdu.app1.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() 연결. -->
		</property>					<!-- ref태그는 참조타입 -->
	</bean>
	 
</beans>

Setter Injection
int, byte, boolean, String등과 같은 데이터 타입들은 <value> 태그 안에 담고, 참조타입은 <ref> 태그 안에 넣는다.

Main Class

package com.gdu.app1.xml01;

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

public class SpringMain {

		AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:xml01/appCtx.xml"); // 컨테이너에 있는 Bean을 가져다 쓸 때 사용하는 클래스
		Calculator calculator = ctx.getBean("calc", Calculator.class); // (이름 , 타입)
		calculator.add(5, 2);
		calculator.sub(5, 2);
		calculator.mul(5, 2);
		calculator.div(5, 2);

		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(8, 7);
		
		ctx.close(); // 생략가능
	}

}

결과


property의 value속성을 이용한 Bean 통신

Engine Class

package com.gdu.app1.xml02;

public class Engine {
	
	// field
	private String fuel; 		// 연료(디젤, 가솔린)
	private double efficency; 	// 연비(12.5)
	private int cc;				// 배기량(1998)
	
	// 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.app1.xml02;

public class Car {
	
	// field
	private String model;
	private String maker;
	private Engine engine;
	
	// 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클래스를 참조하는 engine 클래스가 있다.

Spring Bean Configuration File

<?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.app1.xml02.Engine">
		<property name="fuel" value="가솔린"/> <!-- value태그는 value속성으로 대체할 수 있다. -->
		<property name="efficency" value="12.5"/>
		<property name="cc" value="1998"/>
	</bean>
	
	<bean id="dreamCar" class="com.gdu.app1.xml02.Car">
		<property name="model" value="소나타"/>
		<property name="maker" value="현대"/>
		<property name="engine" ref="crdi"/>
	</bean>

</beans>

Setter Injection
위의 1에서 언급했었던 <value> 태그는 value="" value 속성으로 대체할 수 있다.

Main Class

package com.gdu.app1.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의 xmlns:p 속성을 이용한 이용한 Bean 통신

Spring Bean Configuration File의 xml파일 하단의 Namespaces를 클릭하면 여러가지 체크요소가 많이 화면에 표시되는데, 그 중에 p라고 쓰여져 있는 것을 체크하면 세팅은 끝난다.


그럼 상단 beans의 속성에 xmlns:p라는 속성이 추가가 된다.

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

Address Class

package com.gdu.app1.xml03;

public class Address {

	private String jibun;
	private String road;
	private String zipCode;
	
	// 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.app1.xml03;

public class Person {
	
	// field
	private String name;
	private int age;
	private Address addr;
	
	// 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

<?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">
	
	<bean id="address" class="com.gdu.app1.xml03.Address" p:jibun="코딩" p:road="디지털로" p:zipCode="12345"/>
	<bean id="person" class="com.gdu.app1.xml03.Person" p:name="히룽지" p:age="24" p:addr-ref="address"/>

</beans>

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

Main Class

package com.gdu.app1.xml03;

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

public class AddressMain {

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

}

결과


<bean> 태그의 Scope 속성

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

Dao Class

package com.gdu.app1.xml04;

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

String Bean Configuration File

<?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.app1.xml04.Dao" scope="prototype"/>

</beans>

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

Main Class

package com.gdu.app1.xml04;

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("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으로 주면 아래 결과와 같이 dao1, dao2, dao3은 같다.


Database Connection을 하는 방법

MyConnection

package com.gdu.app1.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;
	
	// 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 반환하는 method
	public Connection getConnection() {
		Connection con = null;
		try {
			con = DriverManager.getConnection(url, username, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return con;
	}
}

Spring Bean Configuration File

<?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">


	
 	<bean id="conn" class="com.gdu.app1.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 계정으로 로그인 정보를 넘겨줬다.

Main Class

package com.gdu.app1.xml05;

import java.sql.Connection;

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("xml05/appCtx.xml");
		MyConnection myCon = ctx.getBean("conn", MyConnection.class);
		Connection con = myCon.getConnection();
		
		if(con != null) {
			ctx.close();			
		}
		
		ctx.close();		

	}

}

프로젝트의 BuildPath에 ojdbc6.jar 라이브러리를 추가하고 실행해준다.

프로젝트 우클릭 - Build Path - Configue Build Path... 을 눌러주고,

ClassPath를 선택해준후, Add External JARs..를 선택해주어 미리 다운받아 놓은 ojdbc6.jar파일을 추가해 준후, Apply and Close를 눌러준 후 실행하면된다.

콘솔창에 에러가 안뜨면 성공이다!

profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가
post-custom-banner

0개의 댓글