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/

'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

+ Recent posts