본문 바로가기

Spring/JPA

Spring JPA - 특수 매개변수 처리

 

 

쿼리의 매개변수를 처리하려면 메서드 매개변수를 정의해야한다.

그 외에도 인프라는 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()));