순수 JPA 페이징과 정렬


- 검색 조건: 나이가 10살
- 정렬 조건: 이름으로 내림차순
- 페이징 조건: 첫 번째 페이지, 페이지당 보여줄 데이터는 3건
SpringDataJPA 페이징과 정렬
페이징과 정렬 파라미터
org.springframework.data.domain.Sort : 정렬 기능
org.springframework.data.domain.Pageable : 페이징 기능 (내부에 Sort 포함)
두 가지 인터페이스로 페이징, 정렬 기능을 공통화시켜버렸다.

@Test
public void paging(){
//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"));
//부모 인터페이스가 PageAble이다.
//when
Page<Member> page = memberRepository.findByAge(age, pageRequest);
//SpringDataJpa가 Page를 반환해야 되서 totalCount까지 계산해서 쿼리를 실행시켜 반환한다.
//사실 limit로 데이터를 가지고 오는것에 성능이 안나오는 것이 아니라, totalCount 가 성능을 좌지우지 한다.
//Member를 그냥 반환하면 안되고 Dto로 변환하여 반환해야 한다.
Page<MemberDto> toMap = page.map(member -> new MemberDto(member.getId(), member.getUsername(), null));
//then
List<Member> content = page.getContent();
long totalElements = page.getTotalElements();
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();
}
- 성능을 좌지우지하는 것은 결국 TotalCount를 가지고 오는 쿼리인데, 이 쿼리가 main쿼리와 다를 수도 있다.
- 따라서 Count쿼리를 다르게 동작시킬 수 있도록 SpringDataJpa가 지원해준다.
특별한 반환 타입(더보기 버튼)
org.springframework.data.domain.Page : 추가 count 쿼리 결과를 포함하는 페이징
org.springframework.data.domain.Slice : 추가 count 쿼리 없이 다음 페이지만 확인 가능 (내부적으로 limit + 1 조회)
List (자바 컬렉션): 추가 count 쿼리 없이 결과만 반환


- 두 번째 파라미터로 받은 Pagable 은 인터페이스다. 따라서 실제 사용할 때는 해당 인터페이스를 구현한 org.springframework.data.domain.PageRequest 객체를 사용한다.
- PageRequest 생성자의 첫 번째 파라미터에는 현재 페이지를, 두 번째 파라미터에는 조회할 데이터 수를 입력한다. 여기에 추가로 정렬 정보도 파라미터로 사용할 수 있다. 참고로 페이지는 0부터 시작한다.
- 주의 : Page는 1부터가 아닌 0부터 시작이다.
Top, First 사용 참고
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.limitquery-result
Spring Data JPA - Reference Documentation
Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del
docs.spring.io
'실전! 스프링 데이터 JPA' 카테고리의 다른 글
| Ch03. 쿼리 메소드 기능 - @EntityGraph (0) | 2021.12.26 |
|---|---|
| Ch03. 쿼리 메소드 기능 - 벌크성 수정 쿼리 (0) | 2021.12.26 |
| Ch03. 쿼리 메소드 기능 - 반환 타입 (0) | 2021.12.26 |
| Ch03. 쿼리 메소드 기능 - 파라미터 바인딩 (0) | 2021.12.26 |
| Ch03. 쿼리 메소드 기능 - @Query, 리포지토리 메소드에 쿼리 정의하기 (0) | 2021.12.26 |