자바를 통한 데이터 접근 방법
- JDBC
- Spring JDBC (Ex. JdbcTemplate)
- Persistence Framework (Ex. Hibernate, Mybatis 등)
JPA(Java Persistence API)
- Java 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스 모음
- 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
- 인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현함

ORM이란
Object Relational Mapping, 객체-관계 매핑
- 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.
- 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.
- 객체 모델과 관계형 모델 간에 불일치가 존재한다.
- ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.
- 객체를 RDB 테이블에 자동으로 영속화한다.
Statement와 Prepared Statement
SQL 실행 단계
1) 쿼리 문장 분석
2) 컴파일
3) 실행
Statement
String sqlstr = "SELECT name, memo FROM TABLE WHERE name =" + num
Statement stmt = conn.createStatement();
ResultSet rst = stmt.executeQuery(sqlstr);
- 쿼리문을 수행할 때마다 SQL 실행단계 1~3 단계를 거침
- Statement는 정적인 쿼리문을 처리
- 실행되는 SQL문을 확인 가능
Prepared Statement
String sqlstr = "SELECT name, memo FROM TABLE WHERE num = ?"
PreparedStatement stmt = conn.preparedStatement();
stmt.setInt(1, num);
ResultSet rst = stmt.executeQuery(sqlstr);
- 컴파일이 미리 되어있기 때문에 Statement에 비해 좋은 성능
- "?" 부분에만 변화를 주어 동적 쿼리문을 처리
- 동적 쿼리문일 경우 sql문을 확인이 어려움
- SQL injection 방지
Prepared Statement를 사용해야 하는 경우
-
동적 쿼리문을 실행하는 경우
-
쿼리 반복 수행 작업일 경우
Statement와 PreparedStatement의 차이
- Statement를 사용하면 매번 쿼리를 수행할 때마다 계속적으로 단계를 거치면서 수행
- PreparedStatement는 처음 한 번만 세 단계를 거친 후 캐시에 담아 재사용
- 동일한 쿼리를 반복적으로 수행한다면 PrepardStatement가 DB에 훨씬 적은 부하를 주며, 성능도 좋다.
jpa와 jdbc(PreparedStatement)를 비교
| 특징 | JPA | PreparedStatement |
|---|
| 추상화 level | 높다 | 낮다 |
| ORM | O | X |
| SQL injection 방지 | O | X |
| 성능 | 높다 | 낮다 |
| 사용 난이도 | 어려움 | 쉬움 |
일반적으로 JPA가 더 나은 선택이다. 그러나 반복 수행이거나 성능 향상을 위해서 PreparedStatement가 더 나은 선택일 수 있다.