개발/부트캠프

본캠프 : Spring Data JPA 페이지네이션(Pagination)

EJ EJ 2025. 2. 17. 20:21

[ Spring Data JPA 페이지네이션(Pagination) ]

Spring Data JPA에서는 Pageable과 Page 인터페이스를 사용하여 데이터를 페이지 단위로 조회할 수 있어요.
이를 통해 대량의 데이터를 한 번에 불러오는 것이 아니라, 필요한 만큼 가져올 수 있도록 해줍니다.

 

페이지네이션 핵심 개념

📌 기본 개념

  1. Pageable : 페이지 정보를 담는 인터페이스
    • 요청한 페이지 번호(page), 페이지 크기(size), 정렬 방식(sort)을 포함
    • PageRequest.of(page, size)를 사용하여 객체 생성
  2. Page<T> : 페이지 결과를 담는 객체
    • getContent() : 현재 페이지의 데이터 리스트
    • getTotalPages() : 전체 페이지 수
    • getTotalElements() : 전체 데이터 개수
    • hasNext(), hasPrevious() : 이전/다음 페이지 여부 확인

📌 데이터베이스에서 어떻게 동작할까?

Spring Data JPA에서 Pageable을 사용하면 자동으로 LIMIT과 OFFSET을 적용한 SQL을 실행해요.

  • LIMIT 5 → 한 번에 5개의 데이터만 가져옴
  • OFFSET 5 → 앞에서 5개를 건너뛰고(= 2페이지 시작점) 조회

 

 

 Pageable을 활용한 페이징 API 구현

(1) Pageable을 사용한 Repository 인터페이스

Spring Data JPA는 JpaRepository에서 Pageable을 자동으로 지원합니다.

 

(2) UserService에서 페이지네이션 적용

Pageable을 받아서 Page<User>를 반환하도록 수정

  • PageRequest.of(page, size, Sort.by("id").descending())
    • page: 가져올 페이지 번호 (0부터 시작)
    • size: 한 페이지에 포함될 데이터 개수
    • Sort.by("id").descending(): id 기준 내림차순 정렬

(3) UserController에서 페이지네이션 적용

컨트롤러에서 @RequestParam을 이용해 쿼리 파라미터로 페이지 정보를 받습니다.

 

(4) 정렬 추가 (Sort.by())

-오름차순 정렬 (기본)

Pageable pageable = PageRequest.of(page, size, Sort.by("name").ascending());

 

-내림차순 정렬

Pageable pageable = PageRequest.of(page, size, Sort.by("name").descending());

 

-다중 정렬 (이름 오름차순, ID 내림차순)

Pageable pageable = PageRequest.of(page, size, Sort.by("name").ascending().and(Sort.by("id").descending()));

 

 

 

 결론

개념 설명
Pageable 페이지 정보를 담는 객체 (page, size, sort)
Page<T> 페이지 결과를 담는 객체 (데이터 + 전체 페이지 수 등)
기본 크기 적용 @RequestParam(defaultValue = "10") int size
페이징 SQL 변환 LIMIT ? OFFSET ? 자동 적용
정렬 적용 Sort.by("column").ascending()/descending()