728x90
Paging / Pagination
- DB에 저장된 데이터들을 페이지에 맞춰서 몇 개씩 뿌릴건지 알려주는 것
- DB에 저장된 데이터가 20개이고 프론트에서 1페이지에 5개씩 이라고 요청하면
- 백엔드에서 전체 DB에서 데이터를 앞에서부터 5개씩 분류하여 해당 페이지에 맞는 데이터를 넘겨줌.
JPA - Pageable
- 이를 위해서 JPA에서 Pageable이라는 객체를 제공하고있다.
- Pageable이란?Pageable 이 Pagination 요청 정보를 담기위한 추상 인터페이스 라는 의미/실제로 쓰기 위해서는 구현체가 필요
- class QPageRequest : QueryDSL 을 위한 Pageable 구현체
- class PageRequest : 가장 기본적인 Pageable 구현체
- enum Unpaged : pagination 정보가 없는 것을 표현하기위한 구현체. INSTANCE 를 가지고 있다.
이 중 가장 기본이 되는 PageRequest 를 가장 많이 사용 (보통 Cusotom Query를 사용해서 같이 사용함.)
Repository
public interface MeetingRepository extends JpaRepository<Meeting,Long> {
Page<Meeting> findAllByOrderByCreatedAtDesc( Pageable pageable);
Contoroller
@GetMapping
public ResponseDto<Page<MeetingResponseDto>> getAllMeeting(@PageableDefault(size = 12) Pageable pageable) {
return ResponseDto.success(meetingService.getAllMeeting(pageable));
}
👉 Pageable을 객체로 넘기면서 Repository에서 원하는 만큼의 Page를 반환 받는다.
Service
public Page<MeetingResponseDto> getAllMeeting(Pageable pageable) {
Page<Meeting> meetingList = meetingRepository.findAllByOrderByCreatedAtDesc(pageable);
List<MeetingResponseDto> meetingResponseDtoList = new ArrayList<>();
for (Meeting meeting : meetingList) {
MeetingResponseDto meetingResponseDto = new MeetingResponseDto(meeting);
meetingResponseDtoList.add(meetingResponseDto);
}
return new PageImpl<>(meetingResponseDtoList, pageable, meetingList.getTotalElements());
}
👉 new PageImpl 구현체를 사용하여 Page를 반환해주면 된다
Page의 구현체 PageImpl 를 반환 해주면 된다.
- content : 해당 페이지에 들어갈 내용 (리스트)
- pageable : 요청한 페이지의 정보
- total : 들어갈 내용들의 양 (총 데이터의 갯수)
Postman 조회
- 파라미터 정보 없이 요청한 경우
- totalPages : 총 페이지 수
- totalElements : DB의 전체 데이터 갯수
- last : 마지막 페이지 인지
- size : 페이지 당 나타낼 수 있는 데이터의 갯수
- number : 현재 페이지의 번호
- sort
- Sorting에 대한 값을 설정하는 파라미터. 기본적으로 오름차순.
- 표기는 정렬한 필드명 , 정렬기준(ex. sort=title,asc sort=rank,desc)
- 현재는 설정이 되어있지 않아 sorted = false로 나와있다.
- numberOfElements : 실제 데이터의 갯수
- first : 첫번째 페이지 인지
- empty : 리스트가 비어있는지 여부
size = 2 로 보낸 경우 (?size=2)
- size가 2로 변경이 되어있고 첫번째 페이지만 출력이 된 걸 알수 있다.
728x90
'개-발 > Database' 카테고리의 다른 글
[QueryDSL] Predicate / BooleanBuilder (1) | 2023.03.15 |
---|---|
[QueryDSL] Projection 조회 (0) | 2023.03.15 |
[QueryDSL] 페이징 최적화 (fetchResult Deprecated) (0) | 2023.01.28 |
[Jpa] jpaRepository + Query DSL 둘 다 사용하기 (0) | 2023.01.28 |
[SQL] 집합 연산 (0) | 2023.01.11 |