- JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리기술을 지원한다.
- JPQL은 가장 중요한 객체지향 쿼리 언어다.
- Criteria나 QueryDSL은 결국 JPQL을 편리하게 사용하도록 도와주는 기술이므로 JPA를 다루는 개발자라면 JPQL을 필수로 학습해야 한다.
- 종류
- JPQL (Java Persistence Query Language)
- Criteria 쿼리 : JPQL을 편하게 작성하도록 도와주는 API, 빌더 클래스 모음
- 네이티브 SQL : JPA에서 JPQL대신 직접 SQL을 사용할 수 있다.
- QueryDSL : Criteria 쿼리처럼 JPQL을 편하게 작성하도록 도와주는 빌더 클래스 모음, 비표준 오픈소스 프레임워크다.
- JDBC직접 사용, MyBatis 같은 SQL 매퍼 프레임워크 사용 : 필요하면 JDBC를 직접 사용할 수 있다. 참고로 스프링 프레임워크를 사용하면 JPA와 마이바티스를 손쉽게 통합할 수 있다.
JPQL 소개
- JPQL은 엔티티 객체를 조회하는 객체지향 쿼리다.
- JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않는다.
- 데이터베이스 방언(Dialect)만 변경하면 JPQL을 수정하지 않아도 자연스럽게 데이터베이스를 변경할 수 있다.
- JPQL은 SQL보다 간결하다.
Criteria 쿼리 소개
- Criteria는 JPQL을 생성하는 빌더 클래스다.
- 장점은 문자가 아닌 query.select(m).where(...) 처럼 프로그래밍 코드로 JPQL을 작성할 수 있다는 점이다.
- 또다른 장점으로 컴파일 시점에 오류를 발견할 수 있고, 동적 쿼리를 작성하기 편하다는 점이다.
- 그러나 모든 장점을 상쇄할 정도로 복잡하고 장황하다.
- 따라서 사용하기 불편한 건 물론이고 Criteria로 작성한 코드도 한눈에 들어오지 않는다는 단점이 있다.
QueryDSL 소개
- Criteria처럼 JPQL 빌더 역할을 한다.
- 장점은 코드 기반이면서 단순하고 사용하기 쉬우며, 작성한 코드도 한눈에 들어온다.
- JPA 표준은 아니고 오픈소스 프로젝트다. JPA뿐만 아니라 JDO, 몽고DB, Lucene 등도 거의 같은 문법으로 지원한다.
- 저자는 Criteria보다 QueryDSL을 선호한다.
- QueryDSL도 어노테이션 프로세서를 사용해서 쿼리 전용 클래스를 만들어야 한다. QMember는 Member 엔티티 클래스를 기반으로 생성한 QueryDSL 쿼리 전용 클래스다.
//준비
JPAQuery query = new JPAQuery(em);
QMember member = QMember.member;
//쿼리, 결과조회
List<Member> members = query.from(member)
.where(member.username.eq("kim"))
.list(member);
네이티브 SQL 소개
- SQL을 직접 사용할 수 있는 기능 지원
- JPQL을 사용해도 가끔은 특정 데이터베이스에 의존하는 기능을 사용해야 할 때가 있다. 그리고 SQL은 지원하지만 JPQL이 지원하지 않는 기능도 있다. 이때는 네이티브 SQL을 사용!
- 단점은 데이터베이스에 의존하는 SQL을 작성해야 한다는 것이다.
출처도서 : 자바 ORM 표준 JPA 프로그래밍 - 김영한 지음
'JPA' 카테고리의 다른 글
JPA 도입을 위한 이해 (0) | 2019.12.27 |
---|---|
[개념] JPA 프로그래밍 - 12. Spring Data JPA (0) | 2019.12.27 |
[개념] JPA 프로그래밍 - 07. 고급매핑 (0) | 2019.12.27 |
[개념] JPA 프로그래밍 - 06. 다양한 연관관계 매핑 (0) | 2019.12.27 |
[개념] JPA 프로그래밍 - 05. 연관관계 매핑 기초 (0) | 2019.12.27 |