기존 자바는 객체를 생성할 때 아래와 같이
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를 이용해 값을 주입한다.
프로젝트의 src/main/java
에 xml의 정보를 담을 Java파일을 생성하기위해 패키지를 만들어주고, Calculator
라는 클래스를 만들어준다.
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));
}
}
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)에 보관된다.
<?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>
태그 안에 넣는다.
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(); // 생략가능
}
}
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;
}
}
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 클래스가 있다.
<?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 속성으로 대체할 수 있다.
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();
}
}
Spring Bean Configuration File의 xml파일 하단의 Namespaces를 클릭하면 여러가지 체크요소가 많이 화면에 표시되는데, 그 중에 p라고 쓰여져 있는 것을 체크하면 세팅은 끝난다.
그럼 상단 beans의 속성에 xmlns:p
라는 속성이 추가가 된다.
위의 세팅은 <property>
태그를 <bean>
태그의 p:
속성으로 바꿔서 사용할 수 있다.
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;
}
}
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;
}
}
<?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:
속성으로 바꿔서 사용할 수 있다.
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 속성
scope="singleton"
1) bean을 하나만 만들어 둔다.
2) 생략하면 singleton이 사용된다.scope="prototype"
1) bean을 요청할 때마다 만들어 준다. (getBean)
2) 자주 사용되지는 않는다.
package com.gdu.app1.xml04;
public class Dao {
// method
public void list() {
System.out.println("목록 가져오기");
}
public void detail() {
System.out.println("상세정보 보여주기");
}
}
<?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을 생성해준다.
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은 같다.
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;
}
}
<?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 계정으로 로그인 정보를 넘겨줬다.
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
를 눌러준 후 실행하면된다.
콘솔창에 에러가 안뜨면 성공이다!