Spring Data JPA를 사용하면 제공해주는 기능으로 Paging 이 존재한다.
한번에 모든 데이터를 긁어오기에는 서버에 부하를 줄 수 있어, 페이징을 통해 데이터를 적당히 끊어서 찾아와주는 것인데,
쿼리문에서 offset과 limit 문을 통해 데이터를 적당량 가져오는 것을 지원해주는 기능이다.
이에 대해 이론적인 부분을 학습해 작성하고자 한다.
가장 하위의 JpaRepository의 경우, 그 위로 ListPagingAndSortingRepository와 PagingAndSortingRepository를 순서대로 상속받고있는 형태이다.
여기서 PagingAndSortingRepository가 페이징과 소팅에 관련된 기능을 제공해준다.
해당 페이징 처리의 프로세스의 경우 다음과 같은 순서로 진행된다.
T(Entity)
와 함께 파라미터로 전달한다.Page<T>
가 응답 된다.Page<T>
에 담겨진 Page 정보를 바탕으로 로직을 처리하면 된다.이를 위해 필요한 Pageable 객체의 경우
PageRequest.of()
메서드를 통해 만들 수 있으며, Pageable
인터페이스안에 정보를 담아 반환해준다.
이를 통해 페이징을 요청하게 되고, 이를 통해 요청된 로직에서 Page
안에 정보를 담아주어 return하게 된다. 해당 객체 내에는 pageable, totalPages, totalElements, number, size, first, empty 와 같은 정보들이 존재해 유용한 정보를 뽑아서 쓸 수 있게 해준다.
이러한 페이지 반환 타입의 경우, 3가지가 있는데 상황에 따라 필요한 리턴타입을 명시해 사용해주면된다.
totalElements
)offset
필드로 조회할 수 있다.PageRequest.of()
메서드의 매개변수를 보면 알 수 있듯이, 정렬 기준을 정해줄수도 있다.
Sort 클래스를 통해 값을전달해주며 되며, 방향 또한 정해줄 수 있다.
Sort sort1 = Sort.by("id").descending(); // id 기준 내림차순
Sort sort2 = Sort.by("name").ascending(); // 이름 기준 오름차순
이후 PageRequest.of(int page, int size, Sort sort)
에 인자 값으로 전달해주면 해당 정렬 기준을 바탕으로 페이징되어 값을 받을 수 있게 된다.
Pageable과 PageRequest 등의 사용법과 PageImpl 을 통한 구현, Sort 를 통한 정렬 등에 대해서는 기존에 알고 있었지만, 이론적 부분에 대한 학습을 통해 더 깊이 파악하는 시간을 가졌다.
학습하는 과정에서, Slice와 List 를 통한 리턴타입 받기 등에 대해 알게 되었고,
각각의 장단점이 존재해 필요에 따라 적당한 리턴타입을 받아 추가적인 쿼리를 발생시키지 않도록 해야겠다고 생각했다.
물론 감을 잡는데 까지는 시간이 걸리겠지만, 안다는 것 만으로도 생각할 수 있는 기회가 주어진 것이라 생각한다.
시작이 반이다.
?