Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB 페이지네이션 구현 방법: limit()과 skip() 완벽 가이드

MongoDB에서는 limit()skip() 메서드를 조합하여 손쉽게 페이지네이션(페이지 매김)을 구현할 수 있습니다. 이 두 메서드를 함께 사용하면 대량의 데이터 중에서 원하는 범위의 문서만 효율적으로 조회할 수 있습니다.

테스트용 컬렉션 생성

먼저 개념을 이해하기 위해 문서가 포함된 컬렉션을 생성해 보겠습니다. 아래 쿼리를 사용하면 컬렉션을 만들면서 문서를 삽입할 수 있습니다.

> db.paginationDemo.insertOne({"CustomerName":"Chris","CustomerAge":23});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c949de44cf1f7a64fa4df52")
}
> db.paginationDemo.insertOne({"CustomerName":"Robert","CustomerAge":26});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c949df14cf1f7a64fa4df53")
}
> db.paginationDemo.insertOne({"CustomerName":"David","CustomerAge":24});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c949dfc4cf1f7a64fa4df54")
}
> db.paginationDemo.insertOne({"CustomerName":"Carol","CustomerAge":28});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c949e3e4cf1f7a64fa4df55")
}
> db.paginationDemo.insertOne({"CustomerName":"Bob","CustomerAge":29});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c949e474cf1f7a64fa4df56")
}

전체 문서 조회하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다. pretty()를 함께 사용하면 결과를 보기 좋게 정렬하여 출력합니다.

> db.paginationDemo.find().pretty();

실행 결과는 다음과 같습니다.

{
   "_id" : ObjectId("5c949de44cf1f7a64fa4df52"),
   "CustomerName" : "Chris",
   "CustomerAge" : 23
}
{
   "_id" : ObjectId("5c949df14cf1f7a64fa4df53"),
   "CustomerName" : "Robert",
   "CustomerAge" : 26
}
{
   "_id" : ObjectId("5c949dfc4cf1f7a64fa4df54"),
   "CustomerName" : "David",
   "CustomerAge" : 24
}
{
   "_id" : ObjectId("5c949e3e4cf1f7a64fa4df55"),
   "CustomerName" : "Carol",
   "CustomerAge" : 28
}
{
   "_id" : ObjectId("5c949e474cf1f7a64fa4df56"),
   "CustomerName" : "Bob",
   "CustomerAge" : 29
}

limit()과 skip()으로 페이지네이션 구현하기

이제 실제 페이지네이션을 적용해 보겠습니다. skip(n)은 앞에서 n개의 문서를 건너뛰고, limit(m)은 최대 m개의 문서만 반환합니다. 예를 들어 한 페이지당 3개씩 데이터를 보여주고 싶다면 다음과 같이 작성합니다.

> db.paginationDemo.find().skip(0).limit(3);

첫 번째 페이지에 해당하는 실행 결과입니다.

{ "_id" : ObjectId("5c949de44cf1f7a64fa4df52"), "CustomerName" : "Chris", "CustomerAge" : 23 }
{ "_id" : ObjectId("5c949df14cf1f7a64fa4df53"), "CustomerName" : "Robert", "CustomerAge" : 26 }
{ "_id" : ObjectId("5c949dfc4cf1f7a64fa4df54"), "CustomerName" : "David", "CustomerAge" : 24 }

추가 팁: 성능 최적화

데이터 양이 많아질수록 skip() 값이 클 경우 성능이 저하될 수 있습니다. 이런 경우에는 정렬 기준이 되는 필드(예: _id 또는 날짜)에 인덱스를 생성하고, 마지막으로 조회한 문서의 값을 기준으로 range 쿼리를 사용하는 커서 기반 페이지네이션(Cursor-based Pagination)을 고려하는 것이 좋습니다. 소규모 데이터나 관리자 화면 등에는 limit()과 skip() 조합이 여전히 간편하고 유용한 선택입니다.