Server Programming/SpringBoot

Spring Boot - QueryDSL, JPQL, nativeQuery, Criteria

Dev.BeryL 2022. 2. 1. 13:18
728x90

JPQL(Java Persistence Query Language)

  • SQL을 추상화한 엔티티 객체를 조회하는 객체지향 쿼리
  • JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존 X
    • 예를들어 같은 SQL 함수라도 데이터베이스마다 사용 문법이 다른 것이 있는데,JPQL이 제공하는 표준화된 함수를 사용하면 선택한 방언에 따라 해당 데이터베이스에 맞춘 SQL 함수가 실행
  • 결과 반환 함수 getResultList(리스트 반환), getSingleResult(단일 객체 반환)

  • JPQL은 엔티티 객체를 대상으로 쿼리를 질의하고
  • SQL은 데이터베이스 테이블을 대상으로 쿼리를 질의한다.
  • Member.class를 넘겨주고 getResultList() 메소드를 실행-> JPA는 JPQL을 SQL로 변환해서 데이터베이스 조회 > 조회한 결과로 Member 엔티티를 생성해서 반환

JPQL - 주의사항

  • from절에 들어가는 것은 객체 ( select m from Member m )
  • 엔티티와 속성은 대소문자 구분
  • JPQL 키워드는 대소문자 구분 x
  • 별칭 필수

JPQL

@Query(value = "select p from ClientPlannerBind p " +
 "where p.bindStatus='ACCEPTING' and p.recentContactDatetime is null and p.createdAt < :threshold ")
List<ClientPlannerBind> findNotAcceptingBindsAfterHours(ZonedDateTime threshold,
 Pageable pageable);

@Query(value = "select p from ClientPlannerBind p " +
 "where p.bindStatus='CONSULTING' and p.consultationStartDatetime is not null and p.consultationStartDatetime < :threshold and p.recentContactDatetime is null")
List<ClientPlannerBind> findNotAnsweringBindsAfterDays(ZonedDateTime threshold,
 Pageable pageable);

Criteria

  • Criteria는 JPQL을 생성하는 빌더 클래스
  • Criteria의 장점 - 문자가 아닌 query.select(m).where(...)처럼 프로그래밍 코드로 JPQL을 작성
    • 문자기반의 경우 컴파일은 성공하고 애플리케이션을 서버에 배포가능.
    • 문제는 해당 쿼리가 실행되는 런타임 시점에 오류가 발생
  • Criteria가 가진 장점이 많지만 모든 장점을 상쇄할 정도로 복잡 → 사용하기 불편, 코드 가독성 떨어짐

Native Query

  • 특정 데이터베이스에 의존하는 기능을 사용해야 할 때 사용
  • 네이티브 SQL의 단점 - 특정 데이터베이스에 의존하는 SQL 작성
  • 따라서 데이터베이스를 변경하면 네이티브 SQL도 수정해야 함

QueryDSL

  • QueryDSL Criteria같은 JPQL 빌더 역할
  • 코드 기반이면서 단순하고 사용하기 쉽다.
  • 가독성이 뛰어나다
  • QMember는 Member 엔티티 클래스를 기반으로 생성한 QueryDSL 쿼리 전용 클래스
반응형