페이징과 정렬 파라미터
- org.springframework.data.domain.Sort : 정렬 기능
- org.springframework.data.domain.Pageable : 페이징 기능 (내부에 Sort 포함)
특별한 반환 타입
- org.springframework.data.domain.Page : 추가 count 쿼리 결과를 포함하는 페이징
- org.springframework.data.domain.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);
위는 그냥 JpaRepository 상속받은 Repository에서 위 처럼 Querymethod로 쓰던 어떻게 하던, 그냥 정의하고 파라메터로 Pageable 인터페이스 받게 만들면 된다.
Repository에 반환타입을 Page<###> 로 return하면, Spring Data Jpa가 알아서 total Count도 계산해서 return 하게 되어 있다. (왜냐하면 Page 처리할 때 원래 Total Count 값을 사용하게되는 케이스가 많아서 한 번에 계산하게 구현된 것 같음)
Page 쓰면 totalCount 쿼리를 매번 호출하게 되는데, 데이터가 많아질수록 이 작업은 부담스러운 작업이다.
이 과정을 최적화 하는 방법중에 countQuery를 별도로 지정하는 방법이 있다.
이유는 countQuery를 별도로 지정하지 않으면 원본 쿼리에 join 같은 작업이 있으면 count 하는 과정에서도 불필요한 join 작업을 수행하고 count 되기 때문이다.
@Query(value = "select m from Member m left join m.team t",
countQuery = "select count(m) from Member m")
Page<Member> findByAge(int age, Pageable pageable);
Slice는 Count를 안가져오기 때문에 당연히 getTotalElements(), getTotalPages() 메서드가 존재하지 않고 해당 기능을 사용할 수 없다.
'JPA' 카테고리의 다른 글
JPA Entity에 index 거는 방법 (0) | 2022.11.26 |
---|---|
객체지향 쿼리 언어(JPQL) (0) | 2022.09.03 |
순수 JPA 페이징과 정렬 (0) | 2022.05.06 |
JPA 모델링 설계하는 순서 (0) | 2022.04.09 |
엔티티 매핑 (0) | 2022.04.09 |
댓글