QueryDSL - 동적정렬

구본식·2022년 9월 25일
0

1. 필요한 상황과 사용절차

흔히 아는 최신순, 좋아요순, 댓글순과 같이 동적으로 정렬기준이 바뀌는 상황에서는 동적 sorting을 해야된다.
offset, limit는 pageagle에서 정보를 동적으로 값을 변경하여 사용할수 있다.
더불어 PageReqeust(상의 클래스는 Pageable) 정적메소드에 정렬기준(order by) 인자도 넣을 수 있다.

실제 사용할 쿼리문에 위에서 정의한 정렬 기준를 OrderSpecifier 객체를 사용해서 생성한 후 쿼리문에 넣게되면 동적정렬 이 가능해진다.

2. Pageable Sort 객체 생성

// 페이징, 정렬 기준 세팅하기
 List<Sort.Order> orders = new ArrayList<>();
 orders.add(Sort.Order.desc(searchForm.getOrderKey()));
 Pageable pageable = PageRequest.of(0,3, Sort.by(orders)); //3개 씩

동적으로 정렬기준을 처리하기 위해 클라이언트에게 정렬기준이 되는 컬럼명을 받아온다.
여기서는 searchForm.getOrderKey()에 "최근순", "댓글순", "좋아요순"에 해당하는 컬렴명이 담겨진다.

받아온 컬럼 기준의 오름차순, 내림차순을 설정하고 난뒤 Sort객체로 생성하고 Pageable를 생성할때 인자로 전달해준다.

위 코드에서 정렬기준을 List로 전달하였는데 현재 프로젝트에서는 정렬기준이 하나씩만 있으면 되므로 사실상 List로 사용하지 않아도된다. 하지만 List로 여러개의 정렬을 설정할수 있기 때문에 한번 해보았다.

3. OrderSpecifier 객체 생성 및 쿼리문 작성

첫번째 인자에는 Pageable에 담아뒀던 Sort정보가 들어가게 된다. 그리고 두번째 인자에는
정렬 되는 칼럼의 Path로 기준이 되는 칼럼과 그 칼럼이 속한 엔티티가 합쳐진 것입니다.
예를 들어 Post 엔티티에 postId로 정렬기준을 잡는다면 Post객체.postId가 되는 것입니다.

//동적 정렬
for(Sort.Order o : pageable.getSort()) {
       PathBuilder pathBuilder = new PathBuilder(QPost.post.getType(), QPost.post.getMetadata());
       query.orderBy(new OrderSpecifier(o.isAscending() ? Order.ASC: Order.DESC, pathBuilder.get(o.getProperty())));
 }

Pagealbe에 담아논 Sort객체들을 하나씩 꺼내어 정렬기준 컬럼명과PathBuilder를 통해 Path를 만들어 OrderSpecifier객체의 인자로 전달해준다.

그렇게 되면 쉽게 볼수 있는 조회순, 최신순, 좋아요순 등과 같은 동적정렬을 구현할수 있다.

profile
백엔드 개발자를 꿈꾸며 기록중💻

0개의 댓글