티스토리 뷰

기록

Prisma의 skip, take

als982001 2025. 2. 9. 17:24

 

1. 개요

"use server";

import db from "@/lib/db";

export async function getMoreProducts(page: number) {
  const products = await db.product.findMany({
    select: {
      title: true,
      price: true,
      created_at: true,
      photo: true,
      id: true,
    },
    skip: page * 1,
    take: 1,
    orderBy: {
      created_at: "desc",
    },
  });

  return products;
}

 

 이전에 작성한 코드를 보면서 복습을 하고 있었다. 그런데 skip, take에 대해 헷갈렸다. 그래서 이 둘에 대해 간단히 기록하려고 한다.

 

2. skip, take란

 Prisma의 findMany 메서드에서 skip과 take를 사용하면 데이터를 원하는 개수만큼 가져오거나, 특정 개수만큼 건너뛸 수 있다.

  • skip: 조회할 데이터에서 건너뛸 개수를 지정
  • take: 조회할 데이터에서 가져올 개수를 지정

이를 활용해 페이지네이션을 구현하거나 특정 범위 데이터를 조회할 수 있다.

 

3. 예시 코드

3-1. 앞의 5개를 건너뛰어서 10개의 데이터를 가져오기

const products = await db.product.findMany({
  skip: 5, // 앞에서 5개를 건너뛴 후 데이터 가져오기
  take: 10, // 10개의 데이터만 가져오기
  orderBy: {
    created_at: "desc", // 최신순 정렬
  },
});

 

3-2. 한 페이지에 5개씩 데이터를 표시하는 경우

const page = 2; // 사용자가 요청한 페이지 번호

const products = await db.product.findMany({
  skip: (page - 1) * 5, // 페이지 번호에 따라 건너뛸 개수 설정
  take: 5, // 한 번에 5개씩 가져오기
  orderBy: {
    created_at: "desc",
  },
});
  • 1페이지를 요청할 경우 (page: 1) -> skip: 0, take: 5 -> 1 ~ 5번 데이터
  • 2페이지를 요청할 경우 (page: 2) -> skip: 5, take: 5 -> 6 ~ 10번 데이터
  • 3페이지를 요청할 경우 (page: 3) -> skip: 10, take: 5 -> 11 ~ 15번 데이터 가져오기

 

4. skip 사용 시 주의점

  • 데이터가 많아질수록 쿼리 성능이 저하될 수도 있다.
    • 성능 최적화를 위해 페이지네이션의 경우,id를 기반으로 하는 벙법도 고려할 수 있다.
// id를 기반으로 페이지네이션을 구현할 경우

const products = await db.product.findMany({
  where: {
    id: { gt: lastSeenProductId }, // 마지막으로 본 ID보다 큰 데이터 가져오기
  },
  take: 5, // 5개 가져오기
  orderBy: {
    id: "asc",
  },
});

 

5. skip, take를 사용할 수 있는 다른 메서드들

  • findMany: 여러 개의 데이터를 조회
  • findFirst: 첫 번째 일치하는 데이터를 찾을 때 사용, 주로 skip을 사용
  • findFirstOrThrow: 일치하는 데이터가 없을 경우 오류를 발생, 주로 skip을 사용
  • aggregate: 집계 함수 (예: count, avg, sum, min, max 등)
  • groupBy: 데이터를 특정 기준으로 그룹화
  • 등등...

5-1. skip, take를 사용할 수 없는 메서드들

  • findUnique: 고유한 id값을 기반으로 데이터를 찾음
    • findUnique는 기본적으로 고유한 값(id 등)을 기반으로 한 데이터 1개 조회하므로, skip과 take가 필요 없다고 한다.
  • findUniqueOrThrow: findUnique와 동일하지만 데이터가 없으면 오류 발생
  • deleteMany: 여러 개의 데이터를 삭제
  • updateMany: 여러 개의 데이터를 한 번에 업데이트
    • deleteMany와 updateMany는 데이터를 조회하는 것이 아니라 삭제/수정하는 기능이므로 skip과 take를 지원하지 않는다고 한다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함