IT 기술/[JAVA] Spring Boot
12. JPQL, Criteria, Query DSL
Lee Hye Won
2021. 5. 17. 09:48
# Hibernate 와 Spring Data JPA 의 차이
- Hibernate : JPA 의 구현체
- Spring Data JPA = 사용하기 편한 모듈
JPQL
- 대소문자 구분
- 엔티티 이름 (테이블명이 아닌 그 테이블에 엔티티로서 설정한 명칭 review)
- 별칭 필수
# 기본 문법
String jpql = "select c from review c";
List<Review> result = em.createQuery(jpql, Review.class).getResultList();
# TypedQuery : Type 의 validation 이 추가
public static void typedQuery(EntityManager em) {
String jpql = "SELECT b FROM review b";
TypedQuery<Review> query =
em.createQuery(jpql, Review.class);
List<Review> reviewList = query.getResultList();
for(Review review : reviewList) {
System.out.println(review.getTitle());
}
}
EntityManager : 엔티티를 관리하는 객체 (쿼리를 요청하거나 관리)
Criteria
CriteriaBuilder cb = this.em.getCriteriaBuilder();
// 업데이트 쿼리
CriteriaUpdate<Review> update = cb.createCriteriaUpdate(Review.class);
// 루트 클래스 만들기
Root e = update.from(Review.class);
// 조회 조건 만들기
update.set("count", newCount);
update.where(cb.greaterThanOrEqualTo(e.get("count "), oldCount));
// 빌더를 통한 실행
this.em.createQuery(update).executeUpdate();
Query DSL
JPQL 의 문제를 보완한 오픈소스
# 장점
- 컴파일 시점에 오류 발견
- 코드는 JPQL 과 유사
- 동적 쿼리
# 단점
- 쿼리가 문자열이기 때문에 문법 오류를 발견할 수 없음
select m from Review m where cnt > 10
JPAQueryFactory query = new JPAQueryFactory(em);
QReview m = QReview.review;
List<Review> list =
query.selectFrom(m)
.where(m.cnt.gt(10))
.orderBy(m.cnt.desc())
.fetch();
JPA 에서 성능 최적화에 대한 고민
- 느린 쿼리 개선
- 최적화되지 않은 쿼리로 인한 느려짐을 방지
- Fetch 타입의 정확한 선택
- 매핑 관계에 있어서 잘못된 FetchType 을 선택하게 되면 수행되는 쿼리 수가 늘어남
- 기본적으로 DB 튜닝에 있어서 쿼리의 숫자를 줄이는 방식이랑 동일한 개념
- JOIN 대신 FETCH JOIN 사용
- 조인은 두 가지 테이블을 읽기 때문에 성능상으로 느려짐을 경험
- 따라서 특정한 영역 데이터를 먼저 가져와서 조인하는 방식이 유리
- 데이터베이스가 어려운 일 작업하게 하기
- 간혹 서비스를 구현함에 로직 및 구현 부분에서 데이터를 가져와서 처리하는 경우가 있음
- 데이터베이스가 할 수 있는 영역들은 데이터베이스의 쿼리를 활용해서 처리를 하는 것이 더 빠름
- 최대 절전 모드 활용
- 하이퍼네이트 세션의 1단계 세션 캐시 활용 (기본적으로 모든 엔티티는 캐시됨)
- 2단계 캐시의 경우 공유 캐시 모드를 설정해야 활용 가능 (orm.hibernate, annotations.Cache 주석을 사용하여 활성화)