• 페이징 처리
    • 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
          • pageNumber
            • 요청한 페이지 번호반환
          • pageSize
            • 한 페이지당 데이터 수. 기본값 20.
          • sort
            • 정렬정보 반환
        • 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 클래스에 구현돼 있으므로, 해당 메서드에서 구현된 대로 매개변수의 순서를 반드시 위와 일치하여 사용