페이지네이션이란
Laravel의 페이지네이션은 쿼리 빌더 및 Eloquent ORM과 통합되어 있어, 설정 없이 사용할 수 있습니다. 현재 페이지는 HTTP 요청의page 쿼리 파라미터에서 자동으로 취득되며, 생성되는 링크에도 자동으로 부가됩니다.
기본 HTML은 Tailwind CSS에 대응하며, Bootstrap CSS도 선택할 수 있습니다.
3종류의 페이지네이션
기본 사용법
쿼리 빌더의 페이지네이션
Eloquent의 페이지네이션
simplePaginate
총 건수 카운트 쿼리가 불필요한 경우(“이전”·“다음” 링크만 표시)에는simplePaginate()를 사용하면 효율적입니다.
cursorPaginate(커서 페이지네이션)
커서 페이지네이션은 OFFSET 절 대신 WHERE 절을 사용하기 때문에 대량 데이터에 대해 높은 성능을 발휘합니다. 무한 스크롤 UI에 특히 적합합니다.OFFSET과 커서의 비교
컨트롤러에서의 구현
Blade에서의 페이지네이션 링크 표시
links() 메서드가 자동으로 페이지 링크의 HTML을 생성합니다. 현재 페이지 앞뒤 3페이지 분량의 링크가 표시됩니다.
표시할 링크 수 조정
onEachSide()로 현재 페이지 앞뒤에 표시할 링크 수를 변경할 수 있습니다.
1페이지당 건수를 요청에서 받기
1페이지에 여러 페이지네이터 표시
동일 화면에 두 개의 페이지네이터를 표시하는 경우, 양쪽이page 파라미터를 사용하면 충돌합니다. 세 번째 인수로 파라미터 이름을 변경합니다.
URL 커스터마이징
베이스 URL 변경
쿼리 파라미터 추가
해시 프래그먼트 추가
API 응답(JSON 출력)
페이지네이터를 라우트나 컨트롤러에서 그대로 반환하면 자동으로 JSON으로 변환됩니다.API 리소스와의 조합
paginate()의 결과를 API 리소스 컬렉션으로 감싸는 경우 UserResource::collection()에 전달합니다.
UserResource::collection()에 페이지네이터를 전달하면 페이지네이션 정보가 메타데이터로 자동으로 부가됩니다.
cursorPaginate()의 JSON에는 페이지 번호가 아닌 next_cursor와 prev_cursor가 포함됩니다. API 클라이언트는 이 값들을 다음 요청의 cursor 파라미터로 사용합니다.커스텀 페이지네이션 뷰
뷰 파일에 직접 지정
기본 뷰를 커스텀 파일로 변경
먼저 공식 뷰를 게시한 후 커스터마이징합니다.resources/views/vendor/pagination/에 다음 파일이 생성됩니다.
tailwind.blade.php— 기본값(Tailwind CSS용)bootstrap-5.blade.php— Bootstrap 5용simple-tailwind.blade.php— simplePaginate용- …
tailwind.blade.php를 직접 편집하거나 새 뷰를 만들어서 AppServiceProvider에서 지정합니다.
Bootstrap CSS 사용
Tailwind가 아닌 Bootstrap을 사용하는 경우AppServiceProvider의 boot()에서 지정합니다.
수동으로 페이지네이터 생성
배열 등 기존 데이터에 페이지네이션을 적용하고 싶은 경우, 페이지네이터 클래스를 직접 인스턴스화합니다.자주 사용하는 인스턴스 메서드
정리
페이지네이션 방식 선택 방법
페이지네이션 방식 선택 방법
paginate()— 총 건수와 페이지 번호 링크가 필요한 경우(일반적인 리스트 화면)simplePaginate()— “이전”·“다음” 링크만으로 충분한 경우(고속)cursorPaginate()— 대량 데이터·무한 스크롤·잦은 쓰기가 있는 경우(최고 성능)
Blade 표시의 기본 패턴
Blade 표시의 기본 패턴
paginate()의 결과를 뷰에 전달하고 links()로 페이지 링크를 출력하기만 하면 됩니다.
현재 페이지는 page 쿼리 파라미터에서 자동으로 검출됩니다.API에서의 페이지네이션
API에서의 페이지네이션
페이지네이터를 라우트에서 직접 반환하면 자동으로 JSON으로 변환됩니다.
API 리소스와 조합하려면
UserResource::collection($paginator)를 반환합니다.
응답에는 data(레코드 배열)와 각종 메타 정보가 포함됩니다.