PreparedStatement는 SQL 쿼리를 사전에 컴파일하여 데이터베이스에 반복해서 실행할 때 사용되는
인터페이스입니다. JDBC(Java Database Connectivity)에서 제공하는 기능으로,
SQL 쿼리에 동적인 매개변수를 전달하여 쿼리를 실행하는 데 사용됩니다.
PreparedStatement는 일반적인 Statement와 비교하여 여러 가지 장점을 가지고 있습니다.
PreparedStatement의 주요 특징과 장점:
1. **SQL Injection 방지**: PreparedStatement는 쿼리를 컴파일하여 실행하기 때문에
외부에서 입력되는 데이터에 대해 자동으로 이스케이프 처리를 하며,
SQL Injection 공격을 방지할 수 있습니다. 즉, 보안 측면에서 더 안전하게 쿼리를 실행할 수 있습니다.
2. **성능 향상**: PreparedStatement는 쿼리를 컴파일하고 데이터베이스에 전송하기 때문에,
같은 쿼리를 여러 번 실행해야 할 경우에 성능이 향상됩니다.
데이터베이스에서 쿼리를 한 번만 컴파일하고,
이후에는 컴파일된 쿼리를 재사용하기 때문입니다.
3. **가독성 향상**: PreparedStatement를 사용하면 SQL 쿼리에서 매개변수를 ? 또는 :parameterName과 같은 이름으로 지정할 수 있으므로, 가독성이 향상됩니다.
4. **유형 변환 자동 처리**: PreparedStatement는 자바의 데이터 유형과 데이터베이스의 데이터 유형 간에 자동으로 변환을 처리해주기 때문에, 데이터 유형 변환에 대한 걱정을 덜 수 있습니다.
5. **재사용성**: 한 번 생성된 PreparedStatement 객체는 여러 번 실행할 수 있으며, 매개변수만 바꾸어서 반복해서 실행할 수 있습니다. 이를 통해 코드 재사용성이 높아집니다.
PreparedStatement 사용 예시:
// 예시: 사용자의 ID를 매개변수로 받아 해당 사용자의 이름을 조회하는 SQL 쿼리
String sql = "SELECT name FROM users WHERE id = ?";
try {
// PreparedStatement 생성
PreparedStatement pstmt = connection.prepareStatement(sql);
// 매개변수 설정
int userId = 123; // 사용자 ID
pstmt.setInt(1, userId); // 첫 번째 ?에 userId를 넣음
// 쿼리 실행
ResultSet rs = pstmt.executeQuery();
// 결과 처리
while (rs.next()) {
String name = rs.getString("name");
System.out.println("사용자 이름: " + name);
}
// 자원 해제
rs.close();
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
PreparedStatement를 사용하면 SQL 쿼리를 안전하게 실행하고 성능을 향상시킬 수 있으며, 코드의 가독성과 재사용성을 높일 수 있습니다. 따라서 JDBC를 사용할 때 PreparedStatement를 적극적으로 활용하는 것이 좋습니다.