본문 바로가기
공부

Page로 페이지 처리하기

by son_i 2023. 12. 10.
728x90

Pageable : 페이징을 제공하는 인터페이스

  • getPageNumber() : 현재 페이지 번호를 반환(0부터 시작)
  • getPageSize() : 한 페이지당 최대 항목 수를 반환
  • getOffset() : 현재 페이지의 시작 위치를 반환
  • getSort() : 정렬 정보를 반환
  • next() : 다음 페이지 정보를 반환
  • previous() : 이전 페이지 정보를 반환

* Pageable을 이용하면 페이지 번호, 페이지당 항목 수, 정렬 정보등을 지정할 수 있다.

* Pageable로 지정한 정보들을 가지고 Page 객체를 반환할 수 있고,  Page 객체는 조회된 데이터와 페이지 정보를 함께 갖게 된다.

PagRequset : Spring Data JPA에서 제공하는 Pageable 구현체 중 하나로, 페이지 정보를 생성하는 클래스

- 페이지 번호, 페이지당 항목 수, 정렬 정보를 이용하여  Pageable 인터페이스를 구현한다.

  • page : 조회할 페이지 번호(0부터 시작)
  • size : 한 페이지당 최대 항목 수
  • sort : 정렬 정보(생략 가능)
  • direction : 정렬 방향(ASC, DESC)
  • properties : 정렬 대상 속성명

* PageRequest 객체를 생성하고 JpaRepsitory 메서드 파라미터로 전달하면 Page 객체를 반환하므로, Pagination을 구현할 수 있다.

Page : 페이징 findAll()을 했을 때 나오는 반환타입 중 하나

 

페이징 결과 반환타입

Page<T> : offset과 totalPage를 이용하여 서비스를 제공할 수 있게 됨. 일반적인 게시판 형태의 페이징에서 사용

  총 페이지 수를 포함하여 반환함

 

Slice<T> : 더보기 형태의 페이징에서 사용

 

List<T> : count 쿼리 없ㅇ리 결과만 반환한다.


사용

컨트롤러에 파라미터로 Pageable을 추가하면 페이징 관련 쿼리가 나온다.

 

springboot 내부에서 url 파라미터가 컨트롤러에 바인딩 될 때 Pageable이 존재하면 pageRequest 객체를 생성한다.

 

Repository에서 Pageable을 인자로 받고 Page를 반환하는 findByProductName 메소드 생성

 

이게 ES의 도큐먼트에서 가져오는 것이라서 반환결과는 Page<ProductDocument>인데 서비스에서 컨트롤러로 응답 값을 보내줄 땐 Page<SearchProduct.Response> 타입이어야한다.

 

그래서 스트림을 이용해 넘어온 요소의 하나하나를 ProductDocument -> SearchProduct.Response 타입으로 변환해주고

.collect를 이용해 리스트로 변환한다음 new PageImpl<>() 소괄호 안에 넣어줘서 리스트 타입을 다시 Page타입으로 변환할 수 있게 해줬다.