Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
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
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[Spring] 20240108 [프로그램 소스] 본문

[Spring]/Program source (Spring)

[Spring] 20240108 [프로그램 소스]

Jelly-fish 2024. 1. 8. 15:18

 

SpringPrj03


 

[Oracle]

 

 


암호화복호화_01.sql

 

SELECT USER
FROM DUAL;
--==>> SYS

--■■■ 암호화 및 복호화 01 ■■■--

-- ( * 패키지를 설치하기 위해 SYS 로 접속한 것.)

-- 1. 오라클 암호화 기능을 사용하기 위해서는
--    DBMS_OBFUSCATION_TOOLKIT 패키지를 이용할 수 있다.
--    (관련 패키지를 활용하지 않고, 암호화 복호화 알고리즘을 직접 구현할 수도 있다.)


-- 2. DBMS_OBFUSCATION_TOOLKIT 패키지는 
--    기본적(default)으로는 사용할 수 없는 상태로 설정되어 있으므로
--    추가로 이 패키지를 사용할 수 있는 상태로 설치하는 과정이 필요하다.
--    이를 위해... 『dbmsobtk.sql』과 『prvtobtk.plb』 파일을 찾아 실행해야 한다.


--============================================================================
-- 사원번호 7369 SMITH 
-- 사원의 이름, 소속부서, 연봉 조회 가능.

-- [암호화] : 어떤 데이터가 들어있는지를 알 수 없도록 처리하는 것.
-- (ex : 공인인증서) 
--  → 암호화가 되어있지만 특정한 규칙에 맞지 않게 해독하면 
--     관리자마저도 제대로 확인 불가능. (두 Key가 맞아야 해독 가능하다.)
--     암호를 해독하는 키(보안카드, OTP 생성키)를 
--     잃어버리면 처음부터 다시 발급받아야 한다.
--============================================================================



--          암호화             복호화
--    book  ------   2151511   ------   book
--    book  ------   cppl      ------   book


@C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\dbmsobtk.sql
--==>>
/*
Library DBMS_OBFUSCATION_LIB이(가) 컴파일되었습니다.
Library CRYPTO_TOOLKIT_LIBRARY이(가) 컴파일되었습니다.
Package DBMS_CRYPTO이(가) 컴파일되었습니다.
SYNONYM DBMS_CRYPTO이(가) 생성되었습니다.
Package DBMS_OBFUSCATION_TOOLKIT이(가) 컴파일되었습니다.
SYNONYM DBMS_OBFUSCATION_TOOLKIT이(가) 생성되었습니다.
Grant을(를) 성공했습니다.
Package DBMS_SQLHASH이(가) 컴파일되었습니다.
SYNONYM DBMS_SQLHASH이(가) 생성되었습니다.
*/

@C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\prvtobtk.plb
--==>>
/*
Package DBMS_CRYPTO_FFI이(가) 컴파일되었습니다.
Package Body DBMS_CRYPTO_FFI이(가) 컴파일되었습니다.
Package Body DBMS_CRYPTO이(가) 컴파일되었습니다.
Package DBMS_OBFUSCATION_TOOLKIT_FFI이(가) 컴파일되었습니다.
Package Body DBMS_OBFUSCATION_TOOLKIT_FFI이(가) 컴파일되었습니다.
Package Body DBMS_OBFUSCATION_TOOLKIT이(가) 컴파일되었습니다.
Package Body DBMS_SQLHASH이(가) 컴파일되었습니다.
*/

-- 3. 이 패키지는 4개의 프로시저로 이루어져 있다.
--    VARCHAR2 타입을 Encrypt/Decrypt 할 수 있는 2개의 프로시저
--    RAW 타입을 Encrypt/Decrypt 할 수 있는 2개의 프로시저
--    (※ 다른 타입은 지원하지 않기 때문에
--        NUMBER 나 DATE 와 같은 경우는 TO_CHAR() 이용)

-- ※ RAW, LONG LAW, ROWID 타입
--    그래픽 이미지나 디지털 사운드 등을 저장
--    HEXA-DECIMAL(16진수) 형태로 RETURN.
--    이 중 RAW 는 VARCHAR2 와 유사하다.
--    LONG RAW 는 LONG 과 유사하지만 다음과 같은 제한사항이 있다.
--    ·저장과 추출만 가능하고 DATA 를 가공할 수 없다.
--    ·LONG RAW 는 LONG 과 같은 제한사항을 갖는다.


--○ 해당 패키지를 사용할 수 있도록 권한 부여(SYS 가 SCOTT 에게...)
GRANT EXECUTE ON DBMS_OBFUSCATION_TOOLKIT TO SCOTT;
--==>> Grant을(를) 성공했습니다.
--> SCOTT 계정으로 DBMS_OBFUSCATION_TOOLKIT 패키지의
--  프로시저를 사용할 수 있는 권한 부여


--○ 해당 패키지를 사용할 수 있도록 권한 부여(SYS 가 PUBLIC 에게...)
GRANT EXECUTE ON DBMS_OBFUSCATION_TOOLKIT TO PUBLIC;
--==>> Grant을(를) 성공했습니다.
--> 운영자 계정으로 DBMS_OBFUSCATION_TOOLKIT 패키지의
--  프로시저를 사용할 수 있는 권한 부여

 


 

암호화복호화_02.sql

 

SELECT USER
FROM DUAL;
--==>> SCOTT

--(현재 SCOTT 으로 연결된 상태)


--■■■ 암호화 및 복호화 02 ■■■--


--○ 패키지 선언(CRYPTPACK)
CREATE OR REPLACE PACKAGE CRYPTPACK
AS

    --                원본 문자     암호화 문자
    FUNCTION ENCRYPT(STR VARCHAR2, HASH VARCHAR2)
    RETURN VARCHAR2;
    
    --                암호화된 문자   복호화 문자
    FUNCTION DECRYPT(XCRYPT VARCHAR2, HASH VARCHAR)
    RETURN VARCHAR2;
    

END CRYPTPACK;
--==>> Package CRYPTPACK이(가) 컴파일되었습니다.


--○ 패키지 몸체(CRYPTPACK)
CREATE OR REPLACE PACKAGE BODY CRYPTPACK
IS
    -- 전역변수(속성)
    CRYPTED_STRING VARCHAR2(2000);
    
    -- 함수(암호화)
    FUNCTION ENCRYPT(STR VARCHAR2, HASH VARCHAR2)
    RETURN VARCHAR2
    IS
        -- [길이를 8로 나눠서 반올림(절삭)]
        PIECES_OF_EIGHT NUMBER := ((FLOOR(LENGTH(STR)/8 + .9)) * 8);
    -- [=>] : 특정한 파라미터만 지정해서 넘길 때 사용하는 기호
    -- 『L·RPAD("값", "총 문자길이", "채움문자")』
    BEGIN
        DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT
        ( INPUT_STRING      => RPAD(STR, PIECES_OF_EIGHT)
        , KEY_STRING        => RPAD(HASH, 8, '#')
        , ENCRYPTED_STRING  => CRYPTED_STRING
        );
        RETURN CRYPTED_STRING;
    END;
    
    -- 함수(복호화)
    FUNCTION DECRYPT(XCRYPT VARCHAR2, HASH VARCHAR)
    RETURN VARCHAR2
    IS
    BEGIN
        DBMS_OBFUSCATION_TOOLKIT.DESDECRYPT
        ( INPUT_STRING      => XCRYPT
        , KEY_STRING        => RPAD(HASH, 8, '#')
        , DECRYPTED_STRING  => CRYPTED_STRING
        );
        RETURN TRIM(CRYPTED_STRING);
    END;

END CRYPTPACK;
--==>> Package Body CRYPTPACK이(가) 컴파일되었습니다.

 

암호화복호화_03.sql

 

SELECT USER
FROM DUAL;
--==>> SCOTT


--■■■ 암호화 및 복호화 03 ■■■--

--○ 테이블 생성
CREATE TABLE TBL_PACKAGETEST
( ID    NUMBER
, KEY   VARCHAR2(40)
, PW    VARCHAR2(40)
);
--==>> Table TBL_PACKAGETEST이(가) 생성되었습니다.


--○ 데이터 입력(비 암호화)
INSERT INTO TBL_PACKAGETEST(ID, PW) VALUES(1, 'abcd1234');
--==>> 1 행 이(가) 삽입되었습니다.


--○ 확인 (→ 복호화 과정을 수행하지 않고 일반적인 조회를 수행)
SELECT *
FROM TBL_PACKAGETEST;
--==>> 1    (null)  abcd1234

--○ 롤백
ROLLBACK;
--==>> 롤백 완료.



--○ 다시 데이터 입력(암호화)
INSERT INTO TBL_PACKAGETEST(ID, KEY, PW) 
VALUES(1, 'abcd1234', CRYPTPACK.ENCRYPT('abcd1234', 'abcd1234'));
-- 'abcd1234' (패스워드)를
-- 'abcd1234' (키)로 암호화 처리
--==>> 1 행 이(가) 삽입되었습니다.

--○ 확인
SELECT *
FROM TBL_PACKAGETEST;
--==>> 1	abcd1234	c":5�


--○ 데이터 조회 (복호화 → 암호화 과정에서 설정한 KEY 가 아닌 잘못된 KEY 를 통해 복호화)

SELECT ID, CRYPTPACK.DECRYPT(PW, '1111') "결과확인"
FROM TBL_PACKAGETEST;
--==>> 1	�f+�� 
--    [잘못된 키 값을 찍어서 제대로 된 복호화 결과를 확인할 수 없다.]



SELECT ID, CRYPTPACK.DECRYPT(PW, 'abcd') "결과확인"
FROM TBL_PACKAGETEST;
--==>> 1	G�"!�
--    [잘못된 키 값을 찍어서 제대로 된 복호화 결과를 확인할 수 없다.]


--○ 데이터 조회 (복호화 → 암호화 과정에서 설정한 KEY 를 통해 복호화)

SELECT ID, CRYPTPACK.DECRYPT(PW, 'abcd1234') "결과확인"
FROM TBL_PACKAGETEST;
--==>> 1	abcd1234
--    [원래 데이터의 형태로 제대로 확인이 된다~!!! 완전 신기함]

 


 

SpringPrj03_scott.sql

 

SELECT USER
FROM DUAL;
--==>> SCOTT


--○ 테이블 생성
CREATE TABLE TBL_MEMBERLIST
( ID    VARCHAR2(30)    NOT NULL
, PW    VARCHAR2(50)    NOT NULL
, NAME  VARCHAR2(50)    NOT NULL
, TEL   VARCHAR2(50)    NOT NULL
, EMAIL VARCHAR2(100)
, CONSTRAINT MEMBERLIST_ID_PK PRIMARY KEY(ID)
);
--==>> Table TBL_MEMBERLIST이(가) 생성되었습니다.


--○ 데이터 입력(암호화 패키지 CRYPTPACK 활용)
INSERT INTO TBL_MEMBERLIST(ID, PW, NAME, TEL, EMAIL)
VALUES('admin', CRYPTPACK.ENCRYPT('java006$', 'admin'), '관리자', '010-1122-3344', 'admin@test.com');
--==>> 1 행 이(가) 삽입되었습니다.

--○ 확인

SELECT *
FROM TBL_MEMBERLIST;
--==>> admin	-#O�|/	관리자	010-1122-3344	admin@test.com


--○ 커밋
COMMIT;
--==>> 커밋 완료.


--○ 기본 조회 쿼리문 구성
SELECT ID, NAME, TEL, EMAIL
FROM TBL_MEMBERLIST;
--> 한 줄 구성
SELECT ID, NAME, TEL, EMAIL FROM TBL_MEMBERLIST
;
--==>> admin	관리자	010-1122-3344	admin@test.com


--○ 데이터 추가 입력(DAO 구분을 통해 원격 접속 실습을 위한 준비 - 사전 환경 구성)
INSERT INTO TBL_MEMBERLIST(ID, PW, NAME, TEL, EMAIL)
VALUES('kjm', CRYPTPACK.ENCRYPT('java006$', 'kjm'), '김지민', '010-3937-6913', 'kjmjm3932@gmail.com');
--==>> 1 행 이(가) 삽입되었습니다.


--○ 확인
SELECT ID, NAME, TEL, EMAIL
FROM TBL_MEMBERLIST;
--==>>
/*
ID	    NAME	TEL	            EMAIL
admin	관리자	010-1122-3344	admin@test.com
kjm	    김지민	010-3937-6913	kjmjm3932@gmail.com
*/

--○ 커밋
COMMIT;
--==>> 커밋 완료.

 

 


 

 

■■■ IoC/DI 관련 실습 03 ■■■

※ 스프링 프레임워크 없이 IoC/DI 개념 실습

○ 실습 성격 및 주요사항
   1. 콘솔 프로젝트
   2. 데이터베이스 연동 프로젝트 구성
   3. 오라클 암호화 / 복호화 적용

○ 물리적 파일 구성
   1. SpringPrj03_scott.sql       → 데이터베이스 관련 준비
   2. MemberDTO.java              → DTO 역할
                                     TBL_MEMBERLIST 테이블 레코드 참조
   3. OracleDAO.java              → DAO 역할 → 실습 진행 간 계정 설정으로 구분하여 연결 진행
   4. MssqlDAO.java               → DAO 역할 → 실습 진행 간 계정 설정으로 구분하여 연결 진행

   5. MemberList.java             → DAO 클래스를 참조하는 클래스 
                                     의존관계 설정.
                                     리스트 출력 메소드 구현.

   6. Main.java                   → 클래스, main() 메소드를 포함하는 테스트 클래스

 

 

Java

 

 

MemberDTO.java

 

/*==============================================
   MemberDTO.java
   - TBL_MEMBERLIST 테이블의 레코드 구조 참조
===============================================*/

package com.test.spr;

public class MemberDTO
{
	// 주요 속성 구성 → TBL_MEMBERLIST 테이블 레코드 형식
	private String id, pw, name, tel, email;

	
	// 인자 없는 생성자 → 기본(default) 생성자	→ 자동 삽입(생략)

	
	// 사용자 정의 생성자 정의 안함
	
	// getter / setter 구성
	public String getId()
	{
		return id;
	}

	public void setId(String id)
	{
		this.id = id;
	}

	public String getPw()
	{
		return pw;
	}

	public void setPw(String pw)
	{
		this.pw = pw;
	}

	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;
	}

	public String getEmail()
	{
		return email;
	}

	public void setEmail(String email)
	{
		this.email = email;
	}
	
	
	
	
}

 

 


 

OracleDAO.java

 

/*====================================================
   OracleDAO.java
   - DAO 계층 구성
   - MssqlDAO 와 설정만 다르게 연결하여 실습 진행
     → MSSQL 서버가 구축되어 있지 않기 때문에...
=====================================================*/
package com.test.spr;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class OracleDAO
{
	public List<MemberDTO> list() throws ClassNotFoundException, SQLException
	{
		List<MemberDTO> result = new ArrayList<MemberDTO>();
		
		// 데이터베이스 연결
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection
				("jdbc:oracle:thin:@211.238.142.170:1521:xe", "scott", "tiger");
		
		// 쿼리문 준비 및 실행
		
		String sql = "SELECT ID, NAME, TEL, EMAIL FROM TBL_MEMBERLIST";
		
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery(sql);
		
		// 결과 집합을 컬렉션에 추가
		
		while(rs.next())
		{
			MemberDTO dto = new MemberDTO();
			
			dto.setId(rs.getString("ID"));
			dto.setName(rs.getString("NAME"));
			dto.setTel(rs.getString("TEL"));
			dto.setEmail(rs.getString("EMAIL"));
			
			result.add(dto);
			
		}
		
		// 리소스 반납
		rs.close();
		stmt.close();
		
		// 데이터베이스 연결 종료
		if (!conn.isClosed())
			conn.close();
		
		return result;
	}

}

 


 

MssqlDAO.java

 

/*====================================================
   MssqlDAO.java
   - DAO 계층 구성
   - OracleDAO 와 설정만 다르게 연결하여 실습 진행
     → MSSQL 서버가 구축되어 있지 않기 때문에...
=====================================================*/
package com.test.spr;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class MssqlDAO
{
	public List<MemberDTO> list() throws ClassNotFoundException, SQLException
	{
		List<MemberDTO> result = new ArrayList<MemberDTO>();
		
		// 데이터베이스 연결
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection
				("jdbc:oracle:thin:@211.238.142.171:1521:xe", "scott", "tiger");
		
		// 쿼리문 준비 및 실행
		
		String sql = "SELECT ID, NAME, TEL, EMAIL FROM TBL_MEMBERLIST";
		
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery(sql);
		
		// 결과 집합을 컬렉션에 추가
		
		while(rs.next())
		{
			MemberDTO dto = new MemberDTO();
			
			dto.setId(rs.getString("ID"));
			dto.setName(rs.getString("NAME"));
			dto.setTel(rs.getString("TEL"));
			dto.setEmail(rs.getString("EMAIL"));
			
			result.add(dto);
			
		}
		
		// 리소스 반납
		rs.close();
		stmt.close();
		
		// 데이터베이스 연결 종료
		if (!conn.isClosed())
			conn.close();
		
		return result;
	}

}

 


MemberList.java

 

/*===========================================
    MemberList.java
    - DAO 객체를 참조하는 클래스
    - 의존관계 설정
    - 리스트 출력(print()) 메소드 구현
===========================================*/

package com.test.spr;

public class MemberList
{
	// 처음 연결하는 객체 정보(OracleDAO)
	/*
	private OracleDAO dao;
	
	
	public MemberList()
	{
		// MemberList 입장에서의 의존 객체 OracleDAO
		dao = new OracleDAO();
	}
	*/
	
	// 두 번째 연결하는 객체 정보(MssqlDAO)
	private MssqlDAO dao;
	
	
	public MemberList()
	{
		// MemberList 입장에서의 의존 객체 OracleDAO
		dao = new MssqlDAO();
	}
	
	// 리스트 출력(print()) 메소드 구현
	public void print()
	{
		try
		{
			for (MemberDTO dto : dao.list())
			{
				System.out.printf("%14s %4s %15s %15s%n"
						, dto.getId(), dto.getName()
						, dto.getTel(), dto.getEmail());
			}
			
		} catch (Exception e)
		{
			System.out.println(e.toString());
		}
		
	}
}

 

 

Main.java

 

/*================================================
   Main.java
   - main() 메소드를 포함하는 테스트 클래스
=================================================*/
package com.test.spr;

public class Main
{
	public static void main(String[] args)
	{
		MemberList member = new MemberList();
		member.print();
	}
}

 

 

 


 

 

■■■ IoC/DI 관련 실습 04 ■■■

※ 스프링 프레임워크 적용 IoC/DI 개념 실습

○ 실습 성격 및 주요사항
   1. 콘솔 프로젝트
   2. 데이터베이스 연동 프로젝트 구성
   3. 오라클 암호화 / 복호화 적용

※ 라이브러리 등록
   - 경로1   → C:\s-f-3.0.2-with-docs\dist
     ·파일1 → org.springframework.asm-3.0.2.RELEASE.jar
     ·파일2 → org.springframework.beans-3.0.2.RELEASE.jar
     ·파일3 → org.springframework.context-3.0.2.RELEASE.jar
     ·파일4 → org.springframework.core-3.0.2.RELEASE.jar
     ·파일5 → org.springframework.expression-3.0.2.RELEASE.jar
   - 경로2   → C:\s-f-3.0.2-dependencies\org.apache.commons                \cohttp://m.springsource.org.apache.commons.logging\1.1.1
     ·파일6 → cohttp://m.springsource.org.apache.commons.logging-1.1.1.jar
   - 경로3   → C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib     
     ·파일7 → ojdbc6.jar



○ 물리적 파일 구성
   1. SpringPrj03_scott.sql       → 데이터베이스 관련 준비
   2. MemberDTO.java              → DTO 역할
                                     TBL_MEMBERLIST 테이블 레코드 참조
   3. OracleDAO.java              → DAO 역할 → 실습 진행 간 계정 설정으로 구분하여 연결 진행
   4. MssqlDAO.java               → DAO 역할 → 실습 진행 간 계정 설정으로 구분하여 연결 진행

   5. MemberList.java             → DAO 클래스를 참조하는 클래스 
                                     의존관계 설정.
                                     리스트 출력 메소드 구현.

   6. Main.java                   → 클래스, main() 메소드를 포함하는 테스트 클래스


○ 이전 실습(SpringPrj03)과 비교하여 추가적으로 필요한 파일
   7. applicationContext.xml      → 스프링 환경 설정 파일
                                     객체 생성 구문 및 DI 설정 구문 작성

   8. IDAO.java                   → 인터페이스

 


 

IDAO.java

 

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

package com.test.spr;

import java.sql.SQLException;
import java.util.List;

public interface IDAO
{
	// (추상) 메소드 선언
	public List<MemberDTO> list() throws ClassNotFoundException, SQLException;
	
}

OracleDAO.java

 

/*====================================================
   OracleDAO.java
   - DAO 계층 구성
   - MssqlDAO 와 설정만 다르게 연결하여 실습 진행
     → MSSQL 서버가 구축되어 있지 않기 때문에...
   - IDAO 인터페이스를 구현하는 클래스 ++++++++++++++
=====================================================*/
package com.test.spr;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class OracleDAO implements IDAO
{
	
	@Override
	public List<MemberDTO> list() throws ClassNotFoundException, SQLException
	{
		List<MemberDTO> result = new ArrayList<MemberDTO>();
		
		// 데이터베이스 연결
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection
				("jdbc:oracle:thin:@211.238.142.170:1521:xe", "scott", "tiger");
		
		// 쿼리문 준비 및 실행
		
		String sql = "SELECT ID, NAME, TEL, EMAIL FROM TBL_MEMBERLIST";
		
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery(sql);
		
		// 결과 집합을 컬렉션에 추가
		
		while(rs.next())
		{
			MemberDTO dto = new MemberDTO();
			
			dto.setId(rs.getString("ID"));
			dto.setName(rs.getString("NAME"));
			dto.setTel(rs.getString("TEL"));
			dto.setEmail(rs.getString("EMAIL"));
			
			result.add(dto);
			
		}
		
		// 리소스 반납
		rs.close();
		stmt.close();
		
		// 데이터베이스 연결 종료
		if (!conn.isClosed())
			conn.close();
		
		return result;
	}

}

 

MssqlDAO.java

 

/*====================================================
   MssqlDAO.java
   - DAO 계층 구성
   - OracleDAO 와 설정만 다르게 연결하여 실습 진행
     → MSSQL 서버가 구축되어 있지 않기 때문에...
   - IDAO 인터페이스를 구현하는 클래스 ++++++++++++++
=====================================================*/
package com.test.spr;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class MssqlDAO implements IDAO
{
	
	@Override
	public List<MemberDTO> list() throws ClassNotFoundException, SQLException
	{
		List<MemberDTO> result = new ArrayList<MemberDTO>();
		
		// 데이터베이스 연결
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection conn = DriverManager.getConnection
				("jdbc:oracle:thin:@211.238.142.171:1521:xe", "scott", "tiger");
		
		// 쿼리문 준비 및 실행
		
		String sql = "SELECT ID, NAME, TEL, EMAIL FROM TBL_MEMBERLIST";
		
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery(sql);
		
		// 결과 집합을 컬렉션에 추가
		
		while(rs.next())
		{
			MemberDTO dto = new MemberDTO();
			
			dto.setId(rs.getString("ID"));
			dto.setName(rs.getString("NAME"));
			dto.setTel(rs.getString("TEL"));
			dto.setEmail(rs.getString("EMAIL"));
			
			result.add(dto);
			
		}
		
		// 리소스 반납
		rs.close();
		stmt.close();
		
		// 데이터베이스 연결 종료
		if (!conn.isClosed())
			conn.close();
		
		return result;
	}

}

MemberList.java

 

/*===========================================
    MemberList.java
    - DAO 객체를 참조하는 클래스
    - 의존관계 설정
    - 리스트 출력(print()) 메소드 구현
    - 기존 코드의 일부 내용 제거 
===========================================*/

// [프로젝트명 우클릭 → Build Path → Libraries → Add External Jars]

package com.test.spr;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MemberList
{
	// 처음 연결하는 객체 정보(OracleDAO)				→ 삭제
	/*
	private OracleDAO dao;
	
	
	public MemberList()
	{
		// MemberList 입장에서의 의존 객체 OracleDAO
		dao = new OracleDAO();
	}
	*/
	
	// 두 번째 연결하는 객체 정보(MssqlDAO)				→ 삭제
	/*
	private MssqlDAO dao;
	
	
	public MemberList()
	{
		// MemberList 입장에서의 의존 객체 OracleDAO
		dao = new MssqlDAO();
	}
	*/
	
	
	
	
	// ※ 스프링 IoC/DI 패턴 적용
	
	// check~!!!
	// 멤버 변수를 추가하는 과정에서 데이터타입은 인터페이스 형식
	// DI 를 위한 추가 작업 
	private IDAO dao;
	
	// check~!!!
	// setter 추가
	public void setDao(IDAO dao)
	{
		this.dao = dao;
	}

	// 리스트 출력(print()) 메소드 구현					→ 수정내용 없음, 그대로 사용
	public void print()
	{
		try
		{
			for (MemberDTO dto : dao.list())
			{
				System.out.printf("%14s %4s %15s %15s%n"
						, dto.getId(), dto.getName()
						, dto.getTel(), dto.getEmail());
			}
			
		} catch (Exception e)
		{
			System.out.println(e.toString());
		}
		
	}
}

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

	<!-- XML 파일 샘플 주소 -->
	<!-- 『C:\s-f-3.0.2-with-docs\docs\spring-framework-reference\pdf』 -->
	
	
	<!-- ※ 스프링이 제공하는 환경 설정 XML 파일 샘플 활용 -->
	<!--     → 스프링이 생성하고 관리해야 할 객체들에 대한 정보 전달 -->
	
	<!-- step 3. -->
	<!-- OracleDAO(DAO) 객체에 대한 정보를 전달 -->	
	<!-- → 필요한 경우 스프링이 이를 확인해서 생성하고 유지 및 관리 -->
	<bean id="oracleDao" class="com.test.spr.OracleDAO"></bean>

	<!-- MssqlDAO(DAO) 객체에 대한 정보를 전달 -->	
	<!-- → 필요한 경우 스프링이 이를 확인해서 생성하고 유지 및 관리 -->
	<bean id="mssqlDao" class="com.test.spr.MssqlDAO"></bean>
	


	<!-- step 1. -->
	<!-- MemberList 클래스에 대한 객체 정보를 전달 -->
	<!-- → 필요한 경우 스프링이 이를 확인해서 생성하고 유지 및 관리 -->
	<!-- <bean id="member" class="com.test.spr.MemberList"></bean> -->
	
		
	<!-- step 2. -->
	<!-- 그런데.. MemberList 클래스의 경우 -->
	<!-- 의존 객체에 대한 주입이 필요한 상황 -->
	
	
	<!-- step 4. -->
	<bean id="member" class="com.test.spr.MemberList">
	
		<!-- step 5. -->
		<!-- bean 을 구성하는 과정에서 property 에 객체를 주입할 수 있도록 처리 -->
		<!--                           ========    ====                         -->
		<!--                             dao        oracleDAO 또는 mssqlDAO     -->
		
		<!-- <property name="dao" ref="oracleDao" /> -->
		
		<!-- property 를 확인한 스프링은 -->
		<!-- 여기에 값을 전달할 수 있도록 알아서 setter 를 찾아 호출~!!! -->
		<property name="dao">

			<!-- <ref bean="oracleDao" /> -->
			<ref bean="mssqlDao" />
			
		</property>
		
	</bean>
	
	
	
	
</beans>

 


 

Main.java

 

/*================================================
   Main.java
   - main() 메소드를 포함하는 테스트 클래스
=================================================*/
package com.test.spr;

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

public class Main
{
	public static void main(String[] args)
	{
		
		//MemberList member = new MemberList();
		//-- 객체 생성 과정을 스프링이 담당하게 되므로
		//  우리가 직접 작성했던 인스턴스 생성구문 삭제~!!!
		
		// 스프링 환경 설정 파일로 만든 『applicationContext.xml』 에서
		// MemberList 클래스 기반의 객체를 얻어올 수 있도록 처리~!!!
		
		//GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationContext");
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		
		MemberList member = context.getBean("member", MemberList.class);
		
		member.print();
	}
}