흰 스타렉스에서 내가 내리지

[JPA] JPQL, Criteria, QueryDSL 소개 본문

Spring

[JPA] JPQL, Criteria, QueryDSL 소개

주씨. 2023. 2. 25. 12:24
728x90

JPQL  ★

JPQL은 엔티티 객체를 조회하는 객체지향 쿼리다. 

JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않는다. 

Criteria

Criteria는 JPQL을 생성하는 빌더 클래스다.

Criteria의 장점은 문자가 아닌 query.select(m).where(...) 처럼 프로그래밍 코드로 JPQL을 작성할 수 있다는 점이다. 

 

JPQL에서 오타가 있다면, 컴파일은 성공하고 런타임 시점에 오류가 발생한다. 

이것이 문자기반 쿼리의 단점이다. 

 

반면에 Criteria는 문자가 아닌 코드로 JPQL을 작성한다. 

따라서 컴파일 시점에 오류를 발견할 수 있다. 

CriteriaQuery<Member> cq = query.select(m).where(cb.equal(m.get("username"), "kim"));

아쉬운 점은 m.get("username")을 보면 필드 명을 문자로 작성했다. 

이 부분도 문자가 아닌 코드로 작성하고 싶으면 메타 모델(MetaModel)을 사용하면 된다. 

 

자바가 제공하는 어노테이션 프로세서 (Annotation Processor) 기능을 사용하면 어노테이션을 분석해서 클래스를 생성할 수 있다. 

JPA는 이 기능을 사용해서 Member 엔티티 클래스로부터 Member_ 라는 Criteria 전용 클래스를 생성하는데 이것을 메타모델이라 한다.

// 메타 모델 사용 전 -> 사용 후 
m.get("username") -> m.get(Member_.username)

 

Criteria가 가진 장점이 많지만 모든 장점을 상쇄할 정도로 복잡하고 장황하다. 

따라서 사용하기 불편한 건 물론이고 Criteria로 작성한 코드도 한눈에 들어오지 않는다는 단점이 있다. 

QueryDSL

QueryDSL도 Criteria처럼 JPQL 빌더 역할을 한다. 

QueryDSL의 장점은 코드 기반이면서 단순하고 사용하기 쉽다.

 

QueryDSL은 JPA 표준은 아니고 오픈소스 프로젝트이다. 현재 스프링 데이터 프로젝트가 지원할 정도로 많이 기대되는 프로젝트다. 

QueryDSL도 어노테이션 프로세서를 사용해서 쿼리 전용 클래스를 만들어야 한다.