OrderSpecifier
🧭 OrderSpecifier
정의
OrderSpecifier는 Querydsl에서 정렬 기준을 객체로 표현하는 클래스이다.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()에 전달해 동적 정렬을 구현할 때 사용한다.- 단일 정렬, 다중 정렬, 조건부 정렬 모두 처리할 수 있다.
댓글남기기