Statement vs PreparedStatement
1. SQL 동작 방식
1) 쿼리 문장 분석
2) 컴파일
3) 실행
2. Statement
1) Statement
String sqlstr = "SELECT name, memo FROM TABLE WHERE num = " + num
Statement stmt = conn.credateStatement();
ResultSet rst = stmt.executeQuerey(sqlstr);
Statement executeQuery()나 executeUpdate() 를 실행하는 시점에 파라미터로 SQL문을 전달하는데, 이 때 전달되는 SQL 문은 완성된 형태로 한눈에 무슨 SQL 문인지 파악하기 쉽다. 하지만, Statement는 SQL문을 수행하는 과정에서 매번 컴파일을 하기 때문에 성능 문제가 있다.
2) Statement를 사용하는 상황
SQL 쿼리를 한 번만 실행하려는 경우 Statement 인터페이스를 사용한다. Dynamic SQL을 사용하게 될 경우, 매번 조건절이 틀려져 캐싱의 장점이 사라지기 때문에 Statement를 사용하는 것이 더 낫다.
3. PreparedStatement
1) PreparedStatement
String sqlstr = "SELECT name, memo FROM TABLE WHERE num = ? "
PreparedStatement stmt = conn.prepareStatement(sqlstr);
pstmt.setInt(1, num);
ResultSet rst = pstmt.executeQuerey();
PreparedStatement는 준비된 Statement로 여기서 준비는 컴파일(Parsing) 을 이야기하며, 컴파일이 미리 되어있기 때문에 Statement 에 비해 성능상 이점이 있다. PreparedStatement는 보통 조건절과 함께 사용되며 재사용이 되는데, ? 부분에만 변화를 주어 지속적으로 SQL을 수행하기 때문에 한눈에 어떤 SQL문인지 파악하기에는 어렵움이 있다.
2) PreparedStatement를 사용하는 상황
Statement를 사용하면 매번 쿼리를 수행할 때마다 계속적으로 단계를 거치면서 수행하지만 PreparedStatement는 처음 한 번만 SQL 동작방식의 3단계를 거친 후 캐시에 담아 재사용한다. 따라서 동일한 쿼리를 반복적으로 수행한다면 PreparedStatement가 DB에 보다 적은 부하를 주며, 좋은 성능을 보인다. 더불어 사용자 입력 값으로 쿼리문을 실행하는 경우에도 PreparedStatement가 더 유리한데 이는pared Statement가 특수 기호가 들어오더라도 알아서 파싱해주므로 이로 인한 오류를 막을 수 있다.
4. Statement 와 PreparedStatement 비교
Statement | PreparedStatement |
SQL 문이 한 번 실행될 경우 사용 | SQL 문이 여러 번 실행될 경우 사용 |
런타임에 매개변수 전달 불가능 | 런타임에 매개변수 전달 가능 |
DDL문에 사용 (CREATE, ALTER, DROP, TRUNCATE) |
모든 SQL 쿼리에 사용 |
성능이 낮음 | Statement 보다 비교적 성능이 높음 |
일반 SQL 쿼리 실행시 사용 | 동적 SQL 쿼리 실행시 사용 |