본문 바로가기

CS & ITS/CS

SQL 구문 쿼리를 위한 Statement와 Prepared statement 차이점

이 문서의 내용

    더보기

    StatementPrepared statement는 프로그래밍에서 SQL 구문을 실행하기 위한 객체입니다.

    기본적으론 SQL 구문이 쿼리되려면 1. 쿼리 문장 분석 2. 컴파일 3. 실행 단계를 거칩니다.

    Statement

    쿼리 실행을 위한 SQL 구문을 하나의 문자열로 전달합니다.

    String sql = "SELECT id, name FROM table WHERE id = " + id;
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(sql);

    자바에서 문자열 타입과 다른 변수 타입의 합(+) 연산 결과는 문자열입니다.

    예시의 SQL 구문은 변수를 사용하는것처럼 보이지만 실제로는 id 입력에 따라서 매 번 다른 SQL 구문을 문자열로 생성하여 실행합니다.

    결과적으로 SQL 구문이 쿼리될 때마다 1. 쿼리 문장 분석 2. 컴파일 3. 실행 단계를 모두 거치게됩니다.

    Prepared statement

    쿼리 실행을 위한 SQL 구문과 ? 심볼에서 사용하는 파라미터와 함께 전달합니다.

    String sql = "SELECT id, name FROM table WHERE id = ?";
    PreparedStatement stmt = conn.preparedStatement();
    stmt.setInt(1, id);
    ResultSet rs = stmt.executeQuery(sql);

    SQL 구문은 변수와 결합되지 않습니다. 대신 PreparedStatement 객체에서 setXXX 메소드를 사용하여 인자를 전달합니다.

    Statement와의 가장 큰 차이점은 최초 쿼리될 때만 1. 쿼리 문장 분석 2. 컴파일 3. 실행 단계를 거치고 이후부터는 캐싱되어 바로 실행됩니다.

    따라서 반복 수행되는 쿼리문에 대해서 성능 향상을 기대할 수 있습니다.

    또한 변수로 입력된 값의 특수문자 등을 자동으로 파싱하여 SQL Injection으로부터 보호합니다.

    정리 및 복습

    • Statement는 쿼리될 때마다 1. 쿼리 문장 분석 2. 컴파일 3. 실행 단계를 모두 거치게됩니다.
    • Prepared Statement는 최초 쿼리될 때만 1. 쿼리 문장 분석 2. 컴파일 3. 실행 단계를 거치고 이후부터는 캐싱되어 바로 실행됩니다.
    • Prepared Statement특수문자 등을 자동으로 파싱하여 SQL Injection으로부터 보호합니다.