백엔드/Spring Data JPA

Spring Data JPA 페이징 처리

manchesterandthecity 2025. 7. 16. 21:00

📄 Spring Data JPA 페이징 처리 완벽 정리

- Pageable, Page, Slice를 활용한 효율적인 Pagination


✅ 1. 왜 페이징 처리가 필요할까?

대량의 데이터를 한 번에 모두 불러오는 것은
📉 성능 저하, 😵 메모리 낭비, ⛔ 네트워크 부담을 일으킵니다.

👉 그래서 데이터를 페이지 단위로 나눠서 요청하는 페이징(Pagination)이 필요합니다!


🔧 2. Spring Data JPA가 제공하는 페이징 기능

Spring Data JPA는 페이징을 위해 다음 두 가지를 제공합니다:

타입 특징
Pageable 페이징 조건 (page 번호, 크기, 정렬 기준 등)
Page<T> 페이징 결과 (컨텐츠 + 전체 개수 + 페이지 정보 포함)
Slice<T> 페이징 결과 (컨텐츠 + 다음 페이지 여부만 제공, count 쿼리 없음)

🧩 3. 페이징 기본 사용법

📍 ① Repository 메서드 정의

Page<Member> findByTeamName(String teamName, Pageable pageable);

✔ Pageable을 파라미터로 추가하면 자동으로 페이징 기능이 활성화됩니다.


📍 ② Controller에서 요청 받기

@GetMapping("/members")
public Page<MemberDto> getMembers(@RequestParam String teamName, Pageable pageable) {
    return memberRepository.findByTeamName(teamName, pageable)
                           .map(MemberDto::from);
}

✔ Pageable은 스프링이 자동으로 바인딩해줍니다.
예: /members?teamName=A&page=0&size=5&sort=age,desc


📍 ③ Page 객체로 응답 받기

Page는 다음 정보를 포함합니다:

  • getContent() : 현재 페이지의 데이터 리스트
  • getTotalElements() : 전체 데이터 수
  • getTotalPages() : 전체 페이지 수
  • getNumber() : 현재 페이지 번호
  • hasNext() / isFirst() / isLast() : 페이지 상태

🛠 4. 예제

📌 Repository

public interface MemberRepository extends JpaRepository<Member, Long> {
    Page<Member> findByTeamName(String teamName, Pageable pageable);
}

📌 Controller

@GetMapping("/members")
public Page<MemberDto> getMembers(@RequestParam String teamName, Pageable pageable) {
    return memberRepository.findByTeamName(teamName, pageable)
                           .map(MemberDto::from);
}

📌 Request URL 예시

/members?teamName=dev&page=0&size=5&sort=age,desc

🔄 5. Page, Slice, List 차이점

반환 타입 count 쿼리 다음 페이지 여부 전체 페이지 수
Page<T> ✅ 실행함 ✅ 포함 ✅ 포함
Slice<T> ❌ 없음 ✅ 포함 ❌ 없음
List<T> ❌ 없음 ❌ 없음 ❌ 없음
 

✔ Slice는 무한 스크롤이나 다음 페이지 여부만 필요한 경우에 적합


🎯 6. 정렬 사용하기

PageRequest.of(page, size, Sort.by(...))를 활용해 정렬도 적용할 수 있습니다.

Pageable pageable = PageRequest.of(0, 10, Sort.by("age").descending());

✔ 여러 필드 정렬도 가능:

Sort sort = Sort.by("teamName").ascending().and(Sort.by("age").descending());

🎨 7. 프론트 UI 연동 팁

  • Spring에서 Page<T>를 그대로 반환하면 JSON으로 다음과 같이 직렬화됨:
{
  "content": [...],
  "totalElements": 120,
  "totalPages": 12,
  "size": 10,
  "number": 0,
  "sort": {...},
  "first": true,
  "last": false
}

✔ 프론트에서는 이 데이터를 기반으로 페이지네이션 버튼이나 "다음" 버튼을 구성할 수 있습니다.


✅ 마무리 요약

항목 내용
페이징 도구 Pageable, Page<T>, Slice<T>
기본 사용 방식 리포지토리에서 Pageable 받는 메서드 선언
정렬 방식 URL 파라미터 or PageRequest.of(..., Sort)
반환 정보 Page는 전체 정보, Slice는 다음 페이지 여부 중심
활용 예 목록 조회, 검색 결과, 무한 스크롤 등
 

Spring Data JPA의 페이징은 단순한 기능 그 이상입니다.
성능 최적화와 사용자 경험을 모두 고려한 정교한 데이터 처리 전략입니다.