본문 바로가기

개발/JAVA

[JAVA] PreparedStatement(pstmt)와 Statement(stmt)의 차이점

 

JDBC를 사용하고, 쿼리문을 수행할 때 사용하는 두 객체! 하지만 어떨 때는 PreparedStatement를 사용하고, 어떨 때는 Statement를 사용하는데 이 차이점이 명확히 무엇일까? 

userId가 admin 정보를 가져오는 다음 코드들을 살펴보자.

■ 코드 1.

Query = "SELECT * FROM USER WHERE USERID=?";
PreparedStatement pStmt = conn.prepareStatement(query);
for(int i=0; i<cnt; i++){
	pStmt.setString(1, userId[i]);
	ResultSet rs = pStmt.executeQuery();
}

■ 코드 2.

 

for(int i=0; i<cnt; i++){
  query = "SELECT * FROM USER WHERE USERID='" + userId[i] + "'";
  Statement stmt = conn.createStatement();
  ResultSet rs = stmt.executeQuery(query);
}

 

두 코드의 차이점을 본다면 userId를 어떤 방식으로 대입하느냐에 따라 다르다. 만일, 조회해야 할 사용자가 100명이라고 가정한다면 과연 어느쪽이 더 자원 낭비가 심할까?

답은 바로 코드 2번이다.

그 이유는 1번 코드는 미리 쿼리를 준비해 두고 userId값만 교환하여 쿼리를 재활용 하고 있는 반면에 코드2는 그렇지 않기 때문이다.
이렇게 본다면 PreparedStatement Class가 참 좋은 것 같다. 그리고 PreparedStatement는 인젝션을 어느정도 막을 수 있는 코드가 삽입되어 있다.
이렇게만 본다면 PreparedStatement 만 사용해야 겠다고 생각하는 사람들이 많을 것이다.

 

하지만, PreparedStatement는 분명 Statement 인터페이스를 구현하고 있으면서 또 다른 기능을 포함하고 있다.
이것은 Statement보단 조금더 무겁다는 것을 의미한다.

그렇다면 Statement와 PreparedStatement 속도는 어느정도 차이가 날까?
Java Programming With Oracle JDBC라는 책을 보면, 도날드는 오라클 드라이버를 사용하여 데이터를 삽입 할 때 PreparedStatement가 65번 이상 시행 시켰을 때 누적시간 차가 PreparedStatement가 더 작아 진다고 설명되어 있다.

어떤 클래스를 사용하는것은 개발자의 몫이다. 하지만 그 차이점을 알고 사용한다면 조금이나마 더 나은 결과를 볼 수 있지 않을까?