[JPA]JPA 동적 검색(QueryDsl)

윤재열·2022년 3월 16일
0

JPA

목록 보기
8/21
post-custom-banner

JPQL이란?

  • JPQL(Java Persistence Query Language)는 JPA(Java Persistence API)의 일부로 정의된 플랫폼에 독립적인 객체지향 쿼리 언어입니다. JPQL은 관계형 데이터베이스의 엔티티에 대한 쿼리를 만드는데 사용됩니다.
  • JPA는 엔티티 객체를 중심으로 개발하므로 SQL을 사용하지 않습니다. 하지만 검색쿼리를 사용할 때는 SQL을 사용해야 합니다.

  • SQL의 영향을 받아 SQL과 비슷하나, DB 테이블에 직접 접근하는 것이 아닌 JPA 엔티티에 동작합니다. 그래서 JPQL의 쿼리에는 테이블이 아닌 엔티티에서 사용되는 컬럼의 이름을 사용해야 합니다.

👉 SQL : 데이터베이스 테이블을 대상으로 쿼리

👉 JPQL : 엔티티 객체를 대상으로 쿼리

JPQL로 검색

  • 웹 어플리케이션 개발에 있어 검색 기능은 매우 중요하다. 무분별한 정보들 중 클라이언트가 찾고자 하는 정보를 빠르게 얻게할 수 있기 때문입니다. MyBatis에서 검색할 때 <if>, <choose>, <when> 등 같은 것을 써서 동적으로 쿼리를 생성할 수 있습니다. JPA에서 SQL을 왠만해선 직접 사용하지 않고, Query Method, @Query, Querydsl 등을 사용한다. 따라서 이 기능 안에서 효율적으로 검색 기능을 완성해야합니다.
  • 관계형 데이터베이스에서 각 테이블이 서로 FK로 참조하듯이 엔티티에서도 서로 연관이 있다면 참조할 수 있습니다.
  • 만약 단일 엔티티의 경우(FK를 갖지않는) Querydsl로 비교적 간단하게 검색기능을 작성할 수 있습니다. 하지만 여러 엔티티가 있고 서로 외래키로 참조하고 있는 경우 JPQL로 직접 처리하는 것은 Object[] 타입으로 나오기 때문에 (Tuple 형태) 작성하는 방법 자체가 다르고 복잡합니다. 하지만 어떤 상황에서도 가장 강력한 JPQL을 구성할 수 잇는 방식이기도 합니다.

QueryDsl

  • 오픈 소스 프로젝트이고 type-safe한 쿼리를 위한 Domain Specific Language입니다.
  • SQL 쿼리는 문자이기 때문에 type-check가 불가하고 실행해 보기 전 까지 작동 여부 확인이 어려운데, 만약 SQL이 Class처럼 Type을 갖고 Java 코드로 작성할 수 있다면 좋지 않을까? SQL을 java로 type-safe하게 개발 할 수 있게 해주는 프레임워크가 Querydsl이다. 이는 JPQL을 type-safe하게 작성하기 위해 만들어졌으며 다음과 같이 작동합니다.

    Querydsl => JPQL => SQL

Repository확장

  • Spring Data JPA의 Repository를 확장하기 위해서는 다음과 같은 단계로 처리됩니다.
  1. 쿼리 메소드나 @Query 등으로 처리할 수 없는 기능은 별도의 인터페이스로 설계
  2. 별도의 인터페이스에 대한 구현 클래스를 작성한다. 이 때, QuerydslRepositorySupport라는 클래스를 부모 클래스로 사용한다.
  3. 구현 클래스에 인터페이스의 기능을 Q도메인 클래스와 JPQLQuery를 이용해서 구현한다.

QuerydslRepositorySupport

  • Querydsl을 이용해 쿼리를 작성하기 위해서는 이 클래스를 상속받아야 하며 super(DslMember.class); 처럼 도메인 엔티티 클래스를 슈퍼타입인 QuerydslRepositorySupport 생성자의 인자로 넘겨주어야 합니다.
  • 개발자가 커스터마이징 하는 Repository를 작성하는 데 있어서 가장 중요한 클래스는 QuerydslRepositorySupport라는 클래스입니다. 이는 Spring Data JPA에 포함된 클래스로 Querydsl 라이브러리를 이용해서 직접 무언가 구현할 때 사용합니다.

JPQLQuery의 일반 사용법

  • from : 쿼리 소스를 추가합니다.

  • innerJoin, join, leftJoin, fullJoin, on : 조인 부분을 추가합니다. 조인 메서드에서 첫 번째 인자는 조인 소스이고, 두 번째 인자는 대상(별칭)입니다.

  • where : 쿼리 필터를 추가한다. 가변 인자나 AND/OR 메서드를 이용해 필터를 추가합니다.

  • groupBy : 가변인자 형식의 인자를 기준으로 그룹을 추가합니다.

  • having : Predicate 표현식을 이용해 "group by" 그룹핑의 필터를 추가합니다.

  • orderBy : 정렬 표현식을 이용해서 정렬 순서를 지정한다. 숫자나 문자열에 대해서는 asc()나 desc()를 사용하고, OrderSpecifier에 접근하기 위해 다른 비교 표현식을 사용합니다.

  • limit, offset, restrict : 결과의 페이징을 설정한다. limit은 최대 결과 개수, offset은 결과의 시작 행, restrict는 limit과 offset을 함께 정의합니다.

profile
블로그 이전합니다! https://jyyoun1022.tistory.com/
post-custom-banner

0개의 댓글