PageSliceSpring Data JPA에서 페이징 처리 시 사용하는 두 가지 리턴 타입으로, 각각 페이징 데이터를 다루는 방식이 약간 다릅니다. 또한 SortLimit을 함께 사용하여 데이터를 정렬하거나 특정 개수만 조회할 수도 있습니다.

Page와 Slice

Spring Data JPA에서 PageSlice페이징된 결과를 나타내기 위한 인터페이스로, 보통 페이징 기능이 필요한 메서드에서 사용됩니다.

  1. Page
    • 전체 데이터 개수총 페이지 수 정보를 함께 제공합니다.
    • Page 객체는 전체 페이지 정보(getTotalPages())와 전체 요소의 수(getTotalElements()) 등을 포함하여, 데이터의 총 개수를 알고 싶은 경우 적합합니다.
    • Page는 모든 페이지의 정보를 계산하므로, 다소 무거울 수 있지만 페이징 UI에 유리합니다.
    Page<User> users = userRepository.findAll(PageRequest.of(0, 10, Sort.by("name").ascending()));
    위 코드에서 findAll 메서드는 Page<User> 타입을 반환하며, 페이지 수나 전체 데이터 개수를 조회할 수 있습니다.
  2. Slice
    • Slice다음 페이지가 있는지 여부만 확인하고, 전체 데이터 개수는 확인하지 않습니다.
    • Slice 객체는 다음 페이지가 있는지 여부만을 확인하는 용도로 가벼운 페이징 처리가 필요할 때 적합합니다.
    • 대량의 데이터에서 성능을 고려해 페이징할 때 주로 사용되며, hasNext()를 통해 다음 페이지의 존재 여부를 확인합니다.
    Slice<User> users = userRepository.findAllByActiveTrue(PageRequest.of(0, 10, Sort.by("name").ascending()));
    위 코드에서 Slice<User>를 사용하면 다음 페이지가 존재하는지 여부만 확인하며, 전체 페이지 수는 계산하지 않으므로 Page보다 가볍습니다.
  3. 맞습니다! Slice는 특히 무한 스크롤이나 대량 데이터 처리 시 성능상 이점이 있는 상황에서 적합합니다. 말씀하신 두 가지 경우를 조금 더 상세하게 설명드리겠습니다.

1. 무한 스크롤 방식에서의 Slice 사용

무한 스크롤 UI는 사용자가 페이지 하단으로 스크롤할 때마다 데이터를 순차적으로 불러오는 방식입니다. 이 방식에서는 전체 데이터 개수를 알 필요 없이, 다음 페이지가 있는지 여부만 확인하면 됩니다.

Slice는 전체 페이지나 데이터 개수를 계산하지 않고, 다음 페이지가 존재하는지만 확인하므로 필요한 데이터만 효율적으로 불러올 수 있습니다. 이렇게 하면 불필요한 카운트 작업을 줄이고, 데이터를 점진적으로 로딩할 수 있어 성능이 크게 향상됩니다.

예시 코드

Slice<User> usersSlice = userRepository.findByActiveTrue(PageRequest.of(page, size));
List<User> users = usersSlice.getContent();

if (usersSlice.hasNext()) {
    // 다음 페이지가 있으면 추가 데이터 로드
}
  • hasNext(): SlicehasNext() 메서드를 통해 다음 페이지가 있는지 확인할 수 있습니다.
  • 무한 스크롤: 이 방식을 활용하면 사용자가 페이지 하단에 도달할 때마다 추가 데이터를 요청하고, 다음 페이지 여부만 확인해 데이터를 추가로 불러올 수 있습니다.

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

  1. Sort
    • Spring Data JPA는 Sort 객체를 통해 결과를 특정 속성 기준으로 정렬할 수 있습니다.
    • 정렬은 PageRequest와 함께 Sort.by() 메서드를 통해 사용할 수 있으며, 오름차순내림차순을 지원합니다.
    List<User> users = userRepository.findAll(Sort.by("name").ascending());
    위 코드에서는 name 필드를 기준으로 오름차순 정렬된 User 리스트가 반환됩니다.
  2. Limit
    • JPA는 SQL의 LIMIT처럼 직접적으로 제한을 거는 기능은 제공하지 않지만, 페이징을 통해 비슷한 효과를 낼 수 있습니다.
    • 특정 개수만큼 데이터 제한을 두려면 PageRequestSlice를 사용하여 페이지 크기(size)를 설정할 수 있습니다.
    예를 들어, 특정 개수로 제한을 두고 싶을 경우 다음과 같이 설정할 수 있습니다:위 코드에서는 status"active"인 사용자 중에서 최대 5개의 결과만 가져옵니다.
  3. 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

+ Recent posts