Tech/JPA

Slice vs Page: 슬라이스 방식과 페이징 방식

봄의 개발자 2023. 9. 22.
728x90
반응형

1. 슬라이스 조회 (Slice)

특징

  • 슬라이스 조회는 Spring Data JPA에서 제공하는 기능으로, 결과 데이터를 슬라이스(일부) 형태로 가져온다.
  • 슬라이스는 페이지 크기와 현재 페이지 번호에 따라 정의되며, 페이지 크기에 맞게 결과 데이터를 가져온다.
  • 슬라이스를 사용하면 일부 데이터만 로드되므로 메모리 사용을 최적화할 수 있다.
  • Spring Data JPA의 Slice<T> 타입을 사용하여 결과를 반환합니다.

장점

  • 메모리 사용을 효율적으로 관리하며, 대용량 데이터셋을 다룰 때 성능을 최적화할 수 있다.
  • 사용자 인터페이스에서 무한 스크롤과 같은 기능을 구현하는 데 적합하다.

단점

  • 정렬 기준 및 방향을 지정하는 등 추가적 설정이 필요할 수 있다.
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.Sort;

// 슬라이스 조회 인터페이스
public interface UserRepository extends JpaRepository<User, Long> {
    Slice<User> findAllByLastName(String lastName, Pageable pageable);
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Slice;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/users")
    public Slice<User> getUsersByLastName(
            @RequestParam String lastName,
            @RequestParam int page,
            @RequestParam int size
    ) {
        PageRequest pageRequest = PageRequest.of(page, size, Sort.by("id"));
        return userRepository.findAllByLastName(lastName, pageRequest);
    }
}

 

 

2. 페이징 조회 (Page)

특징

  • 페이징 조회는 결과 데이터를 페이지 단위로 가져오는 방법이다.
  • Spring Data JPA의 Page<T> 또는 Pageable 객체를 사용하여 페이지별 결과를 반환한다.
  • 페이지 번호와 페이지 크기를 지정하여 데이터를 가져온다.
  • 전체 페이지 수와 전체 항목 수를 함께 반환하기 때문에 페이지 관리에 용이하다.

장점

  • 페이지 번호와 페이지 크기를 쉽게 관리하며, 사용자에게 페이징된 데이터를 제공하는 데 용이하다.
  • 대용량 데이터셋을 처리할 때도 효과적으로 사용된다.

단점

  • 페이지마다 데이터베이스 쿼리가 실행되므로, 큰 페이지 수나 무한 스크롤을 구현할 때 성능 이슈가 발생할 수 있다.
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

// 페이징 조회 인터페이스
public interface UserRepository extends JpaRepository<User, Long> {
    Page<User> findAllByLastName(String lastName, Pageable pageable);
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/users")
    public Page<User> getUsersByLastName(
            @RequestParam String lastName,
            @RequestParam int page,
            @RequestParam int size
    ) {
        PageRequest pageRequest = PageRequest.of(page, size);
        return userRepository.findAllByLastName(lastName, pageRequest);
    }
}
728x90
반응형

댓글