인프런에 김영한님의 Querydsl 강의를 듣고 작성했습니다.
이름에서 알 수 있듯이 querydsl에서 repository를 support하기 위한 클래스이다.
장점
getQuerydsl().applyPagination() 스프링 데이터가 제공하는 페이징을 Querydsl로 편리하게 변환
가능(단! Sort는 오류발생)
from() 으로 시작 가능(최근에는 QueryFactory를 사용해서 select() 로 시작하는 것이 더 명시적)
EntityManager 제공
한계
Querydsl 3.x 버전을 대상으로 만듬
Querydsl 4.x에 나온 JPAQueryFactory로 시작할 수 없음
select로 시작할 수 없음 (from으로 시작해야함)
QueryFactory 를 제공하지 않음
스프링 데이터 Sort 기능이 정상 동작하지 않음
support클래스 직접 만들기
장점
스프링 데이터가 제공하는 페이징을 편리하게 변환
페이징과 카운트 쿼리 분리 가능
스프링 데이터 Sort 지원
select() , selectFrom() 으로 시작 가능
EntityManager , QueryFactory 제공
QuerydslItemRepositorySupport - 부모클래스
아래 그림처럼 repositoryImpl Class에서 extends 해주면된다.
이때 Impl생성자에서 Item.class를 부모 클래스인 QuerydslItemRepositorySupport의 생성자에 인자로 전달한다.
일반적인 get메서드와 select, selectFrom을 사용하기위한 메서드,필드에 주입해주는 메서드 설명은 생략했다.
applyPagination 메서드
인자를 먼저 보면
Pageable, JPAQuery<Long>, Function<JPAQueryFactory, JPAQuery>
3개를 받는모습을 볼 수 있는데,
호출하는 부분을 보면 이해하기 쉬우니 아래에 호출하는 부분을 보자!
pageable은 전달받은 그대로 인자로 넘겨주고,
countQuery는 아이템 전체 개수 조회하는 메서드인itemCount()에서 조회해서 countQuery를 넘겨 준다.
ItemRepositoryImpl 클래스의 items 메서드
마지막 인자인 Function<JPAQueryFactory, JPAQuery> 에 해당하는 부분을 보면
contentQuery -> contentQuery.selectFrom(item)
으로 람다식을 인자로 전달한다.(잘 모른다면 java8의 람다식을 공부 해야한다.) 함수형 인터페이스중 하나인 Function은 JPAQueryFactory
타입을 인자로 받고 JPAQuery
타입의 리턴값이 있다.
저 람다식을 실행하는 코드는 applyPagination 메서드안에 contentQuery.apply(getQueryFactory())
로 실행된다.
getQuerydsl().applyPagination() :
QueryDsl클래스의 applyPagination 메서드가 실행된다. 아래 사진을 보면 offset과 limit 그리고 Sort도 처리 해주는것을 볼 수 있다.
Querydsl 클래스의 applyPagination 메서드
테스트에서 Pageable요청을 아래와 같이 담아서 보내면
price기준으로 내림차순 적용된걸 확인 할 수 있었다.