Spring 숙련 (페이징)

KimGwangmin·2026년 9월 15일

페이징

목록을 정해진 개수씩 나눠 조회하는 방식

게시판이든, 이메일이든, 쇼핑 페이지든, 한 번에 특정 개수만큼만 불러오게 구현된다.
대량의 데이터를 한 번에 전부 불러오는 것은 성능 부하도 크고, 실효성도 낮다. (게시판에 수 천 개의 게시글 목록이 한 번에 보여지더라도 사용자가 느끼는 편리함은 딱히 없을 테니까)

Pagable, Page

  • Pagable: 어떻게 가져올지 결정
    • 몇 번째 페이지를, 한 페이지에 몇 개씩 읽을지 담는 객체
    • PageRequest.of(페이지 번호, 개수)로 생성
      • 다음과 같이 정렬 기준 설정 가능
      PageRequest.of(2, 10, Sort.by("createdAt").descending());
    • 페이지 번호는 0부터 시작
    • 레포지토리의 findAll(pagable)에 넘기면 해당 페이지의 데이터만 조회
      • JpaRepository를 상속했다면 별도 선언 없이 사용 가능
      • 커스텀 메서드에도 인자에 pagable을 넣어주면 JPA가 알아서 처리해준다
      Page<Member> findByName(String name, Pageable pageable);

  • Page<T>: 가져온 결과 데이터
    • findAll(pagable)이 반환하는 객체
    • getContent()를 통해 페이지의 데이터 목록을 얻을 수 있다

컨트롤러 메서드

@GetMapping("/posts")  
public ResponseEntity<List<String>> posts(  
        @RequestParam int page,  
        @RequestParam int size) {  
    return ResponseEntity.ok(postService.page(page, size));  
}

서비스 메서드

@Transactional(readOnly = true)
public List<String> page(
        int page,
        int size) {
    Pageable pageable = PageRequest.of(page, size);
    Page<Post> found = postRepository.findAll(pageable);
    return found.getContent().stream()
            .map(Post::getTitle)
            .toList();
}

0개의 댓글