개요

Prisma의 findMany는 다중 레코드 조회용 메서드 기본값은 대상 모델의 모든 레코드 반환 where 필터, select/include, 정렬, 페이징, 중복 제거 등 옵션 지원 옵션 조합으로 조건 기반 조회를 간결하게 구성 가능

기본 사용법

가장 단순한 호출 형태

const users = await prisma.user.findMany();

주요 옵션

옵션은 필요한 것만 선택적으로 사용

  • where: 조건 필터링
  • select: 필드 서브셋 선택
  • include: 관계 데이터 로드
  • orderBy: 정렬 기준 지정
  • skip, take: 오프셋 기반 페이징
  • distinct: 특정 필드 기준 중복 제거

where로 조건 필터링

단일 조건부터 복합 조건까지 표현 가능

const active = await prisma.user.findMany({
  where: { isActive: true },
});

in 조건

지정한 값 배열 중 하나와 일치하는 레코드 매칭

const some = await prisma.user.findMany({
  where: { id: { in: [1, 2, 3] } },
});

비교 연산자

숫자, 날짜, 문자열 등 비교 지원

  • equals, not
  • lt, lte, gt, gte
  • in, notIn
const range = await prisma.user.findMany({
  where: { age: { gte: 18, lte: 30 } },
});

복합 논리 연산

AND, OR 조합으로 다중 조건 구성

const mixed = await prisma.user.findMany({
  where: {
    OR: [{ age: { lt: 18 } }, { role: "admin" }],
  },
});

in과 비교 연산자 결합으로 범위와 집합 조건을 동시에 표현 가능

const filtered = await prisma.user.findMany({
  where: {
    id: { in: [1, 2, 3, 4, 5] },
    age: { gt: 20 },
  },
});

select로 필요한 필드만 조회

응답 페이로드 최소화에 유용

const names = await prisma.user.findMany({
  select: { name: true, email: true },
});

주의사항: 같은 호출에서 select와 include를 동시에 사용 불가, 하나만 선택

include로 관계 데이터 로드

연관 모델을 함께 가져오기

const withPosts = await prisma.user.findMany({
  include: { posts: true },
});

필요한 필드만 부분 선택하려면 include 내부 select 사용

const withTitles = await prisma.user.findMany({
  include: {
    posts: { select: { title: true } },
  },
});

orderBy로 정렬

단일 또는 다중 필드 정렬 지원

const recent = await prisma.user.findMany({
  orderBy: { createdAt: "desc" },
});

여러 필드 정렬은 배열로 순서 지정 가능

skip, take로 페이징

오프셋 기반 페이지네이션 구성

const page = await prisma.user.findMany({
  skip: 10,
  take: 5,
});

대용량 페이지 이동 시 skip 비용 증가 가능성 존재, 일관성 보장을 위해 cursor 기반 페이징 고려 권장

const next = await prisma.user.findMany({
  cursor: { id: lastId },
  skip: 1,
  take: 10,
  orderBy: { id: "asc" },
});

distinct로 중복 제거

지정한 스칼라 필드 조합 기준으로 중복 제거

const uniqNames = await prisma.user.findMany({
  distinct: ["name"],
});

데이터베이스와 드라이버 제약에 따라 지원 범위가 다를 수 있으므로 최신 문서 확인 권장

예시 조합

조건 필터 + 필드 선택 + 관계 일부 선택 + 정렬 + 제한 개수 조합

const result = await prisma.user.findMany({
  where: { isActive: true, age: { gte: 18 } },
  select: {
    name: true,
    email: true,
    posts: { select: { title: true } },
  },
  orderBy: { createdAt: "desc" },
  take: 10,
});

주의와 베스트 프랙티스

  • select와 include는 같은 호출에서 동시 사용 불가
  • 정렬 없이 take만 사용 시 결과 순서 비결정적일 수 있음, orderBy 동반 사용 권장
  • 오프셋 페이징(skip)은 페이지 번호가 커질수록 비용 증가 가능, 커서 기반 페이징 고려
  • where로 불필요한 데이터 전송 최소화, 필요한 필드만 select로 제한
  • distinct는 스칼라 필드 기준 사용 권장, 모델 및 드라이버 호환성 확인

정리

findMany는 다중 레코드 조회의 기본 도구 where로 정밀 필터링, select/include로 응답 축소 또는 관계 로드, orderBy와 skip·take로 정렬과 페이징 제어, distinct로 중복 제거 가능 in과 비교 연산자, AND·OR 조합으로 실제 요구사항을 간결하게 표현 가능 커서 기반 페이징과 필드 최소화로 성능과 안정성 확보 권장

참고자료