[스프링 데이터 JPA] 페이징과 정렬

sonnng·2023년 12월 7일
0

Spring

목록 보기
35/41
post-thumbnail

페이징과 정렬 파라미터

org.springframework.data.domain 패키지를 기준으로 스프링 Data JPA의 페이징과 정렬을 사용할 수 있다.

페이징과 정렬 파라미터

  • Sort : 정렬 기능
  • Pageable : 페이징 기능(내부에 Sort포함)

특별한 반환 타입

  • Page : 추가 count 쿼리 결과를 포함하는 페이징
  • Slice : 추가 count 쿼리 없이 다음 페이지만 확인이 가능(내부적으로 limit+1조회 :: 이유는 다음 페이지 여부를 확인하기 위함, 모바일 리스트를 생각해보면 현재 페이지에서 다음 페이지가 없으면 버튼도 비활성화 된다.)
  • List : 추가 count 쿼리 없이 결과만 반환
Page<Member> findByUsername(String name, Pageable pageable); //count 쿼리 사용 
Slice<Member> findByUsername(String name, Pageable pageable); //count 쿼리 사용 안 List<Member> findByUsername(String name, Pageable pageable); //count 쿼리 사용 안 List<Member> findByUsername(String name, Sort sort);


검색조건으로 나이가 10살, 정렬조건으로는 이름으로 내림차순, 페이징 조건은 첫번째 페이지, 페이지당 보여줄 데이터는 3건으로 해본다.

MemberRepository에는 다음의 한줄만 필요하다.

Page<Member> findByAge(int age, Pageable pageable);

Pageable은 인터페이스다. 따라서 실제 사용할 때는 해당 인터페이스를 구현한 PageRequest 객체를 사용해야한다. PageRequest 생성자의 첫번째 파라미터는 현재 페이지를, 두번째 페이지는 페이지당 보여줄 데이터 수를 입력한다. 추가적으로 정렬정보도 파라미터로 사용할 수 있다. (참고로, 페이지는 0부터 시작한다는 점에 유의한다.)


 PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, 
"username"));
 Page<Member> page = memberRepository.findByAge(10, pageRequest);

이렇게 페이지 정보를 받을 수 있고, Page 인터페이스에서 사용할 수 있는 메서드에는 이렇게 있다.

List<Member> content = page.getContent(); //조회된 데이터
assertThat(content.size()).isEqualTo(3); //조회된 페이지당 데이터 수
assertThat(page.getTotalElements()).isEqualTo(5); //전체 데이터 수
assertThat(page.getNumber()).isEqualTo(0); //페이지 번호
assertThat(page.getTotalPages()).isEqualTo(2); //전체 페이지 번호
assertThat(page.isFirst()).isTrue(); //첫번째 항목인가?
assertThat(page.hasNext()).isTrue(); //다음 페이지가 있는가?

추가적으로, Page인터페이스에서 사용할 수 있는 count 정보는 JPA 쿼리에서 이렇게 사용할 수 있다.

@Query(value = "select m from Member m",
       countQuery = "select count(m.username) from Member m") 
Page<Member> findMemberAllCountBy(Pageable pageable);

페이지를 유지하면서 엔티티를 DTO로 변환하는 것이 유지보수에도 좋을 것이다.

Page<Member> page = memberRepository.findByAge(10, pageRequest); 
Page<MemberDto> dtoPage = page.map(m -> new MemberDto());

다음 시간에는 스프링 데이터 JPA에서 제공하는 페이징 정보를 Web에서 사용하는 것으로 확장해본다.

0개의 댓글