Everything has an expiration date
[Spring] 20240108 [프로그램 소스] 본문
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();
}
}
'[Spring] > Program source (Spring)' 카테고리의 다른 글
[SpringMVC] 20240110 [프로그램 소스] (2) | 2024.01.10 |
---|---|
[Spring] 20240109 [프로그램 소스] (1) | 2024.01.09 |
[Spring] 20240105 - [프로그램 소스] (0) | 2024.01.07 |