05. 페이징 처리

유승욱·2024년 5월 10일
0

Spring&React Project

목록 보기
5/9

페이징 처리가 되는 목록 데이터는 크게 1) 해당 페이지의 TodoDTO 리스트와 2) 페이지 번호, 전체 데이터 수, 이전/다음 페이지 처리에 필요한 부가적인 데이터로 구성될 수 있다. 부가적인 데이터를 프론트엔드쪽에서 처리할 수도 있지만 서버에서 데이터의 가공이 많을수록 프론트엔드에서 작업이 편해진다.

PageRequestDTO

@Data
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
public class PageRequestDTO {

    @Builder.Default
    private int page = 1;
    @Builder.Default
    private int size = 10;
}

PageResponseDTO

@Data
public class PageResponseDTO<E> {

    private List<E> dtoList;
    private List<Integer> pageNumList;
    private PageRequestDTO pageRequestDTO;
    private boolean prev, next;
    private int totalCount, prevPage, nextPage, totalPage, current;

    @Builder
    public PageResponseDTO(List<E> dtoList, PageRequestDTO pageRequestDTO, long totalCount) {
        this.dtoList = dtoList;
        this.pageRequestDTO = pageRequestDTO;
        this.totalCount = (int)totalCount;

        int end = (int)(Math.ceil(pageRequestDTO.getPage() / 10.0)) * 10;

        int start = end - 9;

        // 진짜 마지막
        int last = (int) (Math.ceil((totalCount / (double) pageRequestDTO.getSize())));

        end = end > last ? last : end;

        this.prev = start > 1;

        this.next = totalCount > end * pageRequestDTO.getSize();

        this.pageNumList = IntStream.rangeClosed(start, end).boxed().collect(Collectors.toList());

       this.prevPage = prev ? start - 1 : 0;
       this.nextPage = next ? end + 1 : 0;

        this.totalPage = this.pageNumList.size();
        this.current = pageRequestDTO.getPage();
    }
}

public Page<Todo> search1(PageRequestDTO pageRequestDTO) {
        log.info("search1...............");

        QTodo todo = QTodo.todo;

        JPQLQuery<Todo> query = from(todo);

        Pageable pageable = PageRequest.of(pageRequestDTO.getPage() - 1, pageRequestDTO.getSize(), Sort.by("tno").descending());

        this.getQuerydsl().applyPagination(pageable, query);

        List<Todo> list = query.fetch();// 목록 데이터

        long total = query.fetchCount();

        return new PageImpl<>(list, pageable, total);
    }
public PageResponseDTO<TodoDTO> getList(PageRequestDTO pageRequestDTO) {
        Page<Todo> result = todoRepository.search1(pageRequestDTO);

        List<TodoDTO> dtoList = result.get().map(todo -> entityToDTO(todo))
            .collect(Collectors.toList());

        PageResponseDTO<TodoDTO> responseDTO = PageResponseDTO.<TodoDTO>builder()
            .dtoList(dtoList)
            .pageRequestDTO(pageRequestDTO)
            .totalCount(result.getTotalElements())
            .build();

        return responseDTO;
    }

0개의 댓글