🟣 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로 작성한 코드도 한눈에 들어오지 않는다는 단점이 있다.
'개발중 > 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 |