🧭 OrderSpecifier

정의

OrderSpecifierQuerydsl에서 정렬 기준을 객체로 표현하는 클래스이다. orderBy()에 전달해 동적 정렬을 구현할 때 사용한다.

정렬 컬럼과 방향을 코드로 분리해 두면 검색 조건에 따라 유연하게 정렬을 바꿀 수 있다.

🧩 역할

  • 정렬 조건을 객체로 표현한다
  • 동적 정렬을 구현한다
  • 여러 정렬 조건을 배열 형태로 전달할 수 있다
  • Querydsl의 orderBy()와 함께 사용한다

🛠 사용법

단일 정렬

private OrderSpecifier<?> getOrderSpecifier(String sortKey, String sortOrder) {
    Order order = "ASC".equalsIgnoreCase(sortOrder) ? Order.ASC : Order.DESC;

    if ("holidayDate".equals(sortKey)) {
        return new OrderSpecifier<>(order, qHoliday.holidayDate);
    }

    return new OrderSpecifier<>(order, qHoliday.holidayDate);
}

다중 정렬

private OrderSpecifier<?>[] getOrderSpecifiers(String sortKey, String sortOrder) {
    List<OrderSpecifier<?>> orderSpecifiers = new ArrayList<>();
    Order order = "ASC".equalsIgnoreCase(sortOrder) ? Order.ASC : Order.DESC;

    if ("version".equals(sortKey)) {
        orderSpecifiers.add(new OrderSpecifier<>(order, qProcessVersion.majorVersion));
        orderSpecifiers.add(new OrderSpecifier<>(order, qProcessVersion.minorVersion));
    } else {
        orderSpecifiers.add(new OrderSpecifier<>(Order.DESC, qProcessVersion.majorVersion));
        orderSpecifiers.add(new OrderSpecifier<>(Order.DESC, qProcessVersion.minorVersion));
    }

    return orderSpecifiers.toArray(new OrderSpecifier[0]);
}

CaseBuilder와 함께 사용

OrderSpecifier<Integer> orderSpecifier = new CaseBuilder()
        .when(qRobot.robotStatusCode.eq("CNCT")).then(1)
        .when(qRobot.robotStatusCode.eq("REG")).then(2)
        .when(qRobot.robotStatusCode.eq("DSCN_SVR")).then(3)
        .otherwise(7)
        .asc();

🧩 특징

  • 정렬 기준과 방향을 명확하게 표현한다
  • 단일 정렬과 다중 정렬 모두 처리할 수 있다
  • 조건에 따라 정렬 컬럼을 바꿀 수 있다
  • CaseBuilder와 함께 복잡한 정렬 순서도 만들 수 있다

⚠️ 주의사항

  • 정렬 키 문자열은 외부 입력을 직접 신뢰하지 않는 것이 좋다.
  • 정렬 방향은 ASC, DESC만 허용하도록 제한하는 편이 안전하다.
  • 복잡한 정렬은 메서드로 분리해서 재사용하는 것이 좋다.
  • nullsFirst, nullsLast가 필요한 경우 별도 고려가 필요하다.

📌 정리

  • OrderSpecifier는 Querydsl의 정렬 표현 클래스다.
  • orderBy()에 전달해 동적 정렬을 구현할 때 사용한다.
  • 단일 정렬, 다중 정렬, 조건부 정렬 모두 처리할 수 있다.

연결문서

댓글남기기