2020-10-30 TIL

1 minute read

JDBC

Statement vs PreparedStatement

Statememt

  • SQL 문법 + 값 -> SQL 문장 -> DBMS 프로토콜에 맞춰 가공 -> 가공된 SQL 문장 -> 전송 -> DBMS와 통신
  • 값을 이용하여 SQL 문을 만들기 때문에 조작이 발생할 수 있다.

PreparedStatement

  • SQL 문법 -> SQL 문장 -> DBMS 프로토콜에 맞춰 가공 -> 가공된 SQL 문장 + 값 -> 전송 -> DBMS와 통신
  • SQL 을 가공한 후에 값을 첨부하기 때문에 SQL 문을 조작할 수 없다.
  • 미리 SQL 문장을 준비하여 값을 삽입하는 기법이다.
  • PreparedStatement stmt = con.prepareStatement(SQL문);
  • 앞은 Prepared, 뒤는 prepare이다.
  • SQL 문을 준비할 때 값이 들어 갈 자리에 ? 로 표시한다.
  • 값이 들어가는 역할을 하는 것(여기서는 ?)을 인 파라미터라고 한다.
  • 서버에 전달하기 위해 in-parameter 자리에 값을 넣는다.
  • PreparedStatement.setXxx(in-parameter 인덱스, 값);
  • setXxx : 컬럼의 타입에 따라 setInt, setDate, setString 등을 사용할 수 있다.
  • In-parameter

Statement vs PreparedStatement 2

  • SQL 공격 :
    • Statement는 가능, PreparedStatement는 불가능.
      • Statement는 값과 함께 SQL 문장을 만들기 때문이다.
  • binaryData 입력 :
    • Statement는 불가능, PreparedStatement는 가능.
      • Statement는 SQL 문과 값을 묶어서 문자열로 표현하기 때문
      • PreparedStatement는 SQL 문과 값이 분리되어 있다.
  • 실행 속도 :
    • Statement는 한번에 반복하여 실행할 경우 매번 SQL 문을 DBMS 프로토콜에 맞게 가공(parsing) 해야 하기 때문에 느릴 수 있다.
    • PreparedStatement는 일단 SQL 문을 DBMS 프로토콜에 맞춰 가공해 둔 다음에 값과 함께 보내기 때문에 한 번에 여러번 반복하여 실행하는 경우 Statement 보다 빠르다.

자식 테이블의 데이터를 함께 입력할 때 문제점

  • 첨부 파일 테이블에 데이터를 입력하려면, 게시글 테이블의 게시글 번호를 알아야 한다.
  • 문제는 바로 위에서 입력한 게시글의 PK가 자동 생성되는 컬럼이기 때문에 입력한 후 그 PK 값이 뭔지 알 수가 없다는 것이다.
  • 그래서 첨부 파일 테이블에 데이터를 입력할 수 없다.
  • 해결책 :
    • 데이터를 입력할 때 자동 생성된 PK 값을 알 수 있다면 이 문제를 해결할 수 있다.
    • PreparedStatement에

auto-commit 의 문제점

프로젝트 (33-b 소스코트를 client에 복사 붙여넣기)

  • 마리아DB가 사용 가능하도록 만든다.
  • DBMS 에 테이블 생성.
  • 데이터 핸들러 리스너에서 데이터를 파일로 저장하고 로드하는 코드를 제거한다.
  • BoardXxxhandler 변경
    • 데이터를 저장하고 꺼낼 때 jdbc API를 사용한다.
    • App 변경(생성자 없음)
  • listcommand 변경
  • try 안에는 auto-closable 변수 선언만 올 수 있다.

Categories:

Updated: