ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 002. 관찰 실습(2) : DB연동, Oracle 암호화/복호화
    SsY 2023. 6. 27. 12:21
    728x90
    SpringPrj03
    ■■■ 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 역할 → 실습 진행 간 계정 설정만 다르게 연결
          (다양한 DB 연결을 할 수 있도록 진행 -> 실습환경상 Oracle 밖에 없어 위와 같이 진행)
       5. MemberList.java              → DAO 클래스를 참조하는 클래스
                                          의존관계 설정, print() 메소드 구현 
       6. Main.java                    → 클래스
                                          main() 메소드를 포함하는 테스트 클래스
    • SQL 구성
    • 암호화/복호화 _ SYS 계정
    더보기

    C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin

    에서 『dbmsobtk.sql』 과 『prvtobtk.plb』  두 가지 파일 있는지 확인

    더보기
    SELECT USER 
    FROM DUAL;
    --==>> SYS
    
    --■■■ 암호화 복호화 ■■■--
    -- '가나다' → '!@#' → '가나다' --// 규칙을 가지고 암호화/복호화 하는 경우
    -- (은행)인증서 + 암호           --// 별도의 정해진 키 값을 가지고 암호화/복호화 하는 경우
    --// 키가 2개 이상일 수도 있고, 에스크로가 들어가서 정보를 확인하는 절차를 거치는 방법들도 있다.
    
    -- 1. 오라클 암호화 기능을 사용하기 위해서는
    --    『DBMS_OBFUSCATION_TOOLKIT』 패키지를 이용할 수 있다.
    --    (관련 패키지를 활용하지 않고, 암호화 복호화 알고리즘을 직접만들어 구현할 수도 있다.)
    
    -- 2. 『DBMS_OBFUSCATION_TOOLKIT』패키지는
    --    기본적(default)으로는 사용할 수 없는 상태로 설정되어 있으므로
    --    이 패키지를 사용하기 위해서는
    --    이 패키지를 별도로 설치하는 과정이 필요하다.
    --    이를 위해... 『dbmsobtk.sql』 과 『prvtobtk.plb』 파일을 찾아 실행해야 한다.
    
    -- ※ 해당 파일이 존재하는 경로
    @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 타입을 Enccrypt/Decrypt 할 수 있는 2개의 프로시저
    --    (다른 타입은 지원하지 않기 때문에 NUMBER 와 같은 타입을 처리해야할 경우 TO_CHAR() 이용)
    
    -- ※ RAW, LONG RAWM ROWID 타입
    --    그래픽 이미지나 디지털 사운드 등을 저장
    --    HEXA-DECIMAL(16진수) 형태로 RETURN
    --    이 중 RAW 는 VARCHAR2 와 유사하다
    --    LONG RAW 는 LONG 과 유사하지만 다음과 같은 제한사항이 있다. 
    --    ·저장과 추출만 가능하고, DATA 를 가공할 수 없다,
    --    ·LONG RAW 는 LONG 과 같은 제한 사항을 갖는다.
    
    
    -- ○ 해당 패키지를 사용할 수 있도록 권한 부여
    GRANT EXECUTE ON DBMS_OBFUSCATION_TOOLKIT TO SCOTT;
    --==>> Grant을(를) 성공했습니다.
    --> SCOTT 계정으로 DBMS_OBFUSCATION_TOOLKIT 패키지의 프로시저를 사용할 수 있도록 권한부여
    
    GRANT EXECUTE ON DBMS_OBFUSCATION_TOOLKIT TO PUBLIC;
    --==>> Grant을(를) 성공했습니다.
    --> PUBLIC 으로 DBMS_OBFUSCATION_TOOLKIT 패키지의 프로시저를 사용할 수 있도록 권한 부여

    • 암호화/복호화_SCOTT 계정
    더보기
    DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT(a,b,c);
                             ==========
                             v1, v2, v3, v4
                              a   b   c
    -- 위의 프로시저를 실행시키면 매개변수 하나가 모자라게 전달되게 된다.
    DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT(v1=>b, v2=>c, v4=>a);
                             ==========
                             v1, v2, v3, v4
                              b   c       a
    -- 특정한 변수에 값을 넘겨줄 때 이러한 방식으로 전달이 가능하다.
    
    
        FUNCTION ENCRYPT(STR VARCHAR2, HASH VARCHAR2)
        RETURN VARCHAR2
        IS
            PIECES_OF_EIGHT NUMBER := ((FLOOR(LENGTH(STR)/8 + .9)) *8);
        BEGIN
            DBMS_OBFUSCATION_TOOLKIT.DESENCRYPT
            ( INPUT_STRING     => RPAD(STR, PIECES_OF_EIGHT)
            , KEY_STRING       => RPAD(HASH, 8, '#')
            , ENCRYPTED_STRING => CRYPTED_STRING
            );
    
    	/*
    	(v1=>b, v2=>c, v4=>a)
    	*/
    	/*
    	(INPUT_STRING     => RPAD(STR, PIECES_OF_EIGHT
    	, KEY_STRING       => RPAD(HASH, 8, '#')
    	, ENCRYPTED_STRING => CRYPTED_STRING)
    	*/
        END;
    더보기
    SELECT USER
    FROM DUAL;
    --==>> SCOTT
    
    --(현재 SCOTT 으로 연결된 상태)
    
    -- ○ 패키지 선언(CRYPTPACK)
    CREATE OR REPLACE PACKAGE CRYPTPACK
    AS
        -- 암호화 함수 패키지 구성
        FUNCTION ENCRYPT(STR VARCHAR2, HASH VARCHAR2)
        RETURN VARCHAR2;
        
        -- 복호화 함수 패키지 구성
        FUNCTION DECRYPT(XCRYPT VARCHAR2, HASH VARCHAR2)
        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
            PIECES_OF_EIGHT NUMBER := ((FLOOR(LENGTH(STR)/8 + .9)) *8);
        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 VARCHAR2)
        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이(가) 컴파일되었습니다.

    • 테스트
    더보기
    SELECT USER
    FROM DUAL;
    --==>> SCOTT
    
    
    --■■■ 암호화 복호화 확인실습 ■■■--
    
    CREATE TABLE TBL_EXAM
    ( ID    NUMBER
    , PW    VARCHAR2(20)
    );
    --==>> Table TBL_EXAM이(가) 생성되었습니다.
    
    --○ 데이터 입력(비 암호화)
    INSERT INTO TBL_EXAM(ID,PW) VALUES(1,'abcd1234');
    --==>> 1 행 이(가) 삽입되었습니다.
    
    --○ 확인
    SELECT *
    FROM TBL_EXAM;
    --==>> 1	abcd1234
    
    --○ 롤백
    ROLLBACK;
    --==>> 롤백 완료.
    
    --○ 기존 레코드 제거
    DELETE
    FROM TBL_EXAM;
    --==>> 1 행 이(가) 삭제되었습니다.
    
    --○ 커밋
    COMMIT;
    --==>> 커밋 완료.
    
    --○ 다시 데이터 입력(암호화)
    INSERT INTO TBL_EXAM(ID,PW) VALUES(1, CRYPTPACK.ENCRYPT('abcd1234','0626'));
    --==>> 1 행 이(가) 삽입되었습니다.
    
    --○ 확인
    SELECT *
    FROM TBL_EXAM;
    --==>> 1	��V
    
    --○ 데이터 조회(복호화)
    SELECT ID, CRYPTPACK.DECRYPT(PW,'1111') AS PW
    FROM TBL_EXAM;
    --==>> 1	�3?�
    
    SELECT ID, CRYPTPACK.DECRYPT(PW,'1234') AS PW
    FROM TBL_EXAM;
    --==>> 1	���
    
    SELECT ID, CRYPTPACK.DECRYPT(PW,'0626') AS PW
    FROM TBL_EXAM;
    --==>> 1	abcd1234

    • SpringPrj03_scott.sql
    SELECT USER
    FROM DUAL;
    --==>> SCOTT
    
    SELECT *
    FROM TBL_MEMBERLIST;
    
    -- ○ 테이블 생성
    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이(가) 생성되었습니다.
    
    --○ 데이터 입력(암호화 패키지 사용)
    INSERT INTO TBL_MEMBERLIST(ID,PW,NAME,TEL,EMAIL)
    VALUES('admin', CRYPTPACK.ENCRYPT('java002$','admin'), '관리자', '010-1234-1234', 'admin@test.com');
    --> 한 줄 구성
    INSERT INTO TBL_MEMBERLIST(ID,PW,NAME,TEL,EMAIL) VALUES('admin', CRYPTPACK.ENCRYPT('java002$','admin'), '관리자', '010-1234-1234', 'admin@test.com')
    ;
    --==>> 1 행 이(가) 삽입되었습니다.
    
    --○ 확인
    SELECT *
    FROM TBL_MEMBERLIST;
    --==>> admin	��a�	관리자	010-1234-1234	admin@test.com
    
    --○ 커밋
    COMMIT;
    --==>> 커밋 완료.
    
    --○ 기본 리스트 조회 쿼리문 구성
    SELECT ID, NAME, TEL, EMAIL
    FROM TBL_MEMBERLIST;
    --> 한 줄 구성
    SELECT ID, NAME, TEL, EMAIL FROM TBL_MEMBERLIST
    ;
    --==>> admin	관리자	010-1234-1234	admin@test.com
    
    --○ 데이터 추가 입력(원격 접속 실습을 위한 준비 - 사전 환경 구성)
    INSERT INTO TBL_MEMBERLIST(ID, PW, NAME, TEL , EMAIL)
    VALUES('amber',CRYPTPACK.ENCRYPT('java002$','amber'),'AMBER', '010-5945-8356', 'amber@test.com');
    --==>> 1 행 이(가) 삽입되었습니다.
    
    --○ 커밋
    COMMIT;
    --==>> 커밋 완료.

    • Eclipse
    • 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 // MssqlDAO.java
      - 바람직하진 않지만 connection 별도 구성 X 그대로 DAO 에 사용하는 방법
    /*==================================================
       OracleDAO.java
       - DAO 역할
       - MssqlDAO 와 설정만 다르게 연결하여 실습진행
         → MSSQL 서버를 별도 구축X ...
    =================================================== */
    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.49:1521:xe", "scott", "tiger");
    		
    		// 쿼리문 준비 및 실행(SELECT)
    		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;
    	}// end List<MemberDTO> list()
    }

    • MemberList.java
    /*=================================
       MemberList.java
       - DAO 클래스를 참조하는 클래스
       - 의존 관계 설정
       - print() 메소드 구현
    ================================== */
    
    package com.test.spr;
    
    public class MemberList
    {
    	// IOC/DI 적용 전
    	
    	/*
    	// 처음 연결하는 클래스 정보
    	private OracleDAO dao;
    	
    	public MemberList()
    	{
    		//MemberList 입장에서의 의존객체 OracleDAO
    		dao = new OracleDAO();
    	}
    	*/
    	// 두번째 연결하는 클래스 정보
    	private MssqlDAO dao;
    	
    	public MemberList()
    	{
    		//MemberList 입장에서의 의존객체 MssqlDAO
    		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());
    		}
    	}
    	
    }
    더보기

    IoC/DI 를 적용시키기 위해서는 Interface 필요


    • Main.java
    /*===========================================
       Main.java
       - main() 메소드를 포함하는 테스트 클래스
    ============================================ */
    
    package com.test.spr;
    
    public class Main
    {
    	public static void main(String[] args)
    	{
    		// 인스턴스 직접 생성
    		MemberList member = new MemberList();
    		
    		// 핵심적으로 수행해야 할 업무
    		member.print();
    	}
    }

    SpringPrj04
    ■■■ IoC/DI 실습 04 ■■■
    ※ 스프링 프레임워크 IoC/DI 개념 실습
    ○ 실습 성격 및 주요사항
       1.콘솔 프로젝트
       2.데이터베이스 연동 프로젝트 구성
       3.오라클 암호화/복호화 적용
       
    ○ 물리적 파일 구성
       1. SpringPrj03_scott.sql	   → 데이터베이스 관련 준비
       2. MemberDTO.java               → DTO 역할 (TBL_MEMBERLIST 테이블 레코드 참조)
       3. OracleDAO.java               → DAO 역할 → 실습 진행 간 계정 설정만 다르게 연결
       4. MssqlDAO.java                → DAO 역할 → 실습 진행 간 계정 설정만 다르게 연결
          (다양한 DB 연결을 할 수 있도록 진행 -> 실습환경상 Oracle 밖에 없어 위와 같이 진행)
       5. MemberList.java              → DAO 클래스를 참조하는 클래스
                                          의존관계 설정, print() 메소드 구현 
       6. Main.java                    → 클래스
                                          main() 메소드를 포함하는 테스트 클래스
    
    ○ 이전 실습(IoC/DI 실습 03) 과 비교하여 추가적으로 필요한 파일
       7. IDAO.java                    → 인터페이스
       8. applicationContext.xml       → 스프링 환경 설정 파일
                                          객체 생성 구문 및 DI 설정 구문 구성
                                          
    ※ 라이브러리 등록
       - 경로 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\com.springsource.org.apache.commons.logging\1.1.1
         · 파일 6: com.springsource.org.apache.commons.logging-1.1.1.jar
         (※오라클 연동 JDBC)
       - 경로 3 : C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
         · 파일 7: ojdbc6.jar
    • SQL
    • SpringPrj03_scott.sql  : 03번과 동일

    • ECLIPSE
    • MemberDTO.java : 03 번과 동일

    • 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  / MssqlDAO.java
    /*=================================================
       OracleDAO.java
       - DAO 역할
       - MssqlDAO 와 설정만 다르게 연결하여 실습 진행 
       - IDAO 인터페이스를 구현하는 클래스               ※ check 
    ==================================================*/
    
    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.49: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
    {
    	// IOC/DI 적용 전
    	/*
    	// 처음 연결하는 클래스 정보
    	private OracleDAO dao;
    	
    	public MemberList()
    	{
    		//MemberList 입장에서의 의존객체 OracleDAO
    		dao = new OracleDAO();
    	}
    	*/
    	// 두번째 연결하는 클래스 정보
    	/*
    	private MssqlDAO dao;
    	
    	public MemberList()
    	{
    		//MemberList 입장에서의 의존객체 MssqlDAO
    		dao = new MssqlDAO();
    	}
    	*/
    
    	// ※ 스프링 IoC/DI 패턴 적용
    	
    	//private 김향안 향안이;
    	//private 김환기 환기;
    	//             ↓
    	//private 사람 라흐헤스트인물;
    	
    	// 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());
    		}
    	}
    	
    }

    • Main.java
      - 인스턴스를 Spring 이 생성
    /*============================================================
      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)
       {     
          //MemberList member = new MemberList();
          //-- 객체 생성 과정 및 관리를 스프링이 담당하게 되므로
          //   인스턴스 생성 구문 삭제~!!!
          
          // 스프링 환경 설정 파일로 만든 applicationContext.xml 에서
          // MemberList 클래스 기반의 객체를 얻어올 수 있도록 코드 구성
          ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
          
          MemberList member = context.getBean("member",MemberList.class);
          
          // 수행해야하는 업무
          member.print();
       }
    }

    • applicationContext.xml
      - Spring 이 작업을 하기 위한 bean 객체와, 사용해도 된다는 설명서를 기술
    <?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 파일 샘플
    			   → 스프링이 생성하고 관리해야 할 객체들에 대한 정보 전달 
    		-->
    		
    		<!-- OracleDAO 클래스에 대한 객체 정보를 전달 -->
    		<!-- → 필요한 경우 스프링이 이를 확인해서 객체를 생성하고 유지 및 관리 -->
    		<bean id="oracleDAO" class="com.test.spr.OracleDAO"></bean>
    		
    		<!-- MssqlDAO 클래스에 대한 객체 정보를 전달 -->
    		<!-- → 필요한 경우 스프링이 이를 확인해서 객체를 생성하고 유지 및 관리 -->
    		<bean id="mssqlDAO" class="com.test.spr.MssqlDAO"></bean>
    		
    		<!-- MemberList 클래스에 대한 객체 정보를 전달 -->
    		<!-- → 필요한 경우 스프링이 이를 확인해서 객체를 생성하고 유지 및 관리 -->
    		<!-- <bean id="member" class="com.test.spr.MemberList"></bean> -->
    		
    		<!--
    			→ 그런데 MemberList 객체의 경우,
    			   위에서 독립적으로 생성할(생성한) DAO 관련 객체들과 달리
    			   의존 객체에 대한 주입이 필요한 상황
    		-->
    
    		<bean id="member" class="com.test.spr.MemberList">		
    			<!--
    				bean 을 구성하는 과정에서 property(dao)에 객체(oracleDAO 또는 mssqlDAO)를 주입할 수 있도록 처리
    			-->			
    			<!-- property 를 확인한 스프링은 여기에 값을 전달할 수 있도록 알아서 setter 를 찾아서 호출 -->
    			<property name="dao">
    				<!-- 주입 -->
    				<ref bean="oracleDAO"></ref>
    			</property>			
    		</bean>
    </beans>
    728x90

    'SsY' 카테고리의 다른 글

    [Spring] 004. AOP 의 관찰 (2) : AOP Advice  (0) 2023.06.29
    [Spring] 003. AOP 의 개요  (0) 2023.06.28
    [Spring] 001. Spring Framework 개요  (0) 2023.06.23
    [AJAX] 002. AJAX 관찰 실습(2)  (0) 2023.06.15
    [AJAX] 001. AJAX 의 개요  (0) 2023.06.14
Designed by planet-si