게으른 개발자의 끄적거림

PreparedStatement란? (설명, 쓰는 이유 등)

끄적잉 2024. 1. 17. 21:14
반응형

`PreparedStatement`는 Java에서 SQL 문을 실행하기 위한 인터페이스 중 하나로, SQL injection 공격을 방지하고 성능을 향상시키는 데 도움이 되는 중요한 개념입니다. 아래에서 `PreparedStatement`의 사용 이유, 설명, 예시에 대해 자세하게 설명하겠습니다.

 


### 1. SQL Injection 방지

SQL Injection은 악의적인 사용자가 입력 필드에 SQL 코드를 삽입하여 데이터베이스에 대한 공격을 시도하는 보안 취약점 중 하나입니다. `PreparedStatement`를 사용하면 입력 값을 파라미터로 전달하여 SQL 문을 동적으로 생성하는 대신, 미리 정의된 SQL 쿼리에 값을 채워 넣을 수 있습니다. 이로써 사용자 입력이 SQL 코드로 해석되는 것을 방지할 수 있습니다.


// 일반적인 Statement 사용
String username = userInput;
String password = userInput;
String query = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);

// SQL Injection에 취약한 코드

// PreparedStatement 사용
String username = userInput;
String password = userInput;
String query = "SELECT * FROM users WHERE username=? AND password=?";
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
ResultSet resultSet = preparedStatement.executeQuery();

 

반응형


### 2. 성능 향상

`PreparedStatement`는 쿼리를 컴파일하고 실행 계획을 재사용함으로써 성능을 향상시킬 수 있습니다. 동일한 쿼리를 여러 번 실행하는 경우, 컴파일된 쿼리를 재사용함으로써 데이터베이스에서의 처리 속도가 향상됩니다.


// 일반적인 Statement 사용
Statement statement = connection.createStatement();
for (int i = 0; i < 100; i++) {
    String query = "SELECT * FROM users WHERE user_id=" + i;
    ResultSet resultSet = statement.executeQuery(query);
    // 쿼리가 반복될 때마다 컴파일 및 실행 계획 생성

// PreparedStatement 사용
String query = "SELECT * FROM users WHERE user_id=?";
PreparedStatement preparedStatement = connection.prepareStatement(query);
for (int i = 0; i < 100; i++) {
    preparedStatement.setInt(1, i);
    ResultSet resultSet = preparedStatement.executeQuery();
    // 한 번 컴파일된 쿼리를 재사용
}

 

 


### 3. 코드 가독성 및 유지보수성 개선

`PreparedStatement`를 사용하면 SQL 쿼리와 파라미터가 분리되어 있어 코드의 가독성과 유지보수성이 향상됩니다. SQL 문을 문자열로 직접 작성하는 대신, 미리 정의된 템플릿에 값을 채워넣는 방식으로 코드를 작성할 수 있습니다.


// 일반적인 Statement 사용
String username = userInput;
String password = userInput;
String query = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";

// PreparedStatement 사용
String username = userInput;
String password = userInput;
String query = "SELECT * FROM users WHERE username=? AND password=?";


이러한 이유들로 인해, `PreparedStatement`는 SQL 문을 안전하게 실행하고 성능을 향상시키기 위해 권장되는 방법 중 하나입니다.

반응형