본문 바로가기

Oracle

25일차 공부 Transaction, DTO&DAO, Procedure

1~2 교시

 

시험설명

 

 

3 교시

 

** DEPT 테이블에 대해서 삽입과 조회 작업

1. DEPT 테이블 구조

=> DEPTNO : 숫자 2자리

=> DNAME : 문자 14자리 - 한글 4자

=> LOC : 문자 13자리 - 한글 4자

 

2. Java Project 생성

 

3. 드라이버 설치

=> ojdbc.jar 파일을 프로젝트에 복사

=> 복사한 파일을 선택하고 마우스 우클릭 [build path] - [add to build path] 실행

 

4. main 메소드를 소유한 클래스를 만들고 데이터를 삽입하는 코드를 작성하고 실행

삽입

 

=> 에러 발생시 constraint 단어가 보이면 유일해야하는 데이터 중에 중복 데이터가 있거나 not null이 설정된 열에 데이터를 생략하고 입력하거나 foreign key로 설정된 열에 참조할 테이블에 없는 데이터 등을 삽입한 것인지 확인

=> table or view does not exist : 테이블이 없는 경우

=> SQL 메시지가 보이면 SQL을 잘못 작성한 경우

=> 자료형이맞지 않으면 Invalid 자료형으로 에러 메시지가 출력된다.

 

5. 확인 : 데이터베이스 접속 프로그램에서 실행

=> 삽입한 데이터가 있는지 확인 

select * 

from dept;

 

확인

 

 

 

 

 

 

4 교시

 

 

6. select 작업

=> PreparedStatement 의 executeQuery 메소드로 수행

=> 결과는 ResultSet 타입

1) ResultSet의 next()

=> 다음 데이터가 있으면 그 데이터를 가리키는 곳으로 이동하고 true를 리턴

다음 데이터가 없으면 false를 리턴

if(Resultset.next() == true) {

   조회된 데이터가 있는 것

}else{

   조회된 데이터가 없는 것

}

 

=> 여러 행의 데이터라면 아래처럼 반복문을 이용해서 각각의 행에 접근하는 것이 가능

while(ResultSet.next(){

      행 단위 작업

}

 

2) ResultSet의 get 메소드

=> 열의 값을 가져올 때 사용하는 메소드

get자료형(열이름이나 select 구문의 열 인덱스)로 사용

=> getInt, getDouble, getString, getDate 형태로 만들어져 있다.

=> 모든 열의 값은 getString으로 가져오는 것이 가능

getInt("deptno") : deptno열의 값을 정수로 리턴

getInt(1) : 첫번째 열의 값을 정수로 리턴

getString("dname") : dname 열의 값을 문자열로 리턴

 

3) main 메소드를 소유한 클래스를 만들고 main 메소드에 작성

=> DEPT 테이블

 

 

 

 

4) main 메소드를 만들고 작성

=> deptno(primary ket - not null 이고 unique)를 입력받아서 deptno에 해당하는 데이터를 조회 : 상세보기

컬럼이름으로 조회

 

 

select deptno, round(avg(sal))

from emp

group by deptno;

 

rs.getInt("deptno")

rs.getInt("round(avg(sal))") => rs.getInt("평균급여") => rs.getInt(2)

 

 

7. Transaction

=> 한 번에 처리되어야 하는 작업의 단위

1) 구현 방식

auto-commit : sql 문장이 성공적으로 수행되면 자동으로 commit - 자바의 기본

manual-commit : commit이나 rollback을 명시적으로 호출해야만 commit 되거나 rollback되는 방식

 

2) java에서의 활용

=> 기본적으로 AutoCommit인데 ManualCommit으로 변경하고자 하는 경우에는

Connection.setAutoCommit(false); 호출

=> Commit 이나 Rollback을 하고자 하는 경우에는 Connection.commit() 또는 rollback()을 호출

=> rollback은 작업을 취소하는 명령인데 대두분의 경우는 하나의 거래를 수행하는 도중 예외가 발생하면 rollback을 시킨다.

=> 작업이 정상적으로 완료되면 commit을 호출해서 원본에 작업 내용을 반영한다.

 

 

5 교시

 

1. PROCEDURE

=> 자주 사용하는 SQL문장을 하나의 이름으로 만들어두고 프로그래밍 언어의 메소드처럼 사용하는 것

=> 사용자에게 실제 테이블의 구조를 보여주지 않아도 되서 보안이 향상

=> SQL 문장은 보조기억장치에서 주기억장치로 불러와서 실행해야 하지만 프로시저는 한 번 컴파일되면 주기억장치에 상주한 상태에서 실행되기 때문에 실행 속도도 향상될 수 있다.

=> 프로시저를 만드는 문법은 데이터베이스 종류에 따라 서로 다르다.

Oracle에서 프로시저 만드는 문법은 PL/SLQ 이라고 한다.

 

=> DEPT 테이블에 데이터를 삽입하는 프로시저

Create or Replace procedure insert_dept_proc

(VDEPTNO IN DEPT.DEPTNO%TYPE,

VDNAME IN DEPT.DNAME%TYPE,

VLOC IN DEPT.LOC%TYPE)

is

begin

     insert into dept(deptno, dname, loc)

     values(VDEPTNO, VDNAME, VLOC);

end;

/

 

begin

    insert_dept_proc(01, '기획', '서울');

end;

 

 

 

 

=> 프로시저는 SI 업체와 같은 대기업이나 공공기관 프로젝트를 받아서 하는 기억에 갈 때는 되도록이면 사용

=> Start up이나 중소기업처럼 역할이 분리되지 않은 곳에서는 잘 사용하지 않는다.

 

2. Java에서 프로시저 사용

=> PreparedStatement 대신 CallableStatement 생성

CallableStatement 실행객채변수 = Connection.prepareCall("{call 프로시저이름(?...)}");

실행객체변수.set자료형(물음표 번호, 실제 데이터)...

 

=> 실행은 executeUpdate() 또는 executeQuery

 

3. 앞에서 만든 insert_dept_

 

 

 

 

 

** 데이터베이스 연동 패턴

1. DTO(Date Trandfer Object - Variavle Object, Domain) 패턴

=> 여러 개의 속성을 묶어서 하나로 표현하기 위한 클래스를 DTO 또는 VO라고 한다.

=> 테이블과 매핑되는 클래스를 만들어서 사용하는 패턴 - 이 패턴의 확장이 ORM : SQL 없이 인스턴스만으로 데이터베이스 작업을 수행하도록 해주는 프레임워크

 

2. DAO(Date Access Object)

=> 데이터베이스 작업 만 수행하는 별도의 클래스를 만들어서 사용하는 패턴

=> 이 패턴을 서버에 적용할 대는 특별한 경우가 아니면 Singleton Pattern으로 디자인

 

3. Singleton

=> 객체를 하나만 만들 수 있도록 클래스를 디자인하는 패턴

 

4. Service : 사용자의 요구(Business Logic)를 처리하는 클래스

 

5. Controller : 사용자의 요청을 받아서 필요한 Service를 호출하는 클래스

 

6. View : 클라이언트가 보고 있는 화면

 

 

 

 

 

 

 

 

6 교시

 

** DTO & DAO 패턴을 이용한 CRUD(Create Read Update Delete) 작업

1. 작업에 필요한 샘플 데이터 생성

1) 샘플 테이블을 생성

 - 상품 테이블

 상품 코드 : 영문과 숫자로 이루어진 문자열 10자리 자주 변함, primary key

 상품 이름 : 한글 포함한 20자리 문자열 - 변하지 않음, 필수

 상품 원산지 : 한글 포함한 50자리 문자열 - 변하지 않음, 필수

 상품 가격 : 정수 10 자리 이내 - 기본값 0

 상품 입고일 : 날짜 - 기본값 오늘 날짜

 

 

 

 

 

2. 테이블의 데이터를 표현할 클래스를 자바 프로젝트에 생성

=> 자료형을 정확하게 설정하는 것이 중요하고 필드의 이름과 컬럼의 이름을 매칭을 잘 해주어야 한다.

 

 

public class GoodDAO {
// 싱글톤 패턴 디자인 - 객체를 1개만 생성할 수 있도록 만든 패턴
// 외부에서 생성할 수 없도록 생성자를 private으로
private GoodDAO() {}  // 생성자
// 만들어진 객체의 참조를 저장하기 위한 변수
private static GoodDAO goodDAO = null;
// 객체가 없으면 만들어서 리턴하고 있으면 있는 것을 리턴하도록 객체 사용을 위한 메소드
public static GoodDAO sharedInstance() {
if(goodDAO == null) {
goodDAO = new GoodDAO();
}
return goodDAO;
}

// 전체 데이터를 가져오는 메소드
// select는 where절을 확인해서 매개변수를 생성
// select * from goods;
// List를 리턴할 때는 인스턴스를 만들고 데이터를 추가한 후 리턴
// 여러개의 데이터를 가져올 때는 데이터가 없는 경우 size가 0
public List<Good> allGood() {
List<Good> list = new ArrayList<Good>();


return list;
}

// code를 가지고 데이터를 찾아오는 메소드
// code는 기본키
// select * form goods where code = ?
// 하나의 행만 리턴하는 경우에는 데이터가 없으면 null 을 리턴
public Good getGood (String code){
Good good = null;

return good;

}

// 데이터를 삽입하는 메소드
// 삽입이나 수정은 매개변수가 DTO 아니면 Map
// -1이 리턴되면 실패, 0이 리턴되면 조건에 맞는 데이터가 없음, 양수가 리턴되면 작업을 수행한 것이다.
public int insertGood() {
int result = -1;

return result;
}

}