본문 바로가기

개발중/Java Persistence API (JPA)

🟡 Criteria이란 ?

728x90
반응형

🟣 Criteria이란 ?

 

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

'Criteria' 은 영어 단어로는 '기준' 이라는 뜻을 가지고 있다.


🟣 Criteria 의 장점

  • 문자가 아닌 query,select(m).shere(...) 처럼 프로그래밍 코드로 JPQL 을 사용할 수 있다.
  • 컴파일 시점에 오류를 발견할 수 있다.
  • IDE 를 사용하면 코드 자동 완성을 지원한다.
  • 동적 쿼리를 작성하기 편하다.

예를 들어 JPQL 에서 select m frim Membeee m 처럼 오타가 있다고 가정해보자.

그래도 컴파일은 성공하고 애플리케이션을 서버에 배포할 수 있다.

 

문제는 해당 쿼리가 실행되는 런타임 시점에 오류가 발생한다는 점이다.

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

 

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

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

 


 하이버 네이트를 포함한 몇몇 ORM 프레임워크들은 이미 오래전부터 자신만의 Criteria를 지원했다.

JPA 는 2.0부터 Criteria 을 지원한다.


🟣 Criteria 사용법

CriteriaBuilder cb = em.getCriterBuilder();

CriteriaQuery<Member> query = cb.createQuery (Member.class);

 

Root <Member> m = query.from(Member.class);

 

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

 

List<Member> resultList = em.create(cq).getResultList();


Criteria 쿼리는 문자가 아닌 코드로 작성 된다.

 

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

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


🟣 메타 모델 API

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

JPA 는 이 기능을 사용해서 Member 엔티티 클래스로부터 Member_ 라는 Criteria 전용 클래스를 생성하는데

이것을 메타 모델 이라고 한다.

 

메타 모델을 사용하면 온전히 코드만 사용해서 쿼리를 작성할 수 있다.

 

- 사용전

m.get("username")

 

- 사용후

m.get(Member_.username)


Criteria 은 코드로 쿼리를 작성할 수 있어서 동적 쿼리를 작성할 떄 매우 유리하다.

 

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

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


 

728x90
반응형

'개발중 > Java Persistence API (JPA)' 카테고리의 다른 글

JPA - 결과 조회 getResultList/getSingleResult  (0) 2021.07.01
JPA - 파라미터 바인딩  (0) 2021.07.01
🟡 QueryDSL이란 ?  (0) 2021.07.01
🟡 JPQL 이란 ?  (0) 2021.07.01
객체 지향 쿼리 소개  (0) 2021.07.01