페이징과 정렬 파라미터
Sort : 정렬 기능
Pageable : 페이징 기능( 내부 Sort 포함 )
특별한 반환 타입
1. Page : 추가 count 쿼리 결과를 포함하는 페이징
→ 일반적인 페이징
2. Slice : 추가 count 쿼리 없이 다음 페이지만 확인가능
→ 스크롤 내리다 더보기 버튼 생성 하는 페이징
3. List : 추가 count 쿼리 없이 결과만 반환한다.
※ 여기서 count는 total count를 의미
Page<Member> findByAge(int age, Pageable pageable);
<test code>
@Test
public void paging() throws Exception{
//given
memberRepository.save(new Member("member1", 10));
memberRepository.save(new Member("member2", 10));
memberRepository.save(new Member("member3", 10));
memberRepository.save(new Member("member4", 10));
memberRepository.save(new Member("member5", 10));
int age = 10;
PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username"));
// Slice 는 total count를 하지 않음 -> 더보기 버튼을 위해 3개를 보여주려면 4개를 가져와서 하나를 더보기 버튼으로 보여줌
// Slice<Member> page = memberRepository.findByAge(age, pageRequest);
Page<Member> page = memberRepository.findByAge(age, pageRequest);
// page를 저 위에 대로 반환하면 큰일난다.
// controller에서 entity를 노출시키면 안된다.
// entity는 애플리케이션 내에서만 간직 -> dto로 변경해서 반환해야함
Page<MemberDto> toMap = page.map(member -> new MemberDto(member.getId(), member.getUsername(), null));
//then
List<Member> content = page.getContent();
long totalElements = page.getTotalElements(); // total count
assertThat(content.size()).isEqualTo(3); // 한페이지 게시글 개수
assertThat(page.getTotalElements()).isEqualTo(5); // 총 게시글 수
assertThat(page.getNumber()).isEqualTo(0); // 페이지 번호
assertThat(page.getTotalPages()).isEqualTo(2); // 전체 페이지 개수 (5개를 3개씩 나누니까 페이지 2개)
assertThat(page.isFirst()).isTrue(); // 첫번째 페이지 인가?
assertThat(page.hasNext()).isTrue(); // 다음 페이지가 있나?
}
@Query를 사용해서 page 를 구현 할 때 join이 이루어지면 total count 쿼리도 join 해서 불러오기 때문에 성능이 저하될 수 있다.
→ 쿼리가 복잡해 질 수록 total count는 간단하게 불러 올 수있도록 따로 쿼리를 만들어줘야함!(아래 예시)
@Query(value="select m from Member m left join m.team t",
countQuery="select count(m) from Member m") // 쿼리가 복잡해지면 total count를 구하는 쿼리를 따로 만들어줘야한다.
Page<Member> findByAge(int age, Pageable pageable);
참고사항
- page는 0부터 시작한다.
- controller에서는 entity 로 반환하면 안되다! → entity는 노출 금지 (Dto로 반환해줘야함)
'JAVA' 카테고리의 다른 글
[JAVA] Auditing (0) | 2022.02.24 |
---|---|
[JAVA] 벌크성 수정 쿼리와 @EntityGraph (0) | 2022.02.23 |
[JAVA] return type(Optional) (0) | 2022.02.16 |
[JAVA] @Query에서 DTO로 조회하기 (0) | 2022.02.15 |
[JAVA] @NamedQuery 와 @Query (0) | 2022.02.15 |