Another Brain

23일차(6월 18일)_ JDBC Programming 2 , Pattern 본문

P/SQL

23일차(6월 18일)_ JDBC Programming 2 , Pattern

뉸누나ㄴ나 2021. 6. 18. 20:21

## Design Pattern : JDBC 패턴 프로그래밍 

## MVC Pattern
=> Model : Business Logic, DAO, DTO 클래스
=> View : Presentation Logic, UI(CUI, GUI)
=> Controller : 요청제어 클래스


## Controller 클래스의 역할 및 절차
1. 요청 파악 : 회원가입요청, 로그인요청 등
2. 요청 데이터 가져오기
3. 요청 데이터 검증
4. Model에게 요청 처리의뢰
5. 요청결과(응답) 받아서 응답화면 제어(이동)


## DTO Pattern : Data Transfer Object
=> 데이터를 가지고 n/w 통해서 이동하는 객체
=> 테이블당 한개의 클래스로서 테이블의 구조참조
=> 컬럼 매핑되도록 멤버변수 선언
=> 설계규칙: encapsulation, 직렬화객체(implements java.io.Serializable)


## DAO Pattern : 
=> Dat Access Object
=> 데이터베이스에 대한 crud 로직 구현 클래스
=> 테이블 스키마와 매핑되게 작성
=> Singleton pattern 적용해서 설계


## Singleton Pattern
=> 하나의 클래스에 대해서 단일객체(single instance) 사용
=> 규칙 :
1. private 생성자
2. public static 클래스이름 getInstance() {
return instance;
}
3. private static 클래스이름 instance = new 클래스이름();

=> 사용 :Singleton Pattern 클래스 사용
클래스이름 instance = 클래스이름.getInstance();

=> [실급] DeptDao 클래스에 singleton pattern 적용해서 변경하세요.


## Factory Pattern
-- DAO Pattern (Singleton Pattern)
-- connection 반환 메서드
-- colose 자원해제 메서드

-- 클래스이름 : FactoryDao
-- 1. jdbc property : driver, url, user, password
-- 2. 생성자 : driver 로딩
=> singleton pattern 
=> instance 변수
=> getInstance() 메서드
-- 3. getConnection() : Connection
-- 4. 자원해제
=> insert, update, delete(cud) : Statement/PreparedStatement, Connection
=> select : ResultSet, Statement/PreparedStatement, Connection
=> close(Statement, Connnection)
=> close(ResultSet, Statement, Connnection)


## JDBC 프로그래밍 절차 ##

1. JDBC driver 로딩
2. db 서버연결 : url, user, password  => Connection
3. 연결된 서버와 통로 개설 => Statement, PreparedStatement, CallableStatement
4. 통로이용 sql 실행 요청
5. 실행결과 처리
6. 자원해제


## JDBC 관련 property : driver, url db벤더에서 결정
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";

또는       = "jdbc:oracle:thin:@localhost:1521:XE";
String user = "계정이름";
String password = "계정비밀번호";


## JDBC 프로그래밍 절차 : java.sql.* ##
1.
Class.forName(driver);
throws ClasNotFoundException 처리

2. 
-- JDBC 관련 : throws SQLException 처리
Connection conn = DriverManager.getConnection(url, user, password);

3. 
// 동적 sql 수행 통로 : 실행시에 CRUD sql 지정
Statement stmt = conn.createStatement();

// 정적 sql 수행 통로 : 통로 개설시에 sql 전용 지정 => 실행시에 값을 설정한 후에 실행 요청
PreparedStatement stmt = conn.prepareStatement("insert int table values(?, ?,?)");

4. C, R, U, D
// C U D => 레코드 추가, 변경, 삭제 => 수행결과 적용된 레코드 수 반환
int rows = stmt.executeUpdate(sql);

// R => 조회 => 결과 여러개(0~n) 반환
ResultSet rs = stmt.executeQuery(sql);

// 기타등등 : ddl ==> 직접 어플리케이션에서 ddl 목적으로 사용하지는 않음(보안문제)
boolean result = stmt.execute(sql);
 
5. select 결과처리 : ResultSet
-- next():boolean => 다음 cursor 이동 => 레코드 결과존재 유무 및 커서이동
-- 현재 커서(레코드)의 컬럼단위로 데이터 추출 : getXxx(조회컬럼인덱스번호), getXxx("컬럼명")
-- 자바는 인덱스 시작이 0번부터 이지만, DB는 인덱스가 1번부터 시작 *****
-- DB 숫자 => getInt(String):int , getInt(int):int
-- DB 문자 => getString()
-- DB date => getString() / getDate()
-- String => char ===> charAt(index번호) : char

6. 
rs.close();
stmt.close();
conn.close();


## test

## 사용자 데이터 입력 

문자열 => sql문자열 변환메서드 =
public String covertSqlString(String data) {

}


TIP

>> ERROR : Cannot invoke close() on the primitive type int

Line 406 - rs.close(); =>rows.close();  : 오류 

Line 406 - 삭제 : 해결

rows가 이미 반환되어 끝났기 때문

>> ERROR : Type mismatch: cannot convert from Statement to PreparedStatement

Line 66 - PreparedStatement => Statement : 해결

 

## spring 프레임워크를 할 때 이해를 돕기 위해 패턴에 대해 알고있어야함.

Comments