-
[Spring] 002. 관찰 실습(2) : DB연동, Oracle 암호화/복호화SsY 2023. 6. 27. 12:21728x90
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