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() 조합이 여전히 간편하고 유용한 선택입니다.