JPA Repository & QueryDSL
JPA Repository & QueryDSL
JpaRepository를 상속받으면 쿼리문을 다양한 방식으로 대체 할 수 있습니다.
ItemRepository를 통해 알아보겠습니다.
DB에서 데이터를 불러오는 상황을 3가지로 나누어보겠습니다.
1. 필드명으로 엔티티를 가져오는 경우
2. 데이터를 가져올 때 간단한 조건이 필요한 경우
3. 데이터를 가져올 때 복잡한 조건이 필요한 경우
1, 필드명으로 엔티티를 가져오는 경우
필드명으로 원하는 엔티티를 가져올 수 있습니다.
예를들어 아이템 이름으로 원하는 아이템을 검색하고 싶으면
List<Item> findByItemNm(String itemNm)을 메소드명으로 하면 원하는 아이템 엔티티를 가져올 수 있습니다.
예시)
List<Item> findByItemNm(String itemNm);
2. 데이터를 가져올 때 간단한 조건이 필요한 경우
이 경우에는 JPQL을 사용해야합니다. @Query 어노테이션은 JPA에 기본적으로 포함되어 있으며, SQL 문법과 비슷한 JPQL 혹은 nativeSQL을 작성하여 사용할 수 있습니다.
특정한 단어가 들어가는 아이템 설명이 포함된 아이템을 가격순으로 가져오는 경우를 예시로 들어보겠습니다.
@Query("select i from Item i where i.itemDetail like %:itemDetail% order by i.price desc")
List<Item> findByItemDetail(@Param("itemDetail") String itemDetail);
위 @Query Annontation의 경우 JPQL 문법을 사용해서 원하는 데이터를 가져오는 것을 확인 할 수 있습니다.
허나 위와 같은 경우 필드명을 오타를 내거나 문법오류가 발생할 경우 컴파일 단계에서 캐치 할 수 없습니다.
(JAVA 필드명이 아닌 DB 필드명이기때문에)
이런 단점을 보완하기 위해서 QueryDSL이 나왔습니다.
QueryDSL(Query Domain Specific Language)은 JAVA에서 데이터베이스 쿼리를 작성하기 위한 프레임워크입니다.
유창하고 직관적인 구문을 사용하여 쿼리를 구성하기 위한 DSL(도메인별 언어)를 제공하므로 복잡한 쿼리 및 기준으로 작업하기가 더 쉽습니다.
이를 바탕으로 QueryDsl을 활용하는 세번째 경우를 알아보겠습니다.
3. 데이터를 가져올 때 복잡한 조건이 필요한 경우
이 경우는 QueryDsl을 사용하면 효율적으로 데이터를 가져올 수 있습니다.
우선 QueryDSL을 사용하려면 컴파일 과정을 거쳐야합니다.
메이븐의 경우 우측화면에서 maven 버튼을 누르고 compile버튼을 누르면 compile이 실행이 됩니다.
코드를 컴파일하면 QueryDSL에서 생성된 클래스가 최신 상태이고 도메인 모델 및 쿼리의 현재 상태를 반영하는지 확인할 수 있습니다.
코드를 컴파일하면 target 하위 폴더에 Q가 붙은 객체들이 생성되는 것을 확인할 수 있는데 이 객체들을 활용해 QueryDSL을 작성할 수 있습니다.
QueryDsl을 활용하려면 RepositroyCustom 인터페이스와
이를 구현하는 RepositoryCustomImpl클래스가 필요합니다.
이때 뒤에 ;Impl' 이라는 철자를 붙여줘야 JPA가 인식할 수 있습니다.
customRepositoryCustom에 원하는 메소드를 추상화해놓고
RepositoryCutomImpl 클래스에서 구현합니다.
이렇게하면 문법 오류를 컴파일 단계에서 잡을 수 있습니다.
QueryDsl을 사용할 경우 QItem.item 이런 형식으로 DB에서 객체를 직접 가져올 수 있습니다.
* 참고
여기서 queryFactory는 데이터베이스로부터 Item을 검색하기 위한 쿼리를 생성하고 실행합니다.
offset()과 .limit()은 페이지네이션을 설정하는 부분입니다.
.fetchResults()는 쿼리를 실행하고 결과를 반환하는 메서드입니다.
요약
QueryDSL의 장점
1. 형식 안전성
QueryDSL은 java의 형식 시스템을 활용하여 쿼리가 컴파일 시점에 형식이 안전한지 확인합니다.
이렇게하면 오류를 조기에 발견하고 코드 가독성을 높일 수 있습니다.
2. 표현 구문
QueryDSL은 쿼리 구성을 위한 유창하고 읽기 쉬운 구문을 제공합니다. 다양한 쿼리 조건 및 작업을 처리하기 위한 풍부한 연산자 및 함수 집합을 제공합니다.
3. 코드 생성
QueryDSL은 도메인 모델을 기반으로 쿼리 클래스 또는 쿼리 개체를 생성할 수 있고 이것은 상용구 코드의 양을 줄이는데
도움이 되며 쿼리를 작성하는 보다 간결한 방법을 제공합니다.
4. 통합
QueryDSL은 JPA 및 Hibernate와 같은 널리 사용되는 Java 지속성 프레임워크와 통합되므로 기존프로젝트에 원활하게 통합할 수 있습니다.