Miracle Morning, LHWN

12. JPQL, Criteria, Query DSL 본문

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 에서 성능 최적화에 대한 고민

  1. 느린 쿼리 개선
    • 최적화되지 않은 쿼리로 인한 느려짐을 방지
  2. Fetch 타입의 정확한 선택
    • 매핑 관계에 있어서 잘못된 FetchType 을 선택하게 되면 수행되는 쿼리 수가 늘어남
    • 기본적으로 DB 튜닝에 있어서 쿼리의 숫자를 줄이는 방식이랑 동일한 개념
  3. JOIN 대신 FETCH JOIN 사용
    • 조인은 두 가지 테이블을 읽기 때문에 성능상으로 느려짐을 경험
    • 따라서 특정한 영역 데이터를 먼저 가져와서 조인하는 방식이 유리 
  4. 데이터베이스가 어려운 일 작업하게 하기
    • 간혹 서비스를 구현함에 로직 및 구현 부분에서 데이터를 가져와서 처리하는 경우가 있음
    • 데이터베이스가 할 수 있는 영역들은 데이터베이스의 쿼리를 활용해서 처리를 하는 것이 더 빠름
  5. 최대 절전 모드 활용
    • 하이퍼네이트 세션의 1단계 세션 캐시 활용 (기본적으로 모든 엔티티는 캐시됨)
    • 2단계 캐시의 경우 공유 캐시 모드를 설정해야 활용 가능 (orm.hibernate, annotations.Cache 주석을 사용하여 활성화)

 

출처 : https://fastcampus.co.kr/courses/204729/clips/

Comments