Statement와 PreparedStatement

김운채·2023년 9월 1일
0

TIL

목록 보기
22/22

자바에서 데이터베이스로 쿼리문을 전송할 때, 사용할 수 있는 인터페이스 2가지가 존재한다.
StatementPreparedStatement이다.

SQL 실행 단계는 다음과 같이 이루어진다.
1) 쿼리 문장 분석 (Parsing)
2) 컴파일 (Compile)
3) 실행 (Execute)

Statement

1) Statement 객체는 Statement 인터페이스를 구현한 객체를 Connection 클래스의 createStatement() 메소드를 호출함으로써 얻어진다.

String sqlstr = "SELECT name, memo FROM TABLE WHERE name =" + num
Statement stmt = conn.createStatement();
ResultSet rst = stmt.executeQuery(sqlstr);

2) Statement 객체가 생성되면 executeQuery() 메소드를 호출하여 SQL문을 실행시킬 수 있다.
메소드의 인수로 SQL문을 담은 Srting 객체를 전달한다.

3) Statement는 정적인 쿼리문을 처리할 수 있다.
즉, 쿼리문에 값이 미리 입력되어있어야한다.

쿼리문을 수행할때마다 파싱->컴파일->실행 이 3단계를 거치니, 성능상 이슈(오버헤드)를 발생시킨다.
또한 실행되는 SQL 문을 확인이 가능하기 때문에, SQL Injection 공격에 취약할 수 있다.

SQL Injection

프로그램의 보안 취약점을 이용해, 악의적인 SQL문을 실행시켜 데이터베이스를 비정상적으로 조작하는 해킹방법이다.


PreparedStatement

1) PreparedStatement 객체는 Connection 객체의 preparedStatement()메소드를 사용해서 생성한다. 이 메소드는 인수로 SQL문을 담은 String 객체가 필요하다.

String sqlstr = "SELECT name, memo FROM TABLE WHERE num = ?"
PreparedStatement stmt = conn.preparedStatement();
stmt.setInt(1, num);
ResultSet rst = stmt.executeQuery(sqlstr);

2) SQL문장이 미리 컴파일되고, 실행 시간동안 인수 값을 위한 공간을 확보할 수 있다는 점에서 Statement 객체와 다르다.

PreparedStatement 는 미리 컴파일 되어있기 때문에 Statement 보다 좋은 성능을 낸다.

각각 인수에 대해 placeholder를 사용하여 SQL문장을 정의할 수 있게 해주며, 위치 홀더는 ? 로 표현된다. "?" <= 부분에만 변화를 주어 쿼리문을 수행하므로 실행되는 SQL문을 파악하기 어렵고, 특수문자를 자동으로 파싱해주어 SQL Injection같은 공격을 막을 수 있다.

0개의 댓글