- Querydsl
- JPQL의 컴파일 시점 오류 확인 불가
- 쿼리 가독성과 타입 안정성을 보장하여 유지보수 용이
디렉토리 구조
| 기능 | 메서드 | 엔드포인트 | Query Params | status |
|---|---|---|---|---|
| 상품 생성 | POST | /products | 201 | |
| 상품 단건 조회 | GET | /products/{productId} | 200 | |
| 상품 전체 목록 조회 (페이지네이션) | GET | /products | page, size, sort, productName | 200 |
| 허브 등록 상품 목록 조회 (페이지네이션) | GET | /products/hubs/{hubId} | page, size, sort, productName | 200 |
| 업체 등록 상품 목록 조회 (페이지네이션) | GET | /products/companies/{companyId} | page, size, sort, productName | 200 |
| 상품 수정 | PATCH | /products | 204 | |
| 상품 삭제 | DELETE | /products | 200 |
-
유저 권한별 각 기능 유효성 검증
-
DTO의
record타입 사용- 클라이언트의 요청에 대한 불변성과 안정성을 명시
-
Pageable의sort쿼리 - 정렬 조건 타입 안정화- 정해진 정렬 조건만 허용 - 예기치 못한 쿼리 또는 에러 발생 방지
SortTypeENUM@Getter @RequiredArgsConstructor public enum SortType { CREATED_ASC("createdAt", Sort.Direction.ASC), CREATED_DESC("createdAt", Sort.Direction.DESC), UPDATED_ASC("updatedAt", Sort.Direction.ASC), UPDATED_DESC("updatedAt", Sort.Direction.DESC), PRICE_ASC("orderPrice", Sort.Direction.ASC), PRICE_DESC("orderPrice", Sort.Direction.DESC), ; private final String value; private final Sort.Direction direction; public static void validate(Sort sort) { for (Sort.Order order : sort) { boolean valid = Arrays.stream(SortType.values()) .anyMatch(sortType -> sortType.value.equalsIgnoreCase(order.getProperty()) && sortType.getDirection().equals(order.getDirection())); if (!valid) { throw new CustomRuntimeException(ProductException.UNSUPPORTED_SORT_TYPE); } } } }
-
Querydsl의getOrderSpecifier()을 통한 동적 정렬 조건 쿼리 구현- 클라이언트가 여러 개의
sort쿼리를 넘길 수 있도록 하여.orderBy()에 적용private OrderSpecifier<?>[] getOrderSpecifiers(Sort sort) { List<OrderSpecifier<?>> orderSpecifiers = new ArrayList<>(); for (Sort.Order sortOrder : sort) { Order order = sortOrder.isAscending() ? Order.ASC : Order.DESC; // 정렬 방향 PathBuilder<Product> pathBuilder = new PathBuilder<>(product.getType(), product.getMetadata()); orderSpecifiers.add(new OrderSpecifier<>(order, pathBuilder.getString(sortOrder.getProperty()))); } return orderSpecifiers.toArray(new OrderSpecifier[0]); }
- 클라이언트가 여러 개의