스프링 데이터 JPA(2)

‍서지오·2022년 7월 29일
0

스프링

목록 보기
3/4
post-thumbnail

스프링 데이터 JPA를 활용한 페이징과 정렬

페이징이란?

  • DB에 저장되어 있는 엔티티를 불러올 때, 불러온 엔티티 집합을 일정한 크기로 구분하는 것이다.

예를 들어 20개의 엔티티를 5개씩 분류하고 두 번째 페이지를 달라고 요청하면 1~5/6~10/11~15/16~20번 째 엔티티가 들어 있는 집합을 1 페이지 부터 5페이지 까지 할당하고 6~10번 째 엔티티가 들어 있는 두 번째 페이지를 return한다.

순수 JPA를 사용한 페이징

순수Jpa 레포지토리

  • .setFirstResult(offset) : 페이징 시작 지점 설정
  • .setMaxResults(limit) : 페이징 종료 지점 설정
  • 총 row의 수를 알기 위해 totalCount() 메소드를 페이징 메소드와 별도로 두어야 한다.

Spring Data Jpa를 사용한 페이징

How..?

  • 스프링 데이터 레포지토리에 있는 조회 메서드에 파라미터로 Pageable(인터페이스) or PageRequest(구현체) 를 넣어준다.
  • PageRequest에는 조회할 페이지 번호, 한 페이지의 크기, 정렬 기준 정보를 담고 있다.

Repository 구성 모습

  • @Query() 안에 countQuery 변수를 두어 totalCount()를 구하는 쿼리 지정
  • Pageable : 페이징 기능을 제공하는 인터페이스
  • Pageable 내부에 정렬 기능을 제공하는 Sort 인터페이스 포함

페이징 사용 모습

  • PageRequest에 Sort.by(Sort.Direction.DESC, "username") 을 파리미터로 넘겨 정렬 기준을 설정해 주었다.
  • Page가 제공하는 map()을 통해 엔티티를 DTO로 변경 가능하다.
  • page.getContent() : 페이지 내 실제 엔티티를 return
  • page.getTotalElements() : 페이지 내 총 엔티티 수
  • page.getTotalPages() : 페이지 내 총 페이지 수
  • page.isFirst() : 현재 페이지가 첫 번째 페이지 인지 확인
  • page.hasNext() : 다음 페이지 유무 확인

스프링 데이터 JPA의 페이징 사용 시 Page가 1이 아닌 0부터 시작임을 유의해야한다!!

Slice란?

  • 엔티티 조회 시 limit + 1 을 조회하여 다음 페이지 여부를 확인한다.
  • totalCount 조회 X

Page를 사용하게 되면 totalCount를 구해야 하므로 필요한 데이터를 받는 것 외에도 비용이 든다. 만약 totalCount가 필요하지 않은 상황이라면 Slice를 사용하여 totalCount를 구하지 않고 필요한 데이터만 요청할 수 있다.

profile
백엔드 개발자를 꿈꾸는 학생입니다!

0개의 댓글