📑 공통 적용 기술 - 페이지네이션

전 도메인(Area, Category, Store) 공통 적용 허용 size 제한 · 정렬 화이트리스트 · 전용 응답 래퍼

1. 도입 배경

2. PageSizePolicy — size 화이트리스트

허용된 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으로 보정

3. PageableUtils — Pageable 생성 및 보정

  1. 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") // 기본 정렬 고정
        ); 
    }
    
  2. 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()
        );
    }
    

4. PageResponse — 응답 래퍼 DTO