페이지네이션

InSeok·2022년 9월 9일
0

TIL

목록 보기
34/51

배운 내용


페이징(Paging)

  • 데이터 목록은 한 번에 불러오고 보여주기 어려워, 그 일부만 가져와서 보여주는 방법

LIMIT 을 이용해 직접 쿼리작성 (mysql)

  • LIMIT 구문은 데이터를 원하는 만큼 가져오고 싶을 때 사용
  • limit 3,2 : 3번째 데이터부터 두 개를 가져오겠다 (3번째, 4번째 데이터 가져옴)
  • pagesize 가 주어졌을 때 SELECT * FROM table LIMIT (page-1)*size, size
    쿼리를 날리면 원하는 데이터만 뽑아올 수 있다.

Spring Data Jpa 사용

장점

  • Pageable 객체를 사용해 pagination 정보를 쉽게 관리
  • Jpa 쿼리 메서드의 파라미터로 Pageable 을 넘겨서 쉽게 DB에 쿼리를 날릴 수 있다.

Pageable

  • Pagination 요청 정보를 담기위한 추상 인터페이스
  • `class PageRequest` : 가장 기본적인 Pageable 구현체

PagingAndSortingRepository

  • JpaRepository 와 CrudRepository 사이에 있으며, 해당 Repository를 상속받아 아래의 메서드를 실행하면된다.
  • Page findAll(Pageable pageable)
    • 사용예제:

      @Repository
      public interface UserRepository extends JpaRepository<User, Long> {
          Page<User> findAll(Pageable pageable);
      		//findAllByOrderByUserIdDesc(Pageable pagaeble); userId기준 내림차순으로 바로 받아올수도 있다.
      }
  • Page : Pagination 에 필요한 정보를 담는 객체, 요청받은 데이터들 외에 전체페이지수, 현재페이지번호 등 여러 부가정보를 담고있다

요청으로부터 Pageable 객체 만들기

  • 쿼리 파라미터로 pagesize 가 오면 다음과 같은 방법으로 Pageable 객체를 만들 수 있다.
  • PageReqeust.of() 라는 메서드에 page, size, sort 를 원하는대로 파라미터로 넘겨서 생성하면 된다.
// PageRequsst 메서드 정의
public static PageRequest of(int page, int size, Sort sort) {
	return new PageRequest(page, size, sort);
}

//PageRequest 사용예제
public Page<Member> findMembers(int page, int size) {
        return memberRepository.findAll(PageRequest.of(page, size,
                Sort.by("memberId").descending()));
    }

//Controller에서 page, size 받아와서 findMembers 호출 page는 0부터 시작이기 때문에 page -1
// Page 객체의 getContent를 호출해 실제 데이터를 받아오기(추후에 DTO객체로 전환)
public ResponseEntity getMembers(@Positive @RequestParam int page,
                                     @Positive @RequestParam int size) {
        Page<Member> pageMembers = memberService.findMembers(page - 1, size);
        List<Member> members = pageMembers.getContent();

참조: https://velog.io/@chlee4858/Jpa-Pagination-구현하기

https://velog.io/@bagt/0704-Spring-Pagination-API-페이지네이션

profile
백엔드 개발자

0개의 댓글