Pageable
- 페이징을 제공하는 인터페이스
- Pageable = 프론트에서 JPA Repository에 page와 size를 얼마로 설정해서 요청을 보냈는지에 대한 명령을 담는 데이터 타입
- JPA Repository에서 Pageable 객체를 참고하여 findAll을 실행하면 Page<Entity>형식으로 결과값을 반환함
- Page<Entity> = JPA Repository에서 Pageable 객체를 참고하여 메소드를 실행한 결과값들(Entity들)을 리스트 형식으로 담는 데이터 타입
※ PageRequest.of(page, size) = page와 size에 대한 요청값을 Pageable 객체에 담아 반환하는 메소드
- getTotalPages() = 총 페이지 수 조회
- getTotalElements() = 총 요소의 개수 조회
- getNumber() = 현재 페이지 번호 조회
- getSize() = 페이지당 데이터 개수 조회
- hasNext() = 다음 페이지 존재 여부 반환
- hasPrevious() = 이전 페이지 존재 여부 반환
- getContent() = 데이터 조회
★ 페이지에 대한 요청에 대한 값을 반환할 때는 해당 페이지에 있는 데이터(dtoList), 총 페이지 번호(totalPage), 현재 페이지 번호(page), 페이지 목록 개수(size), 시작 페이지(start)&종료 페이지(end), 이전(prev)&다음(next) 페이지 존재여부, 페이지 출력 개수(pageList) 등을 하나의 객체에 담아 반환해야 좋음
Ex
package com.spring.page.common.dto;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.springframework.data.domain.Page;
import lombok.Data;
@Data
public class PageResultDTO<DTO, EN> {
// DTO 리스트
private List<DTO> dtoList;
// 총 페이지 번호
private int totalPage;
// 현재 페이지 번호
private int page;
// 페이지 목록 개수
private int size;
// 시작 페이지, 종료 페이지
private int start, end;
// 이전, 다음
private boolean prev, next;
// 페이지 출력 개수
private List<Integer> pageList; // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 형태
public PageResultDTO(Page<EN> result, Function<EN, DTO> fn) { //외부에서 메서드 fn을 전달받아서 사용
this.dtoList = result.stream() //Entity로 이루어진 Page를 stream을 통해 DTO로 변환 -> List에 저장
.map(fn)
.collect(Collectors.toList());
this.totalPage = result.getTotalPages();
this.page = result.getPageable().getPageNumber() + 1;
this.size = result.getPageable().getPageSize();
//tempEnd : 해당 page가 속한 페이지 목록의 마지막 번호
int tempEnd = (int)(Math.ceil(page/10.0)) * 10;
// 1~10, 11~20, 21~30, 31~40, 41~50, 51~60, 61~70, 71~80, 81~90, 91~100
this.start = tempEnd - 9;
this.prev = start > 1; //start가 1보다 크면 true, 1이면 false
//totalPage가 tempEnd보다 크면 tempEnd, 작으면 totalPage
this.end = totalPage > tempEnd ? tempEnd : totalPage;
//totalPage가 tempEnd보다 크면 true, 작으면 false -> 다음 버튼 활성화 여부
this.next = totalPage > tempEnd;
this.pageList = IntStream.rangeClosed(this.start, this.end)
.boxed() //int를 Integer로 변환
.collect(Collectors.toList()); // Integer 객체들을 list로 모음
}
}
'빅데이터 부트캠프 > Spring boot' 카테고리의 다른 글
| MyBatis 세팅 (0) | 2022.12.13 |
|---|---|
| 빅데이터 부트캠프 97일차 (0) | 2022.11.23 |
| 빅데이터 부트캠프 95일차 (0) | 2022.11.21 |
| 빅데이터 부트캠프 94일차 (0) | 2022.11.18 |
댓글