티스토리 뷰

반응형

강사 : 김호진 강사님

Spring 프레임워크: 교육 2일차

스프링 프레임워크(Spring Framework) 의 주요 기능과 특징

1. 경량 컨테이너

자바 객체를 담고, 이들 자바 객체의 생성과 소멸의 라이프 사이클을 관리.

2. DI(Dependency Injection)

의존성(관계) 주입(삽입)을 지원.

설정 파일을 통해 객체간의 의존 관계를 정의.

3. AOP(Aspect Oriented Programming) 지원.

관점 지향 프로그래밍을 지원.

여러 모듈에 공통적으로 사용되는 기능을 분석 / 분리하여 각 모듈에 적용하는 것이 가능.

4. POJO(Plain Old Java Object) 지원.

가장 기본적인 자바 객체를 지우너하여 기존 작성 코드의 유지성을 향상.

※ POJO(Plain Old Java Object) : 상속 X, 인터페이스 X, 순수하게 우리가 알고있는 클래스의 개념.

5. 트랜잭션 처리.

JDBC 나 JTA 를 사용하는 설정 파일을 통해 트랜잭션을 관리하여 동일한 코드를 여러 환경에서 사용하도록 하는 것이 가능.

6. 다양한 프레임워크와의 조합.

ibatis(mybatis 의 구버전), hibernate, struts, JPA, JDO, JMS, Quertz 등 다른 프레임워크 뿐 아니라 사용자가 만든 프레임워크와의 연동성을 제공한다.


스프링 프레임워크(Spring Framework)에서 가장 중요한 개념

○ DI (Dependency Injection, 의존관계주입, 의존성주입)

객체를 생성하고 관리하는 의존성에 대해서 어떻게 처리하는가에 대한 개념.

○ IoC(Inversion of Control, 제어의 역전, 역제어)

인스턴스 생성부터 소멸까지의... 인스턴스 생명 주기 관리를 우리가 직접 하는 것이 아니라 (스프링)컨테이너가 대신 해주는 개념.


스프링 프레임워크(Spring Framework) 를 이용한 주요 모듈

○ AOP

관점 지향 프로그래밍 방식

○ Web-MVC

웹 어플리케이션에서 MVC 모델을 구축해주는 모듈

○ JDBC

데이터베이스와 연동을 지원하는 모듈

○ Security

처리 과정의 보안을 설정하고 지원하는 모듈


Spring Framework 환경설정

스프링 프레임워크(Spring Framework) 구성을 위해 스프링 프레임워크 관련 파일을 다운로드 받는다.

  • http://www.spring.io → 기존 메뉴들이 변경되어 직접 수동으로 다운로드 받을 수 있는 경로를 제공하지 않는다.
  • http://docs.spring.io/downloads/nightly/release-downloads.php?project=SPR → 리스트 형식으로 제공되던 파일 목록 또한 더 이상 제공하지 않는다.

※ 스프링 구성 버전 및 파일들 중... 적용 및 테스트(실습) 가 원활한 버전으로 개별 제공

spring-framework-3.0.2.RELEASE-with-docs.zip

→ 기본적인 스프링 프레임워크 구성에 필요한 필수적인 jar 파일과 스프링 프레임워크 설명문서(pdf 버전, html 버전)가 포함된 항목. 즉, 스프링 원래의 기본 jar 파일들.

spring-framework-3.0.2.RELEASE-dependencies.zip

→ 스프링 프레임워크 구성에 의존성을 가진 jar 파일들이 포함된 항목. 어떤 기능을 수행해야 하는가에 따라 추가적으로 필요한 항목. 스프링이 참조하는 의존 jar 파일들.

※ 주의.

다운로드를 수행한 두 개의 압축 파일은 디렉터리 경로가 복잡하지 않은 곳으로 옮겨 압축을 해제할 것을 권장한다. (압축파일의 이름 경로 포함)

그렇지 않으면 경로 및 이름이 너무 긴 관계로 압축 해제 과정에서 에러 발생할 수 있다.


SprDi01: Spring DI 실습 01 (일반 버전)

프로젝트 설명

- 콘솔 기반 프로젝트

- 성적 처리

- 국어, 영어, 수학 점수를 입력받아서 총점과 평균을 산출하는 프로그램

- 프로그램 구성

  • Record.java            → 인터페이스
  • RecordView.java        → 인터페이스
  • RecordImpl1.java       → 클래스
  • RecordImpl2.java       → 클래스
  • RecordViewImpl.java    → 클래스
  • Main.java              → main() 메소드를 포함하는 외부 클래스

------------------------------------------------------------------------------------------------------------------------------------------------------

프로젝트 구성

Dynamic Web Project인 SprDi01을 생성하고, Java Resources > srccom.test.spr 패키지를 생성한 뒤 아래 파일들을 입력한다.

※ SprDi01 > 마우스 오른쪽 버튼 클릭 > Java EE Tools > Generate Development Descriptor Stub

Record.java

/*=================
   Record.java
   - 인터페이스
=================*/

package com.test.spr;

public interface Record
{
	public void setKor(int kor);
	public int getKor();
	
	public void setEng(int eng);
	public int getEng();
	
	public void setMat(int mat);
	public int getMat();
	
	public int getTotal();
	
	public double getAvg();
	
}

RecordView.java

/*===================
   RecordView.java
   - 인터페이스
===================*/

package com.test.spr;

public interface RecordView
{
	// 입력 액션 전용 메소드
	public void input();
	
	// 출력 액션 전용 메소드
	public void output();
	
	// ★ 의존 객체를 주입받기 위한 준비
	//--> setter 메소드 준비
	public void setRecord(Record record);   //-- setter Injection
	//-- 매개변수에는 의존객체의 인터페이스 자료형을 지정~!!!
	
}

RecordImpl1.java

/*=================================================
   RecordImpl1.java
   - Record 인터페이스를 구현하는 클래스로 설계
   - 외부에서 국어, 영어, 수학 점수를 전달받아
     총점,  평균을 연산하는 클래스로 설계
=================================================*/

package com.test.spr;

public class RecordImpl1 implements Record
{
	private int kor, eng, mat;

	@Override
	public void setKor(int kor)
	{
		this.kor = kor;
	}

	@Override
	public int getKor()
	{
		return kor;
	}

	@Override
	public void setEng(int eng)
	{
		this.eng = eng;
	}

	@Override
	public int getEng()
	{
		return eng;
	}

	@Override
	public void setMat(int mat)
	{
		this.mat = mat;
	}

	@Override
	public int getMat()
	{
		return mat;
	}

	@Override
	public int getTotal()
	{
		int result = 0;
		
		// 총점 연산과 관련한 액션 처리
		result = this.getKor() + this.getEng() + this.getMat();
		
		return result;
	}

	@Override
	public double getAvg()
	{
		double result = 0;
		
		// 평균 연산과 관련한 액션 처리
		// (피연산자 중 하나라도 실수가 있어야 실수형 기반의 연산을 진행!!)
		result = this.getTotal() / 3.0;
		
		return result;
	}
	
	
}

RecordImpl2.java

/*=================================================
   RecordImpl2.java
   - Record 인터페이스를 구현하는 클래스로 설계
   - 외부에서 국어, 영어, 수학 점수를 전달받아
     총점,  평균을 연산하는 클래스로 설계
=================================================*/

package com.test.spr;

public class RecordImpl2 implements Record
{
	private int kor, eng, mat;

	@Override
	public void setKor(int kor)
	{
		this.kor = kor;
	}

	@Override
	public int getKor()
	{
		return kor;
	}

	@Override
	public void setEng(int eng)
	{
		this.eng = eng;
	}

	@Override
	public int getEng()
	{
		return eng;
	}

	@Override
	public void setMat(int mat)
	{
		this.mat = mat;
	}

	@Override
	public int getMat()
	{
		return mat;
	}

	@Override
	public int getTotal()
	{
		int result = 0;
		
		// 총점 연산과 관련한 액션 처리
		result = this.getKor() + this.getEng() + this.getMat() + 50;
		//-- RecordImpl1 과 다른게 기본 점수를 50점 부여하는 방식으로 정책을 설정한다.
		
		return result;
	}

	@Override
	public double getAvg()
	{
		double result = 0;
		
		// 평균 연산과 관련한 액션 처리
		result = this.getTotal() / 4.0;
		// (피연산자 중 하나라도 실수가 있어야 실수형 기반의 연산을 진행!!)
		//-- 기본 점수가 추가된 사항으로 평균을 종합할 수 있도록 정책을 설정한다.
		
		return result;
	}
	
	
}

RecordViewImpl.java

/*======================================================
   RecordViewImpl.java
   - RecordView 인터페이스를 구현하는 클래스로 설계
======================================================*/

package com.test.spr;

import java.util.Scanner;

public class RecordViewImpl implements RecordView
{
	// 의존객체를 저장하기 위한 멤버 변수 준비
	private Record record;
	//-- 데이터타입을 인터페이스형 자료형을 취할 수 있도록 준비
	//   런 타임 시에는 이 변수에 RecordImpl1 또는 RecordImpl2 객체가 주입(전달)될 예정
	
	// 외부로부터 의존객체를 주입받기 위한 준비
	@Override
	public void setRecord(Record record)
	{
		this.record = record;
	}
	
	@Override
	public void input()
	{
		// 콘솔을 통해 외부로부터 데이터 입력받는 액션 처리
		Scanner sc = new Scanner(System.in);
		
		System.out.print("국어 점수 입력 : ");
		int kor = sc.nextInt();
		System.out.print("영어 점수 입력 : ");
		int eng = sc.nextInt();
		System.out.print("수학 점수 입력 : ");
		int mat = sc.nextInt();
		
		// 입력받은 데이터를 Record 객체에 전달
		// Record 객체 필요.
		// Record(의존객체 - RecordImpl1 또는 RecordImpl2) 를
		// 외부로부터 주입받을 예정.
		// ==> DI (Dependency Injection)
		record.setKor(kor);
		record.setEng(eng);
		record.setMat(mat);
		
		sc.close();
	}

	@Override
	public void output()
	{
		// 산출된 결과를 출력하는 액션 처리
		// Record 객체 필요.
		// Record(의존객체 - RecordImpl1 또는 RecordImpl2)를
		// 외부로부터 주입받을 예정.
		// ==> DI (Dependency Injection)
		System.out.println("국어   영어   수학     총점   평균");
		System.out.printf("%3d    %3d    %3d     %5d   %3.1f%n"
				, record.getKor(), record.getEng(), record.getMat()
				, record.getTotal(), record.getAvg());
	}

}

Main.java

/*============================================
   Main.java
   - main() 메소드를 포함하는 외부 클래스
   
   
   인터페이스           인터페이스
       |                    |
   RecordView ob = new RecordView();
   => 불가능 (인터페이스이기 때문)
   
   
   인터페이스    인터페이스를 구현하는 클래스
       |                    |
   RecordView ob = new RecordImpl1();
   => 가능 
============================================*/

package com.test.spr;

public class Main
{
	public static void main(String[] args)
	{
		// [ 스프링이 관리하게 될 영역 ]
		//------------------------------------------------------------------------------------
//		// RecordImpl1 (→ Record 인터페이스를 구현하는 클래스) 객체 생성
//		Record record = new RecordImpl1();
		
		// RecordImpl2 (→ Record 인터페이스를 구현하는 클래스) 객체 생성
		Record record = new RecordImpl2();
		
		
		// RecordViewImpl (→ RecordView 인터페이스를 구현하는 클래스) 객체 생성
		// Record 객체(의존객체 - RecordImpl1 또는 RecordImpl2) 필요
		RecordView view = new RecordViewImpl();
		
		
		// ★ 의존객체 주입
		//-- 의존객체 주입 방법을 사용하게 되면
		//   느슨한 결합을 구성할 수 있게 되고,
		//   한 쪽의 변동 상황이 다른 쪽에 영향을 덜 줄 수 있게 된다.
		view.setRecord(record);

		//------------------------------------------------------------------------------------
		
		view.input();
		view.output();
		
	}
}


SprDi02: Spring DI 실습 02 (Spring 버전)

- 콘솔 기반 프로젝트

- 성적 처리

- 국어, 영어, 수학 점수를 입력받아서 총점과 평균을 산출하는 프로그램

- 프로그램 구성

  • Record.java            → 인터페이스
  • RecordView.java        → 인터페이스
  • RecordImpl1.java       → 클래스
  • RecordImpl2.java       → 클래스
  • RecordViewImpl.java    → 클래스
  • Main.java              → main() 메소드를 포함하는 외부 클래스
  • applicationContext.xml (com.test.spr 패키지 외부에 존재. src에 위치.)

프로젝트 구성

Dynamic Web Project인 SprDi03을 생성하고, Java Resources > srccom.test.spr 패키지를 생성한다.

※ SprDi01 > 마우스 오른쪽 버튼 클릭 > Java EE Tools > Generate Development Descriptor Stub

Spring Framework의 Library를 추가해준다.

spring-framework-with-docs > spring-framework-3.0.2.RELEASE > dist 폴더 내

  • org.springframework.asm-3.0.2.RELEASE.jar
  • org.springframework.beans-3.0.2.RELEASE.jar
  • org.springframework.context-3.0.2.RELEASE.jar
  • org.springframework.core-3.0.2.RELEASE.jar
  • org.springframework.expression-3.0.2.RELEASE.jar

spring-framework-dependencies > org.apache.commons > com.springsource.org.apache.commons.logging > 1.1.1 폴더 내

  • com.springsource.org.apache.commons.logging-1.1.1.jar

Record.java

SprDi01의 Record.java와 동일

RecordView.java

SprDi01의 RecordView.java와 동일

RecordImpl1.java

SprDi01의 RecordImpl1.java와 동일

RecordImpl2.java

SprDi01의 RecordImpl2.java와 동일

RecordViewImpl.java

SprDi01의 RecordViewImpl.java와 동일

Main.java

/*============================================
   Main.java
   - main() 메소드를 포함하는 외부 클래스
   
   
   인터페이스           인터페이스
       |                    |
   RecordView ob = new RecordView();
   => 불가능 (인터페이스이기 때문)
   
   
   인터페이스    인터페이스를 구현하는 클래스
       |                    |
   RecordView ob = new RecordImpl1();
   => 가능 
============================================*/

package com.test.spr;

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

public class Main
{
	public static void main(String[] args)
	{
		// 스프링 프레임워크에서는
		// 객체 생성 및 관리... 그리고 DI(의존성 주입) 등의 설정은
		// 기본적으로 XML 파일로 대체하게 된다.
		
		// 스프링 프레임워크에서 『applicationContext.xml』 파일을 읽어서
		// 생성 및 관리할 객체 정보를 얻어와야 하는 상황이다.
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

		// 『getBean()』 메소드를 이용하여 사용자가 원하는 객체를 얻어온다.
		// 메소드의 인자값으로 id 속성(xml)을 지정하면 된다.
//		RecordView view = (RecordView)context.getBean("view");
		//-- 『context.getBean("view");』 → Object 타입
		
		// 스프링 3.0 이후 버전부터 추가된 사용 가능한 코드
		RecordView view = context.getBean("view", com.test.spr.RecordView.class);
		
		
		
		// [ 스프링이 관리하게 될 영역 ]
		//------------------------------------------------------------------------------------
		/*
//		// RecordImpl1 (→ Record 인터페이스를 구현하는 클래스) 객체 생성
//		Record record = new RecordImpl1();
		
		// RecordImpl2 (→ Record 인터페이스를 구현하는 클래스) 객체 생성
		Record record = new RecordImpl2();
		
		
		// RecordViewImpl (→ RecordView 인터페이스를 구현하는 클래스) 객체 생성
		// Record 객체(의존객체 - RecordImpl1 또는 RecordImpl2) 필요
		RecordView view = new RecordViewImpl();
		
		
		// ★ 의존객체 주입
		//-- 의존객체 주입 방법을 사용하게 되면
		//   느슨한 결합을 구성할 수 있게 되고,
		//   한 쪽의 변동 상황이 다른 쪽에 영향을 덜 줄 수 있게 된다.
		view.setRecord(record);
		 */
		//------------------------------------------------------------------------------------
		
		view.input();
		view.output();
		
	}
}

applicationContext.xml

\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n\n\t\n\n\n"}}" data-ve-attributes="{"typeof":"mw:Extension/syntaxhighlight","about":"#mwt3"}">
<?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-3.0.xsd">



	<!-- ※ 스프링이 제공하는 환경설정 XML 파일에서 다음과 같은 작업을 수행할 수 있도록 한다. -->
	
	
	<!-- ○ RecordImpl 객체(의존객체) 생성 과정 -->
	<!-- 『id=""』 속성은 객체에 대한 식별자를 지정 -->
	<!-- 『class=""』 속성은 생성하고자 하는 객체의 클래스(패키지 경로 포함)를 지정 -->
	
	<!-- - RecordImpl1 객체(의존객체) 생성 과정 -->
	<bean id="record1" class="com.test.spr.RecordImpl1"></bean>
	
	<!-- - RecordImpl2 객체(의존객체) 생성 과정 -->
	<bean id="record2" class="com.test.spr.RecordImpl2"></bean>
	
	
	<!-- ○ RecordViewImpl 객체(의존객체를 주입받는 객체) 생성 과정 -->
	<bean id="view" class="com.test.spr.RecordViewImpl">
		
		<!-- RecordImpl 객체에 대한 DI 설정 정보 구성 -->
		<!-- 『property』 엘리먼트는 setter 메소드에 대한 지정 -->
		<!-- 『setXXX()』 메소드인 경우 『property name="XXX"></property>』 로 지정하게 된다. -->
		<property name="record">
		
			<!-- 『ref』 엘리먼트는 DI에 대한 참조 지정 -->
			<ref bean="record2"/>
			
		</property>
	
	</bean>

	<!-- ★ 위와 같이 처리했을 때의 장점은
	        자바 소스 코드의 변경 없이 객체 생성 및 DI 설정을 변경할 수 있다는 것이다. -->

</beans>


SprDi03: Spring DI 실습 03 (데이터베이스 포함 버전)

프로젝트 설명

- 콘솔 기반 프로젝트

- 오라클 데이터베이스에 대해서 원격 서버와 로컬 서버를 동시에 사용할 수 있도록 설정.

- 물리적 파일 구성

  • MemberDTO.java     → 자료형 클래스
  • DAO.java           → 인터페이스
  • LocalDAO.java      → 클래스
  • RemoteDAO.java     → 클래스
  • MemberDAO.java     → 클래스
  • Main.java          → 클래스
  • applicationContext.xml (→ bean factory의 확장판)

프로젝트 구성

Dynamic Web Project인 SprDi03을 생성하고, Java Resources > srccom.test.spr 패키지를 생성한다.

※ SprDi01 > 마우스 오른쪽 버튼 클릭 > Java EE Tools > Generate Development Descriptor Stub

Spring Framework의 Library를 추가해준다.

spring-framework-with-docs > spring-framework-3.0.2.RELEASE > dist 폴더 내

  • org.springframework.asm-3.0.2.RELEASE.jar
  • org.springframework.beans-3.0.2.RELEASE.jar
  • org.springframework.context-3.0.2.RELEASE.jar
  • org.springframework.core-3.0.2.RELEASE.jar
  • org.springframework.expression-3.0.2.RELEASE.jar

spring-framework-dependencies > org.apache.commons > com.springsource.org.apache.commons.logging > 1.1.1 폴더 내

  • com.springsource.org.apache.commons.logging-1.1.1.jar

MemberDTO.java

/*======================================================
   MemberDTO.java
   - 데이터 전송 및 저장을 위한 자료형 클래스로 설계
======================================================*/

package com.test.spr;

public class MemberDTO
{
	// TBL_MEMBERLIST 테이블의 컬럼 구조에 따라 속성 구성
	private String mid, name, tel;

	// getter / setter 구성
	public String getMid()
	{
		return mid;
	}

	public void setMid(String mid)
	{
		this.mid = mid;
	}

	public String getName()
	{
		return name;
	}

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

	public String getTel()
	{
		return tel;
	}

	public void setTel(String tel)
	{
		this.tel = tel;
	}
	
	
}

DAO.java

/*=================
   DAO.java
   - 인터페이스
=================*/

package com.test.spr;

import java.sql.SQLException;
import java.util.ArrayList;

public interface DAO
{
	public ArrayList<MemberDTO> lists() throws SQLException, ClassNotFoundException;
	
	
}

LocalDAO.java

/*=============================================
   LocalDAO.java
   - DAO 인터페이스를 구현하는 클래스로 설계
=============================================*/

package com.test.spr;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class LocalDAO implements DAO
{

	@Override
	public ArrayList<MemberDTO> lists() throws SQLException, ClassNotFoundException
	{
		ArrayList<MemberDTO> result = new ArrayList<MemberDTO>();
		
		Class.forName("oracle.jdbc.driver.OracleDriver");
		String url = "jdbc:oracle:thin:scott/tiger@localhost:1521:xe";
		Connection conn = DriverManager.getConnection(url);
		
		String sql = "SELECT MID, NAME, TEL"
				+ " FROM TBL_MEMBERLIST"
				+ " ORDER BY MID";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		ResultSet rs = pstmt.executeQuery();
		
		while (rs.next())
		{
			MemberDTO dto = new MemberDTO();
			dto.setMid(rs.getString("MID"));
			dto.setName(rs.getString("NAME"));
			dto.setTel(rs.getString("TEL"));
			
			result.add(dto);
		}
		
		rs.close();
		pstmt.close();
		conn.close();
		
		return result;
	}
	
}

RemoteDAO.java

/*============================================= RemoteDAO.java - DAO 인터페이스를 구현하는 클래스로 설계 =============================================*/ package com.test.spr; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; public class RemoteDAO implements DAO { @Override public ArrayList<MemberDTO> lists() throws SQLException, ClassNotFoundException { ArrayList<MemberDTO> result = new ArrayList<MemberDTO>(); Class.forName("oracle.jdbc.driver.OracleDriver"); String url = "jdbc:oracle:thin:scott/tiger@<서버 IP주소>:1521:xe"; Connection conn = DriverManager.getConnection(url); String sql = "SELECT MID, NAME, TEL" + " FROM TBL_MEMBERLIST" + " ORDER BY MID"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { MemberDTO dto = new MemberDTO(); dto.setMid(rs.getString("MID")); dto.setName(rs.getString("NAME")); dto.setTel(rs.getString("TEL")); result.add(dto); } rs.close(); pstmt.close(); conn.close(); return result; } }

MemberDAO.java

/*==========================================================
   MemberDAO.java
   - DAO 객체의 lists() 메소드 호출 클래스
   - DAO 인터페이스를 구현한 클래스에 대해 의존관계 설정
==========================================================*/

package com.test.spr;

public class MemberDAO
{
	// 인터페이스 자료형 속성 구성
	private DAO dao;
	
	// setter
	public void setDao(DAO dao)
	{
		this.dao = dao;
	}
	
	public void lists()
	{
		try
		{
			for(MemberDTO dto : dao.lists())
			{
				System.out.printf("%s %s %s %n"
						, dto.getMid(), dto.getName(), dto.getTel());
			}
			
		} catch (Exception e)
		{
			System.out.println(e.toString());
		}
	}
}

Main.java

/*==========================================
   Main.java
   - main() 메소드를 포함하는 외부 클래스
==========================================*/

package com.test.spr;

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

public class Main
{
	public static void main(String[] args)
	{
		// XML 설정 파일을 이용하여 객체 생성 및 설정 정보를 읽어올 수 있도록 처리
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		
		// MemberDAO 객체를 요청하는 과정 (요청 대상은 스프링)
		// XML 설정 파일 안에서 『memberDAO』라는 아이디를 가진 객체를 요청
		// 그리고 이 객체를 반환 받는 과정에서 Object 타입이 아닌 MemberDAO 타입으로 반환받을 수 있도록 처리
		MemberDAO memberDAO = context.getBean("memberDAO", MemberDAO.class);
		//-- 동일한 패키지 내에 있을 경우에는 패키지명 생략 가능
		
		// 위 과정을 통해 가져온 객체 안에 들어있는... 
		// 특정 메소드 (→ lists()) 호출
		memberDAO.lists();
		
	}
}

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-3.0.xsd">

	<!-- LocalDAO 클래스에 대한 객체 생성 -->
	<!--  com.test.spr.LocalDAO localDAO = new.com.test.spr.LocalDAO();    구문을 스프링이 실행~!!! -->
	<bean id="localDAO" class="com.test.spr.LocalDAO"></bean>

	<!-- RemoteDAO 클래스에 대한 객체 생성 -->
	<!--  com.test.spr.RemoteDAO remoteDAO = new.com.test.spr.RemoteDAO();    구문을 스프링이 실행~!!! -->
	<bean id="remoteDAO" class="com.test.spr.RemoteDAO"></bean>


	<!-- MemberDAO 클래스에 대한 객체 생성 -->
	<!--  com.test.spr.MemberDAO memberDAO = new.com.test.spr.MemberDAO();    구문을 스프링이 실행~!!! -->
	<bean id="memberDAO" class="com.test.spr.MemberDAO">
		
		<!--  RemoteDAO 객체에 대한 의존성 삽입 -->
		<property name="dao">
			<ref bean="localDAO" />
		</property>
	</bean>

</beans>


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함