- 페이징 처리
- Spring Data JPA에서는 일반적으로 Page와 Pageable 인터페이스를 활용하여 페이징 처리
- Pageable 객체
- Pageable은 요청 파라미터(page, size, sort)를 캡슐화하는 입력 인터페이스
- 현재 페이지 번호(page), 페이지당 항목 수(size), 정렬 정보 등을 포함
- ?page를 통한 파라미터값이 없을경우, 기본 page파라미터는 0
- ?size를 통한 파라미터값이 없을경우, 기본 페이지당 항목수는 20
- ?sort정보가 없을경우에는, 정렬 없음이 기본
- Pageable 객체는 아래와 같이 최종적으로 리포지토리 메소드에 매개변수로 전달되어, 특정 페이지의 데이터를 조회하는 데 사용
- Page<T> findAll(Pageable pageable);
- Page객체
- Page객체는 전체 데이터 수, 전체 페이지 수, 현재 페이지 번호, 페이지당 데이터 수 등 페이징 처리에 필요한 다양한 정보를 제공하는 출력 인터페이스
- json 실제 데이터 예시
- 주요요소
- content
- 실제 조회된 엔티티 목록(List)
- 예시)"content": [ { Post }, { Post }, ... ]
- pageable
- totalPages
- 검색객체(Specification)
- Spring Data JPA Specification은 SQL의 WHERE 절을 자바 객체로 분해해서 조립하는 도구
- 사용 목적
- 동적 조건 처리
- 복잡한 검색 조건 조합
- 쿼리 조건 분리 및 재사용
- 구성 요소
- Root
- 엔티티의 속성을 접근하기 위한 객체
- 예시)
- root.get("title")
- root.get("createdAt")
- CriteriaBuilder
- WHERE 조건을 만드는 생성 도구
- equal, like, greaterThan, and, or 등 키워드 사용
- 예시)
- cb.equal(root.get("status"), "OPEN")
- cb.like(root.get("title"), "%spring%")
- cb.greaterThan(root.get("id"), 10L)
- cb.and(...)
- cb.or(...)
- Predicate
- 위의 검색 조건들을 하나(한줄)의 Predicate객체로 만들어서 리스트형태의 조건을 최종적으로 한줄의 쿼리로 조합
- Pageable객체와 함께 사용시
- repository에 아래와 같이 메서드 선언
- Page<Post> findAll(Specification<Post> specification, Pageable pageable);
- 실질적인 구현체는 SimpleJpaRepository 클래스에 구현돼 있으므로, 해당 메서드에서 구현된 대로 매개변수의 순서를 반드시 위와 일치하여 사용