페이징 처리가 되는 목록 데이터는 크게 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;
}