`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 문을 안전하게 실행하고 성능을 향상시키기 위해 권장되는 방법 중 하나입니다.
'게으른 개발자의 끄적거림' 카테고리의 다른 글
MultipartRequest란? 파일 업로드 방법(java, phyton, node.js ...) (0) | 2024.01.19 |
---|---|
블로그 상위 노출하는 방법 (구글, 네이버 등) (0) | 2024.01.18 |
워드프레스 글에 코드 삽입하는 방법 (0) | 2024.01.16 |
Mixed content Error 해결 방안 (0) | 2024.01.15 |
Java unmappable character for encoding 에러 해결 (0) | 2024.01.15 |