공부/CS 스터디

Statement vs PreparedStatement

whaeun 2022. 12. 8. 12:30

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 쿼리 실행시 사용

 

5. 출처