com.eomcs.jdbc.ex2.Exam0110.java

ResultSet : 결과를 가져오는 도구

rs.next() : 레코드를 한 개 가져온다

on delete cascade

부모 테이블의 데이터를 삭제하면 참조하는 자식 테이블 데이터도 삭제한다

근데 이거 위험한 거임

게시글 관리 JDBC 프로그래밍

09-JDBC프로그래밍 / 50 페이지

Exam0110 ---call---> JDBC Driver

🔹 문제점
① DB 연결 정보 변경
② 테이블명, 컬럼명 변경
③ DBMS 변경 → SQL 변경
⇒ 관련 클래스를 모두 변경해야 한다.

DB 연결 정보 바뀌면 소스코드 계속 변경해야 됨

컬럼 이름 바꾸면 소스코드 바꿔줘야 됨

Oracle은 자동 증가 옵션 없음
sequence.NEXTVAL

게시글 관리 JDBC 프로그래밍 - DAO 객체 도입

09-JDBC프로그래밍 / 51 페이지

BoardDao ---call---> JDBC Driver ---SQL---> DBMS

얘가 내부적으로 JDBC Driver에 들어 있는 메서드를 호출해서 SQL

DAO (Data Access Object) : 데이터 처리를 전담하는 객체

🔹 BoardDao
① DB 연결 정보 변경
② 테이블명, 컬럼명 변경
③ DBMS 변경 → SQL 변경
=> 오직 DAO 클래스만 변경하면 된다
=> 유지보수가 쉬워진다

Board 라는 도메인 객체 이용

도메인 객체 (예: Board)
=> 두 객체 사이에 데이터를 실어 나르는 역할을 한다고 해서
"DTO(Data Transfer Object)"라고도 부른다.
=> 두 객체 사이에 전달되는 값을 표현한다고 해서
"VO(Value Object)"라고도 부른다.

DTO = Domain Object = Value Object

09-JDBC프로그래밍 / 52 페이지

3가지 의미를 포함
데이터를 주고 받는 데 사용 -> Data Transfer Object (DTO)
값을 담는 용도 -> Value Object (VO)
업무용 데이터 -> Domain Object (DO)

자바 변수명에 _ (underscore) 적지 말기
board_id (X)

List 인터페이스

이번 프로젝트에서 on delete cascade 로 할지 그건 팀끼리 정하기

SQL 삽입 공격

한 번에 4개 등록

디도스 공격

createStatement()

prepareStatement()

PreparedStatement stmt = con.prepareStatement("insert into x_board(title,contents) values(?,?)")) {

PreparedStatement : In-parameter

09-JDBC프로그래밍 / 53 페이지

insert into x_board(title,contents) values(?,?)
                                           ↑ ↑
                                       in-parameter

in-parameter에 들어갈 값

      stmt.setString(1, title);
      stmt.setString(2, contents);

setString ← 컬럼의 타입
in-parameter 순번 (1부터 카운트)

실행할 때 SQL문을 주지 않는다

값과 SQL을 분리해서 처리

무조건 prepareStatement() + in-parameter 쓰기

행안부 시큐리티 코딩 가이드

https://www.mois.go.kr/frt/bbs/type001/commonSelectBoardArticle.do%3Bjsessionid=fr7QaTyG2gK5o02XJnYETp3havIQ1MGLKMYdWaaEe5me9IOk932SIy2BbP1AM08Z.mopwas54_servlet_engine1?bbsId=BBSMSTR_000000000012&nttId=42152

com.eomcs.jdbc.ex3.Exam0220.java
Statement vs PreparedStatement

sql문과 변수를 사용해서 직접 sql문을 만들기 때문에 작성하거나 읽기가 힘들다

PreparedStatement을 써야 되는 이유를 알고 있는가

SQL 삽입 공격
바이너리 데이터

PK 여러 개

DBMS는 동시에 여러 명이 접속하기 때문에 가장 큰 숫자로 불러오면 안 됨

PK 값이 자동 증가하는 부모 테이블에 값을 집어넣고
그 PK 값을 이용해서 자식 테이블에 값을 집어넣어야 하는 상황에서 사용하기

그 다음에 에러가 뜨든 말든 테이블에 적용
그러다보니 첨부파일 등록하다가 실패하면 게시글을 등록하지 말아야 되는 상황도 있음
첨부파일 입력하다가 에러가 나면 게시글 등록을 취소해주세요
주문 할 때 결제가 성공해야지 주문이 완료되는 거

자식 테이블은 실패했는데도 불구하고 게시글은 등록됨
이렇게 해도 되는 경우가 있고
주문과 결제처럼 주문 데이터를 insert 했는데 결제가 실패하면
주문 데이터를 부모 테이블의 데이터를 취소해야 되는 경우가 있음

커넥션 공유

09-JDBC프로그래밍 / 54 페이지

DB 커넥션도 생성하는데 비용이 많이 소요되는 자원의 하나이다.
‐ 생성 : DBMS와 연결하는데
① 사용자 인증 -> 시간 소요
② 사용 권한 -> 시간 소요
③ 연결자의 정보 유지 (세션 유지) -> 메모리 사용
‐ 비용 : 실행시간, 메모리 사용 등

문제점
필요할 때마다 매번 생성하는 것은 비효율적이다.

해결책
한 번 생성한 객체를 재활용하는 것
예) DB 커넥션, 스레드 등

재활용에서 주의할 점!
재사용 전에 이전 작업 내용을 제거하는 것이 반드시 필요하다!
예) 숟가락 재활용

DB 커넥션 재활용 시 주의할 점

09-JDBC프로그래밍 / 55 페이지

새로 DB 커넥션을 만들지 않고 기존에 존재하는(놀고 있는) DB 커넥션을 사용한다
이전에 작업한 내용을 지우지 않았기 때문에 그대로 남아 있다

기존에 임시 데이터베이스에 남아 있던 찌꺼기 데이터까지 테이블에 저장된다

해결책
재활용되는 DB 커넥션인 경우 오류 발생했을 때 명시적으로 rollback을 수행하여 일시 데이터베이스에 남아 있는 찌꺼기 데이터를 확실히 제거해야 한다

일반 DB 프로그램과 Web App. 프로그램

09-JDBC프로그래밍 / 56 페이지

0개의 댓글