리타의 저장소

JAVA | PreparedStatement 들어가기 본문

Dev/Backend

JAVA | PreparedStatement 들어가기

ريتا 2025. 10. 11. 23:26

JAVA


PreparedStatement란?

  • SQL 문을 미리 컴파일해둔 객체.
  • Java의 java.sql 패키지에 포함돼 있다.
  • 주로 SQL Injection(보안 문제)을 막기 위해, 그리고 쿼리 성능 최적화를 위해 사용.
  • Connection 객체의 prepareStatement() 메서드를 이용해서 만든다.

그냥 Statement vs PreparedStatement

구분 Statement PreparedStatement

SQL 처리 방식 SQL을 실행할 때마다 파싱, 컴파일 SQL을 미리 컴파일 후 실행
성능 느림 빠름 (특히 반복 실행 시)
보안 SQL Injection 취약 파라미터 바인딩으로 Injection 방지
코드 작성 문자열 조작 많음 깔끔한 파라미터 바인딩 가능

PreparedStatement 기본 사용법

// 1. 커넥션 얻기
Connection conn = DriverManager.getConnection(url, user, password); -- DriverManager를 통해 직접 커넥션을 얻는 방법

// PostgreDbcp 의 경우 제공되는건 아니고, 실서비스에서 oracle / postgre 복수DB를 사용중인 터라 따로 관리하게 만들어서 사용중임.
Connection conn = PostgreDbcp.getDataSource().getConnection(); -- DataSource를 통해 커넥션을 얻는 방법 => 실무에선 이쪽을 많이 씀 (실제 운영 소스에도 이렇게 되어있다.)


// 1-1. 커넥션 설정

// 2. SQL 작성 (물음표 ? 로 파라미터 자리 표시)
String sql = "SELECT * FROM users WHERE id = ?";

// 3. PreparedStatement 생성
PreparedStatement pstmt = conn.prepareStatement(sql);

// 4. 파라미터 바인딩
pstmt.setInt(1, 10); // 1번째 ?에 10을 바인딩

// 5. 실행
ResultSet rs = pstmt.executeQuery();

// 6. 결과 처리
while (rs.next()) {
    System.out.println(rs.getString("name"));
}

// 7. 자원 해제
rs.close();
pstmt.close();
conn.close();

 

주요 메서드

setInt(int parameterIndex, int value) 정수 바인딩
setString(int parameterIndex, String value) 문자열 바인딩
setDate(int parameterIndex, java.sql.Date value) 날짜 바인딩
executeQuery() SELECT 문 실행 (결과 ResultSet 반환)
executeUpdate() INSERT, UPDATE, DELETE 문 실행 (영향받은 행 수 반환)
execute() 어떤 SQL이든 실행 (SELECT/UPDATE 등 구분 없이)

장점

  • SQL Injection 차단: 파라미터를 따로 처리해서 쿼리에 주입 불가.
  • 성능 최적화: 같은 쿼리 여러 번 실행 시, DB가 컴파일/최적화된 쿼리를 재사용 가능.
  • 코드 가독성: 문자열 조립 불필요. 클린하게 코드 작성 가능.
  • 타입 안전성: setInt, setString처럼 타입별로 정확히 지정 가능하다.

 

+ 반복 insert/update 시 batch 기능을 쓰는 경우 더 효율적일 수 있다.

 

주저리..

요즘 스터디를 하고 있는데, 주에 1회씩 공부한 내용을 공유하는 시간을 갖고 있다. 나는 Database 성능 튜닝 관련 내용에 대해서 공부중인 터라,,, 관련해서 공유를 했는데, 서버 개발자의 관점에서 생각해봤을 때 어떤식으로 코드에서 직접적으로 사용될 수 있을 것 같냐는 물음에,,,, 조금 더 생각해보기로 하고 실제로 우리 회사에서 운영중인 서비스에서 사용중인 PreparedStatement 에 대해 조금 더 파보기로 마음먹었다.