본문 바로가기

JPA

[개념] JPA 프로그래밍 - 10. 객체지향 쿼리 언어

  • 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 프로그래밍 - 김영한 지음