PageRequest 는 Pageable 구현체로 찾을 Page Index 정보, Paging 할 Size 를 이용해 생성할 수 있습니다. 만약 정렬햇 Paging 을 할 경우 Sort 객체를 추가로 넣어줄 수 있습니다.
PageRequestpageRequest= PageRequest .of(0, 3);// Page Index가 0부터 시작한다. // username 으로 정렬 후 Paging 합니다. PageRequestpageRequest= PageRequest .of(0, 3, Sort.by(Sort.Direction.DESC, "username"));// Page Index가 0부터 시작한다.
테스트 코드 작성
Page 객체로 반환
// when Page<Member> page = memberRepository.findPageByAge(10, pageRequest);
// then List<Member> content = page.getContent(); longtotalElement= page.getTotalElements();
for (Member member : content) { System.out.println("member : " + member); } System.out.println("totalElements : " + totalElement);
assertThat(content.size()).isEqualTo(3); // paging 된 element 개수를 가져온다. assertThat(page.getTotalElements()).isEqualTo(5); // 전체 element 개수를 가져온다. assertThat(page.getNumber()).isEqualTo(0); // paging 시작 index를 가져온다. assertThat(page.getTotalPages()).isEqualTo(2); // page 개수를 가져온다. assertThat(page.isFirst()).isTrue(); // 첫번째 page인지 확인 assertThat(page.hasNext()).isTrue(); // 다음 page가 있는지 확인
assertThat(content.size()).isEqualTo(3); // paging 된 element 개수를 가져온다. assertThat(slice.getNumber()).isEqualTo(0); // paging 시작 index를 가져온다. assertThat(slice.isFirst()).isTrue(); // 첫번째 page인지 확인 assertThat(slice.hasNext()).isTrue(); // 다음 page가 있는지 확인
List 객체로 반환
List<Member> list = memberRepository.findListByAge(10, pageRequest);
// when Page<Member> page = memberRepository.findPageByAge(10, pageRequest);
// then List<Member> content = page.getContent(); longtotalElement= page.getTotalElements();
for (Member member : content) { System.out.println("member : " + member); } System.out.println("totalElements : " + totalElement);
assertThat(content.size()).isEqualTo(3); // paging 된 element 개수를 가져온다. assertThat(page.getTotalElements()).isEqualTo(5); // 전체 element 개수를 가져온다. assertThat(page.getNumber()).isEqualTo(0); // paging 시작 index를 가져온다. assertThat(page.getTotalPages()).isEqualTo(2); // page 개수를 가져온다. assertThat(page.isFirst()).isTrue(); // 첫번째 page인지 확인 assertThat(page.hasNext()).isTrue(); // 다음 page가 있는지 확인
assertThat(content.size()).isEqualTo(3); // paging 된 element 개수를 가져온다. assertThat(slice.getNumber()).isEqualTo(0); // paging 시작 index를 가져온다. assertThat(slice.isFirst()).isTrue(); // 첫번째 page인지 확인 assertThat(slice.hasNext()).isTrue(); // 다음 page가 있는지 확인
List<Member> list = memberRepository.findListByAge(10, pageRequest);
assertThat(content.size()).isEqualTo(3); // paging 된 element 개수를 가져온다. assertThat(pageDivideCount.getTotalElements()).isEqualTo(5); // 전체 element 개수를 가져온다. assertThat(pageDivideCount.getNumber()).isEqualTo(0); // paging 시작 index를 가져온다. assertThat(pageDivideCount.getTotalPages()).isEqualTo(2); // page 개수를 가져온다. assertThat(pageDivideCount.isFirst()).isTrue(); // 첫번째 page인지 확인 assertThat(pageDivideCount.hasNext()).isTrue(); // 다음 page가 있는지 확인 }
Count 쿼리 분리하기
Page 객체를 반환하게 될 경우 Count 쿼리도 같이 실행이 된다. 이때 실행하고 싶은 Count 쿼리를 별도로 작성해 실행 시킬 수 있다.
@Query 사용시 countQuery 속성을 이용해 Count 쿼리를 분리할 수 있습니다.
Count 쿼리를 염두해 둬야 하는 이유는 객체끼리의 연관관계가 있을 경우 잘 못하면 N+1 의 문제가 발생할 수 있다.
// Count 쿼리 분리 @Query(value = "select m from Member m left join m.team t", countQuery = "select count(m.username) from Member m") Page<Member> findPageDivideCountByAge(int age, Pageable pageable);