전 도메인(Area, Category, Store) 공통 적용 허용 size 제한 · 정렬 화이트리스트 · 전용 응답 래퍼
size=9999 처럼 임의로 큰 값을 보낼 경우 DB 풀스캔 및 서버 부하 발생 가능Page<T> 를 그대로 반환하면 내부 구현 정보(sort 객체 구조 등)가 그대로 노출됨허용된 size 값이 아니면 자동으로 기본값 10으로 보정함
private static final Set<Integer> ALLOWED_PAGE_SIZES = Set.of(10, 30, 50);
private static final int DEFAULT_PAGE_SIZE = 10;
public static int validate(int pageSize) {
return ALLOWED_PAGE_SIZES.contains(pageSize) ? pageSize : DEFAULT_PAGE_SIZE;
}
| 클라이언트 요청 size | 실제 적용 size |
|---|---|
| 10 / 30 / 50 | 그대로 적용 |
| 그 외 (1, 20, 999 ...) | 10으로 보정 |
createPageable()
Area, Category — int page, int size 를 직접 받는 경우
public static Pageable createPageable(int page, int size) {
int validatedPage = Math.max(page, 0); // 음수 페이지 방지
int validatedSize = PageSizePolicy.validate(size);
return PageRequest.of(
validatedPage,
validatedSize,
Sort.by(Sort.Direction.DESC, "createdAt") // 기본 정렬 고정
);
}
applyPageSizePolicy()
Store — Pageable 객체를 그대로 받는 경우 (외부 정렬 허용)
public static Pageable applyPageSizePolicy(Pageable pageable) {
int validatedSize = PageSizePolicy.validate(pageable.getPageSize());
if (validatedSize == pageable.getPageSize()) {
return pageable;
}
return PageRequest.of(
pageable.getPageNumber(),
validatedSize,
pageable.getSort()
);
}
createdAt DESC 로 고정이라 createPageable() 사용applyPageSizePolicy() 로 size만 보정 후 정렬은 QueryDSL 화이트리스트에서 처리