Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
Tags
- frontend
- java
- elasticsearch
- 프로젝트관리
- 백엔드
- 스프링
- 프론트엔드
- kibana
- It
- 일감관리
- 오라클
- spring aop
- 검색
- 이슈관리
- PM
- Database
- Si
- 인덱스
- 자바
- 레드마인
- 개발자
- 웹프론트
- db
- 비전공개발자
- spring
- PreparedStatement
- 엘라스틱서치
- 데이터베이스
- AOP
- redmine
Archives
- Today
- Total
리타의 저장소
JAVA | PreparedStatement 들어가기 본문


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 에 대해 조금 더 파보기로 마음먹었다.
'Dev > Backend' 카테고리의 다른 글
| JAVA | JPA와 Mybatis에서의 PreparedStatement 동작방식 (0) | 2025.10.11 |
|---|---|
| JAVA | DB Call 최소화 (Feat. PreparedStatement) (0) | 2025.10.11 |
| JAVA | Spring에서의 PreparedStatement (0) | 2025.10.11 |
| JAVA | Java에서 DB 커넥션을 얻는 방법 #2 (feat. PreparedStatement) (0) | 2025.10.11 |
| JAVA | Java에서 DB 커넥션을 얻는 방법 #1 (feat. PreparedStatement) (0) | 2025.10.11 |