쿼리의 매개변수를 처리하려면 메서드 매개변수를 정의해야한다.
그 외에도 인프라는 Pageable과 Sort같은 특정 유형을 인식하여 페이지 매김 및 정렬을 쿼리에 동적으로 적용한다.
// 쿼리 메서드에서 Pageable, Slice, Sort 사용
Page<User> findByLastname(String lastname, Pageable pageable);
Slice<User> findByLastname(String lastname, Pageable pageable);
List<User> findByLastname(String lastname, Sort sort);
List<User> findByLastname(String lastname, Pageable pageable);
❗️Sort 및 Pageable을 사용하는 API는 null이 아닌 값이 메서드에 전달될 것으로 예상한다.
❗️정렬이나 페이지 매김을 적용하지 않으려면 Sort.unsorted() 및 Pageable.unpaged() 사용.
1. Page
org.springframework.data.domain.Pageable 인스턴스를 쿼리 메서드에 전달하여 정적으로 정의된 쿼리에 페이징을 동적으로 추가할 수 있다.
Page는 사용 가능한 요소와 페이지의 총 수를 알고 있다.
전체 수를 계산하기 위해 카운트 쿼리를 트리거하는 인프라에 의해 수행된다.
2. Slice
Page는 비용이 많이 들 수 있으므로(사용된 저장소에 따라 다름) 대신 Slice를 반환할 수 있다.
Slice는 다음 Slice가 사용 가능한지 여부만 알고 있으며, 이는 더 큰 결과 집합을 탐색할 때 충분할 수 있다.
3. Sort
정렬 옵션도 Pageable 인스턴스를 통해 처리된다.
정렬만 필요한 경우 메서드에 org.springframework.data.domain.Sort 매개변수를 추가한다.
4. List
List 반환도 가능하다.
실제 Page 인스턴스를 빌드하는 데 필요한 추가 메타데이터가 생성되지 않는다(필요했을 추가 카운트 쿼리가 실행되지 않음을 의미함).
오히려 주어진 엔터티 범위만 조회하도록 쿼리를 제한한다.
✅ 전체 쿼리에 대해 몇 페이지를 얻을 수 있는지 알아보려면 count 쿼리를 추가하여 실행해야 한다.
✅ 기본적으로 이 쿼리는 실제로 트리거한 쿼리에서 파생된다.
페이징 및 정렬
속성 이름을 사용하여 간단한 정렬 식을 정의할 수 있다.
표현식을 연결하여 여러 기준을 하나의 표현식으로 모을수 있다.
// 정렬 표현식 정의
Sort sort = Sort.by("firstname").ascending()
.and(Sort.by("lastname").descending());
보다 안전한 타입의 정렬 식을 정의하려면 정렬 식을 정의할 유형으로 시작하고 메서드 참조를 사용하여 정렬할 속성을 정의한다.
// 안전한 유형의 API를 사용하여 정렬 표현식 정의
TypedSort<Person> person = Sort.sort(Person.class);
Sort sort = person.by(Person::getFirstname).ascending()
.and(person.by(Person::getLastname).descending());
✅ TypedSort.by(…)는 (일반적으로) CGlib를 사용하여 런타임 프록시를 사용하므로 Graal VM Native와 같은 도구를 사용할 때 기본 이미지 컴파일을 방해할 수 있다.
저장소 구현이 Querydsl을 지원하는 경우 생성된 메타모델 유형을 사용하여 정렬 표현식을 정의할 수 있다.
// Querydsl API를 사용하여 정렬 표현식 정의
QSort sort = QSort.by(QPerson.firstname.asc())
.and(QSort.by(QPerson.lastname.desc()));
'Spring > JPA' 카테고리의 다른 글
Spring JPA - 컬렉션(Collections) 또는 이터러블(Iterables)을 반환하는 리포지토리 메서드 (0) | 2022.10.14 |
---|---|
Spring JPA - 쿼리 결과 제한 (0) | 2022.10.14 |
Spring JPA - 속성 표현식 (0) | 2022.10.14 |
Spring JPA - 쿼리 생성 (0) | 2022.10.14 |
Spring JPA - 쿼리 조회 전략 (0) | 2022.10.14 |