JPA
[JPA] JPA의 페이징 - Pageable
MY_STUDY
2024. 11. 26. 09:57
Pageable
findAll() 과 같은 조회를 하게 된다면 페이징이 필요할 때가 있다.
페이징을 위해 몇 번째 페이지인지에 대한 정보(page) 한 페이지당 보여줄 데이터의 개수(size) 가 필요하다.
예시
@GetMapping
public ResponseEntity<?> page(@RequestParam int page, @RequestParam int size) {
Pageable pageable = PageRequest.of(page, size);
Page<Member> members = memberRepository.findAll(pageable);
return new ResponseEntity<>(members, HttpStatus.OK);
}
pageable을 레포시토리 메서드의 인자로 넘기면 JPA가 알아서 페이징을 처리해 준다.
@GetMapping
public ResponseEntity<?> page(Pageable pageable) {
Page<Member> members = memberRepository.findAll(pageable);
return new ResponseEntity<>(members, HttpStatus.OK);
}
컨트롤러에서 Pageable을 직접 인자로 설정 가능
반환 타입 - Page, Slice, List
Page<Member> page = memberRepository.findAll(pageable);
Slice<Member> slice = memberRepository.findAll(pageable);
List<Member> list = memberRepository.findAll(pageable);
Page : count 쿼리 결과를 포함하는 페이징
Slice : count 쿼리 없이 다음 페이지만 확인 가능 (limit + 1) 예로는 맨 아래쪽에 "더보기" 버튼 누르면 다음 몇 개의 게시글 보여주는 방식 (모바일 무한 스크롤), 데이터 양이 많을 수록 slice를 사용하는 것이 성능상 유리
List : 페이징을 하되 결과를 페이징 정보 없이 단순 List로 받음, 카운트 쿼리 실행 안함
엔티티를 DTO로 변환
Page<Member> page = memberRepository.findAll(pageable);
Page<MemberDto> memberDtos = page.map(m -> new MemberDto(m.getId(), ...생성자 형식));
DTO로 변환하는 방법