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로 변환하는 방법
'JPA' 카테고리의 다른 글
[JPA] countQuery (0) | 2024.11.10 |
---|---|
[JPA] @OneToOne, 일대일 관계 (0) | 2024.02.26 |
[JPA] 값 타입 (Value Object) (0) | 2024.02.26 |
[JPA] SQL 쿼리를 활용 (0) | 2024.02.19 |
[JPA] 식별자 생성 (0) | 2024.02.19 |