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로 변환하는 방법

 

 

 

참고 : https://gksdudrb922.tistory.com/