Skip to main content

페이지네이션이란

Laravel의 페이지네이션은 쿼리 빌더 및 Eloquent ORM과 통합되어 있어, 설정 없이 사용할 수 있습니다. 현재 페이지는 HTTP 요청의 page 쿼리 파라미터에서 자동으로 취득되며, 생성되는 링크에도 자동으로 부가됩니다. 기본 HTML은 Tailwind CSS에 대응하며, Bootstrap CSS도 선택할 수 있습니다.

3종류의 페이지네이션

기본 사용법

쿼리 빌더의 페이지네이션

Eloquent의 페이지네이션

simplePaginate

총 건수 카운트 쿼리가 불필요한 경우(“이전”·“다음” 링크만 표시)에는 simplePaginate()를 사용하면 효율적입니다.
“전체 N건 중 M건째”라는 표시가 불필요하다면 simplePaginate()를 선택합시다. paginate()COUNT(*) 쿼리를 추가로 실행하므로 simplePaginate() 쪽이 빠릅니다.

cursorPaginate(커서 페이지네이션)

커서 페이지네이션은 OFFSET 절 대신 WHERE 절을 사용하기 때문에 대량 데이터에 대해 높은 성능을 발휘합니다. 무한 스크롤 UI에 특히 적합합니다.
생성되는 URL에는 페이지 번호가 아닌 커서 문자열이 들어갑니다.
커서 페이지네이션을 사용하려면 orderBy가 필수입니다. 또한 정렬 순서의 컬럼은 페이지네이션 대상 테이블에 속해야 합니다.

OFFSET과 커서의 비교

커서 페이지네이션은 인덱스가 효과적으로 활용되며, 데이터가 자주 추가·삭제되는 경우에도 레코드의 중복·누락이 잘 발생하지 않는다는 이점이 있습니다. 다만 페이지 번호 링크의 생성은 불가하며 “이전”·“다음”만 가능합니다.

컨트롤러에서의 구현

Blade에서의 페이지네이션 링크 표시

links() 메서드가 자동으로 페이지 링크의 HTML을 생성합니다. 현재 페이지 앞뒤 3페이지 분량의 링크가 표시됩니다.

표시할 링크 수 조정

onEachSide()로 현재 페이지 앞뒤에 표시할 링크 수를 변경할 수 있습니다.

1페이지당 건수를 요청에서 받기

1페이지에 여러 페이지네이터 표시

동일 화면에 두 개의 페이지네이터를 표시하는 경우, 양쪽이 page 파라미터를 사용하면 충돌합니다. 세 번째 인수로 파라미터 이름을 변경합니다.

URL 커스터마이징

베이스 URL 변경

쿼리 파라미터 추가

해시 프래그먼트 추가

API 응답(JSON 출력)

페이지네이터를 라우트나 컨트롤러에서 그대로 반환하면 자동으로 JSON으로 변환됩니다.
응답의 JSON 형식:

API 리소스와의 조합

paginate()의 결과를 API 리소스 컬렉션으로 감싸는 경우 UserResource::collection()에 전달합니다.
UserResource::collection()에 페이지네이터를 전달하면 페이지네이션 정보가 메타데이터로 자동으로 부가됩니다.
cursorPaginate()의 JSON에는 페이지 번호가 아닌 next_cursorprev_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을 사용하는 경우 AppServiceProviderboot()에서 지정합니다.

수동으로 페이지네이터 생성

배열 등 기존 데이터에 페이지네이션을 적용하고 싶은 경우, 페이지네이터 클래스를 직접 인스턴스화합니다.

자주 사용하는 인스턴스 메서드

정리

  • paginate() — 총 건수와 페이지 번호 링크가 필요한 경우(일반적인 리스트 화면)
  • simplePaginate() — “이전”·“다음” 링크만으로 충분한 경우(고속)
  • cursorPaginate() — 대량 데이터·무한 스크롤·잦은 쓰기가 있는 경우(최고 성능)
paginate()의 결과를 뷰에 전달하고 links()로 페이지 링크를 출력하기만 하면 됩니다. 현재 페이지는 page 쿼리 파라미터에서 자동으로 검출됩니다.
페이지네이터를 라우트에서 직접 반환하면 자동으로 JSON으로 변환됩니다. API 리소스와 조합하려면 UserResource::collection($paginator)를 반환합니다. 응답에는 data(레코드 배열)와 각종 메타 정보가 포함됩니다.
마지막 수정일 2026년 7월 13일