Page
와 Slice
는 Spring Data JPA에서 페이징 처리 시 사용하는 두 가지 리턴 타입으로, 각각 페이징 데이터를 다루는 방식이 약간 다릅니다. 또한 Sort
와 Limit
을 함께 사용하여 데이터를 정렬하거나 특정 개수만 조회할 수도 있습니다.
Page와 Slice
Spring Data JPA에서 Page
와 Slice
는 페이징된 결과를 나타내기 위한 인터페이스로, 보통 페이징 기능이 필요한 메서드에서 사용됩니다.
- Page
- 전체 데이터 개수와 총 페이지 수 정보를 함께 제공합니다.
Page
객체는 전체 페이지 정보(getTotalPages()
)와 전체 요소의 수(getTotalElements()
) 등을 포함하여, 데이터의 총 개수를 알고 싶은 경우 적합합니다.Page
는 모든 페이지의 정보를 계산하므로, 다소 무거울 수 있지만 페이징 UI에 유리합니다.
위 코드에서Page<User> users = userRepository.findAll(PageRequest.of(0, 10, Sort.by("name").ascending()));
findAll
메서드는Page<User>
타입을 반환하며, 페이지 수나 전체 데이터 개수를 조회할 수 있습니다. - Slice
Slice
는 다음 페이지가 있는지 여부만 확인하고, 전체 데이터 개수는 확인하지 않습니다.Slice
객체는 다음 페이지가 있는지 여부만을 확인하는 용도로 가벼운 페이징 처리가 필요할 때 적합합니다.- 대량의 데이터에서 성능을 고려해 페이징할 때 주로 사용되며,
hasNext()
를 통해 다음 페이지의 존재 여부를 확인합니다.
위 코드에서Slice<User> users = userRepository.findAllByActiveTrue(PageRequest.of(0, 10, Sort.by("name").ascending()));
Slice<User>
를 사용하면 다음 페이지가 존재하는지 여부만 확인하며, 전체 페이지 수는 계산하지 않으므로Page
보다 가볍습니다. - 맞습니다!
Slice
는 특히 무한 스크롤이나 대량 데이터 처리 시 성능상 이점이 있는 상황에서 적합합니다. 말씀하신 두 가지 경우를 조금 더 상세하게 설명드리겠습니다.
1. 무한 스크롤 방식에서의 Slice 사용
무한 스크롤 UI는 사용자가 페이지 하단으로 스크롤할 때마다 데이터를 순차적으로 불러오는 방식입니다. 이 방식에서는 전체 데이터 개수를 알 필요 없이, 다음 페이지가 있는지 여부만 확인하면 됩니다.
Slice
는 전체 페이지나 데이터 개수를 계산하지 않고, 다음 페이지가 존재하는지만 확인하므로 필요한 데이터만 효율적으로 불러올 수 있습니다. 이렇게 하면 불필요한 카운트 작업을 줄이고, 데이터를 점진적으로 로딩할 수 있어 성능이 크게 향상됩니다.
예시 코드
Slice<User> usersSlice = userRepository.findByActiveTrue(PageRequest.of(page, size));
List<User> users = usersSlice.getContent();
if (usersSlice.hasNext()) {
// 다음 페이지가 있으면 추가 데이터 로드
}
- hasNext():
Slice
는hasNext()
메서드를 통해 다음 페이지가 있는지 확인할 수 있습니다. - 무한 스크롤: 이 방식을 활용하면 사용자가 페이지 하단에 도달할 때마다 추가 데이터를 요청하고, 다음 페이지 여부만 확인해 데이터를 추가로 불러올 수 있습니다.
2. 대량 데이터 처리 시 Slice 사용
대량의 데이터를 처리해야 할 때, 전체 데이터 개수를 카운트하는 작업은 비용이 많이 들고 성능에 큰 부담을 줄 수 있습니다. 특히 데이터베이스 규모가 클수록, 전체 개수를 계산하는 쿼리가 응답 속도를 저하시킬 가능성이 큽니다.
Slice
는 전체 개수를 계산하지 않으므로 이러한 성능 부담을 줄일 수 있습니다. Page
와 달리 전체 데이터 개수를 신경 쓰지 않고 페이지 단위로 데이터만 받아오므로 빠르게 필요한 데이터만 조회할 수 있습니다.
예시 코드
Slice<Order> ordersSlice = orderRepository.findByStatus("completed", PageRequest.of(page, size));
List<Order> orders = ordersSlice.getContent();
if (ordersSlice.hasNext()) {
// 다음 페이지가 있으면 추가로 조회 가능
}
이처럼 Slice
는 전체 데이터 개수를 계산하지 않고도 다음 페이지로의 접근만 필요할 때 가볍고 빠른 페이징을 가능하게 해줍니다.
요약
- 무한 스크롤: 전체 데이터 개수 없이 필요한 데이터만 불러오는 UI에서
Slice
가 적합합니다. - 대량 데이터 처리: 대량 데이터를 다룰 때 전체 카운트를 생략하고 성능을 최적화할 수 있어, 데이터 조회를 더 효율적으로 할 수 있습니다.
Slice
는 이처럼 불필요한 작업을 줄이고 성능을 개선하는 데 유리한 선택입니다.
Sort와 Limit
- Sort
- Spring Data JPA는
Sort
객체를 통해 결과를 특정 속성 기준으로 정렬할 수 있습니다. - 정렬은
PageRequest
와 함께Sort.by()
메서드를 통해 사용할 수 있으며, 오름차순과 내림차순을 지원합니다.
위 코드에서는List<User> users = userRepository.findAll(Sort.by("name").ascending());
name
필드를 기준으로 오름차순 정렬된User
리스트가 반환됩니다. - Spring Data JPA는
- Limit
- JPA는 SQL의
LIMIT
처럼 직접적으로 제한을 거는 기능은 제공하지 않지만, 페이징을 통해 비슷한 효과를 낼 수 있습니다. - 특정 개수만큼 데이터 제한을 두려면
PageRequest
나Slice
를 사용하여 페이지 크기(size)를 설정할 수 있습니다.
status
가"active"
인 사용자 중에서 최대 5개의 결과만 가져옵니다. - JPA는 SQL의
PageRequest pageRequest = PageRequest.of(0, 5); // 첫 번째 페이지, 5개 제한 List<User> users = userRepository.findByStatus("active", pageRequest).getContent();
요약
- Page: 전체 데이터 개수와 총 페이지 수를 포함한 페이징 정보를 제공합니다. 페이징 UI와 같은 경우에 적합합니다.
- Slice: 다음 페이지 여부만 확인하여 가볍게 페이징을 처리할 수 있습니다.
- Sort: 특정 필드를 기준으로 결과를 정렬할 수 있습니다.
- Limit: JPA에서는 직접적인
LIMIT
은 없지만,PageRequest
를 사용해 원하는 개수만큼 데이터 조회가 가능합니다.
'JPA' 카테고리의 다른 글
파싱(Parsing), 파생(Derived), 선언된 쿼리 (5) | 2024.11.05 |
---|---|
하이버네이트(Hibernate) (0) | 2024.10.09 |
N+1 문제 해결방법 (0) | 2024.09.25 |
JPQL과 QueryDSL (3) | 2024.09.24 |
더티 체킹(Dirty Checking) ( 변경 감지 ) (1) | 2024.09.23 |