-
statement vs prepared statement vs callable statement interfaceCS 지식/데이터베이스(Database) 2023. 5. 4. 23:10
SQL 실행 단계
1) Parsing(쿼리 문장 분석)
2) Compile
3) Execute(실행)
https://www.javatpoint.com/query-processing-in-dbms Statement
- used to execute string-based SQL queries
- SQL string을 concatenate 하기 때문에 less readable
public void insert(PersonEntity personEntity) { String query = "INSERT INTO persons(id, name) VALUES(" + personEntity.getId() + ", '" + personEntity.getName() + "')"; Statement statement = connection.createStatement(); statement.executeUpdate(query); }
- SQL injection에 취약
- 데이터베이스로 query with inline values를 넘기기 때문에 query optimization을 하지 않고 database engine이 모든check를 다 해야 함.
- cache 사용 X
- CREATE, ALTER, DROP 같은 DDL(Data Definition Language) query에 적합
(성능은 다른 둘에 비해 가장 낮음. 특정 쿼리를 한번만 실행할 때 선호됨)
- file이나 array를 저장하거나 얻을 때는 활용 불가.
장점
- DDL(CREATE, ALTER, DROP) 작성에 적합.
단점
- cache 활용을 하지 못해 parsing 부분을 매 요청마다 수행하므로 query 처리 비용이 더 들게 됨.
** SQL injection에 취약할 수 있으므로 필터나 방어 로직을 추가하여 사용
Prepared Statement
- used to execute parameterized SQL queries
- PreparedStatement는 Statement interface를 상속받음.
- run time에 parameter를 SQL query로 pass 할 수 있음.
- 다양한 object type들을 bind 하는 메서드가 있음.
- Statement 보다 code를 이해하기 쉬움.
public void insert(PersonEntity personEntity) { String query = "INSERT INTO persons(id, name) VALUES( ?, ?)"; PreparedStatement preparedStatement = connection.prepareStatement(query); preparedStatement.setInt(1, personEntity.getId()); preparedStatement.setString(2, personEntity.getName()); preparedStatement.executeUpdate(); }
- SQL injection으로부터 보호 가능
- pre-compilation 활용. database가 query를 얻자마자 query를 pre-compiling 하기 전에 cache 확인.
cache 되어있지 않으면 database engine은 다음 사용을 위해 캐시에 저장.
- 쿼리 실행 계획 분석과 컴파일이 완료되어서 DBMS의 캐시에 준비되어 있는 쿼리를 사용한다는 의미
- database와 JVM 사이에서 non-SQL binary protocol을 통해 더 빨리 소통 가능.
(packet에 data 양이 적어서 더 빨리 소통 가능.)
- file을 저장하거나 얻는 쉬운 방법 (BLOB, CLOB 데이터 타입을 활용). list 저장도 가능.
- 특정 SQL query를 여러 번 실행할 때 유용. precompiled되어 있고, query plan이 한 번만 생성되기 때문.
장점
- SQL injection 예방 가능.
- cache에 저장된 query 활용해서 statement 보다 실행이 빠름
단점
- query에 오류가 생긴 경우 분석하기 어려움. bind변수 부분이 '?'로 나오므로 실제 실행된 query를 확인하는 것이 어려움.
** 그렇다고 모든 Query에 Statement 대신 PreparedStatement만 사용한다면 모든 Query가 compile 되어 Caching 영역의 한계로 정작 Caching 되어야 할 query가 그렇게 되지 못할 가능성이 커짐.
-> 성능상 caching 되길 원하는 query에 적용하는 것이 좋음.
Callable Statement
- database stored procedures 실행할 때 사용.
- PreparedStatement 상속받음.
- stored procedure에게 3 종류의 parameter를 pass 할 수 있음.
IN : pass the values to stored procedure
OUT : hold the result returned by the stored procedure
IN OUT : IN과 OUT parameter 기능 모두 수행
- 셋중에 가장 성능이 높음. 이미 compile 되어 있고, database server에 저장되어 있기 때문.
Statement vs PreparedStatement vs CallableStatement 사용 case
https://www.tutorialspoint.com/jdbc/jdbc-statements.htm Statement : execute static SQL queries
PreparedStatement : execute dynamic or parameterized SQL queries
CallableStatement : execute stored procedures
Further Topics
- SQL DDL, DML, DCL
- Database Engine
- 동적 쿼리, 정적 쿼리
- SQL query processing steps including query plan
- relational-algebra
References
- https://www.baeldung.com/java-statement-preparedstatement
- https://www.tutorialspoint.com/jdbc/jdbc-statements.htm
- https://javaconceptoftheday.com/statement-vs-preparedstatement-vs-callablestatement-in-java/
- https://iksflow.tistory.com/127
- https://hpjang.tistory.com/3
'CS 지식 > 데이터베이스(Database)' 카테고리의 다른 글
Transaction Isolation Level(트랜잭션 격리 수준) (0) 2023.04.25 Transaction (0) 2023.04.25 SQL vs NoSQL (0) 2023.04.21 SQL - injection (2) 2023.04.19 Relational Model과 Key의 종류 (0) 2023.04.17