TIL - #34 SpringData JPA와 Paging

Quann·2023년 2월 16일
0

00. 개요

Spring Data JPA를 사용하면 제공해주는 기능으로 Paging 이 존재한다.

한번에 모든 데이터를 긁어오기에는 서버에 부하를 줄 수 있어, 페이징을 통해 데이터를 적당히 끊어서 찾아와주는 것인데,

쿼리문에서 offset과 limit 문을 통해 데이터를 적당량 가져오는 것을 지원해주는 기능이다.

이에 대해 이론적인 부분을 학습해 작성하고자 한다.


01. 페이징 레포지토리?

가장 하위의 JpaRepository의 경우, 그 위로 ListPagingAndSortingRepository와 PagingAndSortingRepository를 순서대로 상속받고있는 형태이다.

여기서 PagingAndSortingRepository가 페이징과 소팅에 관련된 기능을 제공해준다.

해당 페이징 처리의 프로세스의 경우 다음과 같은 순서로 진행된다.

  1. PageRequest 를 사용하여 Pageable에 페이징 정보를 담아 객체화 한다.
  2. Pageable을 JpaRepository가 상속된 인터페이스의 메서드에 T(Entity)와 함께 파라미터로 전달한다.
  3. 2번에 대한 리턴 타입으로 Page<T>가 응답 된다.
  4. 응답된 Page<T>에 담겨진 Page 정보를 바탕으로 로직을 처리하면 된다.

이를 위해 필요한 Pageable 객체의 경우
PageRequest.of() 메서드를 통해 만들 수 있으며, Pageable 인터페이스안에 정보를 담아 반환해준다.

이를 통해 페이징을 요청하게 되고, 이를 통해 요청된 로직에서 Page 안에 정보를 담아주어 return하게 된다. 해당 객체 내에는 pageable, totalPages, totalElements, number, size, first, empty 와 같은 정보들이 존재해 유용한 정보를 뽑아서 쓸 수 있게 해준다.


02. 반환 타입

이러한 페이지 반환 타입의 경우, 3가지가 있는데 상황에 따라 필요한 리턴타입을 명시해 사용해주면된다.

02.01. Page 타입

  • 게시판 형태의 페이징에서 사용된다.
  • 전체 요소 갯수도 함께 조회한다. (totalElements)

02.02. Slice 타입

  • 더보기 형태의 페이징에서 사용된다.
  • 전체 요소 갯수 대신 offset 필드로 조회할 수 있다.
    • 따라서 count 쿼리가 발생되지 않고 limit+1 조회를 한다.

List 타입

  • 전체 목록보기 형태의 페이징에서 사용된다.
  • 기본 타입으로 count 조회가 발생하지 않는다.

03. 정렬

PageRequest.of() 메서드의 매개변수를 보면 알 수 있듯이, 정렬 기준을 정해줄수도 있다.

Sort 클래스를 통해 값을전달해주며 되며, 방향 또한 정해줄 수 있다.

Sort sort1 = Sort.by("id").descending();     // id 기준 내림차순
Sort sort2 = Sort.by("name").ascending();  // 이름 기준 오름차순

이후 PageRequest.of(int page, int size, Sort sort) 에 인자 값으로 전달해주면 해당 정렬 기준을 바탕으로 페이징되어 값을 받을 수 있게 된다.


04. 결론

Pageable과 PageRequest 등의 사용법과 PageImpl 을 통한 구현, Sort 를 통한 정렬 등에 대해서는 기존에 알고 있었지만, 이론적 부분에 대한 학습을 통해 더 깊이 파악하는 시간을 가졌다.

학습하는 과정에서, Slice와 List 를 통한 리턴타입 받기 등에 대해 알게 되었고,

각각의 장단점이 존재해 필요에 따라 적당한 리턴타입을 받아 추가적인 쿼리를 발생시키지 않도록 해야겠다고 생각했다.

물론 감을 잡는데 까지는 시간이 걸리겠지만, 안다는 것 만으로도 생각할 수 있는 기회가 주어진 것이라 생각한다.


05. 오늘의 한 문단

시작이 반이다.

profile
코드 중심보다는 느낀점과 생각, 흐름, 가치관을 중심으로 업로드합니다!

2개의 댓글

comment-user-thumbnail
2023년 2월 16일

?

1개의 답글