개발/JPA

QueryDsl sort 정렬 기능 추가

nix-be 2024. 1. 18. 23:56
728x90

1. 문제점

  • 기존 회사 코드에서 QueryDSL sort 기능의 정렬 오류 발생
  • 반복적인 if else 구문 사용으로 인한 유지보수 어려움

2. 개선사항

  • 코드 간결화 및 가독성 향상
  • if else 구문 제거를 통한 유지보수 용이성 강화
  • 정렬 기준 추가 시 간편한 코드 수정 가능

 

  • 기존 예시 코드
final Sort sort = pageable.getSort();
if (sort != null) {
    for (Sort.Order sortOrder : sort) {
        String property = sortOrder.getProperty();
        boolean isAscending = sortOrder.isAscending();
        
        if (property.equals("someProperty1")) { 
            if (isAscending) {
                jpaQuery.orderBy(entity.someProperty1.asc());
            } else {
                jpaQuery.orderBy(entity.someProperty1.desc());
            }
        } else if (property.equals("someProperty2")) {
            if (isAscending) {
                jpaQuery.orderBy(entity.someProperty2.asc());
            } else {
                jpaQuery.orderBy(entity.someProperty2.desc());
            }
        } 
        
    }
}

 

  • 개선 코드
private OrderSpecifier<?> dynamicSort(Pageable pageable) {
    // 실제 엔티티의 QueryDSL 객체를 대입해야 합니다.
    QEntity entity = QEntity.entity;  

    if (pageable.getSort() != null) {
        for (Sort.Order order : pageable.getSort()) {
            Order direction = order.getDirection().isAscending() ? Order.ASC : Order.DESC;

            switch (order.getProperty()) {
                case "property1":
                    return new OrderSpecifier<>(direction, entity.property1);
                case "property2":
                    return new OrderSpecifier<>(direction, entity.property2);
                case "property3":
                    return new OrderSpecifier<>(direction, entity.property3);
                // 필요한 만큼 추가적인 속성을 더할 수 있습니다.
                default:
                // 기본적으로 id로 정렬
                    return new OrderSpecifier<>(direction, entity.id);  
            }
        }
    }
    return null;  
}
728x90