백엔드/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의 페이징은 단순한 기능 그 이상입니다.
성능 최적화와 사용자 경험을 모두 고려한 정교한 데이터 처리 전략입니다.