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가 더 작아 진다고 설명되어 있다.
어떤 클래스를 사용하는것은 개발자의 몫이다. 하지만 그 차이점을 알고 사용한다면 조금이나마 더 나은 결과를 볼 수 있지 않을까?
'개발 > JAVA' 카테고리의 다른 글
객체지향 (상속, 합성, 인터페이스) 캠핑 상황으로 이해해보기 (0) | 2023.09.19 |
---|---|
[JAVA] #02. [SQL] StringBuffer, StringBuilder, String 의 차이점 (0) | 2020.07.29 |
[JAVA] #10. 자동 형변환 / 강제 형변환 (CAST) (0) | 2020.07.28 |
[JAVA] #09. 비트 연산자(bitwise operator), 시프트 연산자 (0) | 2020.07.28 |
[JAVA] #08. 자료형(Java Data Type) :: boolean, int, char, double 등 (0) | 2020.07.28 |