스프링 데이터 JPA 페이징과 정렬에 대해 알아보자

반환 타입

  1. Page(org.springframework.data.domain.Page) 형태 : 추가 count 쿼리 결과를 포함하는 페이징을 받을 수 있어
  2. Slice(org.springframework.data.domain.Slice) 형태 : 추가 count 쿼리 없이 다음 페이지만 확인 가능해 ( 내부적으로 limit + 1 로 가져와서 다음 데이터가 있는지 없는지를 체크하는거지)
  3. List : 추가 count 쿼리 없이 결과 반환



페이징과 정렬 사용 예제

1
2
3
4
5
6
Page<Member> findByUsername(String name, Pageable pageable);
Slice<Member> findByUsername(String name, Pageable pageable);
List<Member> findByUsername(String name, Pageable pageable);
List<Member> findByUsername(String name, Sort sort);

//이런식으로 사용할 수 있어.



구체적인 예시

  • 검색조건 : 나이 10살
  • 정렬 조건 : 이름 내림차순
  • 페이징 조건 : 첫 번째 페이지, 페이지당 데이터 3건
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public interface MemberRepository extends Repository<Member, Long> {
Page<Member> findByAge(int age, Pageable pageable);
}

...

@Test
public void page() throws Exception {
//given
memberRepository.save(new Member("member1", 10));
memberRepository.save(new Member("member2", 10));
...

//when
//spring data jpa 페이징은 0 번째 부터 시작이야
PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC,
"username"));
Page<Member> page = memberRepository.findByAge(10, pageRequest);

//then
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(); //다음 페이지가 있는가?
}




카운트 쿼리 분리

위에서 알 수 있듯이 반환형에 따라 count 쿼리의 여부가 결정되어져!

만약 Page 형태의 반환형이어서 count 쿼리가 나간다고 가정하면, 이때 count 쿼리를 커스텀 할 수 있어.

1
2
3
@Query(value = “select m from Member m”,
countQuery = “select count(m.username) from Member m”)
Page<Member> findMemberAllCountBy(Pageable pageable);

이런식으로 말야!!

쿼리가 복잡할 경우 count 쿼리 또한 복잡하게 나가기에 개발자의 최적화가 필요한 경우 위처럼 사용하면 된다 이말이야!










https://www.inflearn.com/course/스프링-데이터-JPA-실전