Topic

Statement vs Prepared Statement

JackerLab 2025. 4. 20. 14:30
728x90
반응형

개요

Java로 데이터베이스를 다룰 때 가장 많이 사용되는 두 가지 SQL 실행 방법이 StatementPreparedStatement입니다. 이 둘은 SQL 실행 방식, 보안, 성능 최적화 측면에서 큰 차이를 보이며, 잘못된 선택은 SQL Injection, 성능 저하 등의 문제로 이어질 수 있습니다. 이 포스트에서는 Statement와 PreparedStatement의 차이점, 사용법, 보안성, 성능 차이, 실무 활용 전략을 상세히 비교합니다.


1. 개념 및 정의

항목 Statement Prepared Statement
정의 실행할 SQL을 문자열로 직접 입력 실행할 SQL을 미리 컴파일하고 파라미터로 값 주입
사용 목적 단순, 고정되지 않은 쿼리 파라미터가 있는 반복 쿼리 실행
SQL 실행 시점 컴파일과 실행이 동시에 수행 SQL 문 컴파일 후 재사용 가능

PreparedStatement는 성능, 보안 면에서 Statement보다 우수한 구조입니다.


2. 사용법 예시

// Statement 예시
Statement stmt = conn.createStatement();
String sql = "SELECT * FROM users WHERE id = " + userId;
ResultSet rs = stmt.executeQuery(sql);

// PreparedStatement 예시
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
pstmt.setInt(1, userId);
ResultSet rs = pstmt.executeQuery();

PreparedStatement는 파라미터를 안전하게 바인딩할 수 있어 SQL Injection 방지에 유리합니다.


3. 차이점 비교

항목 Statement PreparedStatement
SQL Injection 위험 높음 (문자열 직접 삽입) 낮음 (바인딩 처리)
파싱 성능 매 실행 시 파싱 필요 최초 파싱 후 재사용 가능
가독성 조건 복잡 시 코드 가독성 낮음 파라미터로 명확하게 관리 가능
실행 속도 반복 호출 시 느림 재사용으로 성능 향상
유지보수 SQL 문자열 분리 어려움 SQL과 값이 분리되어 관리 용이

4. 성능 및 보안

측면 Statement PreparedStatement
캐시 활용 사용 불가 DB 커서 및 실행 계획 캐시 활용 가능
보안성 SQL Injection에 매우 취약 바인딩 방식으로 보안 강화
대용량 처리 반복 실행 시 비효율적 Batch 처리에 최적화됨

보안과 성능이 중요한 실무 환경에서는 PreparedStatement가 사실상 표준입니다.


5. 실무 적용 전략

전략 설명 적용 팁
반복 쿼리 최적화 동일한 SQL 문에 값만 바뀔 경우 PreparedStatement 재사용 권장
SQL Injection 방지 사용자 입력값은 절대 직접 SQL에 포함하지 말 것 setString(), setInt() 등 바인딩 메서드 사용
로그 추적 강화 실행 전 쿼리 로그 출력으로 디버깅 로그 인터셉터 또는 SQL 로그 라이브러리 활용
Batch 처리 여러 SQL을 한 번에 처리 시 addBatch() + executeBatch() 활용

6. 결론

Statement와 PreparedStatement는 기능적으로는 유사하지만, 보안성과 성능 측면에서 큰 차이를 보입니다. 일반적인 애플리케이션에서는 PreparedStatement 사용을 기본으로 삼고, SQL Injection 방지와 성능 최적화를 함께 고려하는 것이 모범 전략입니다. 단순한 일회성 쿼리에서만 Statement를 고려하고, 그 외 대부분의 경우에는 PreparedStatement를 사용하는 것이 바람직합니다.

728x90
반응형