Prisma 사용법 및 문법

김민석·2026년 3월 18일
post-thumbnail

Prisma를 사용하기 위한 설정 및 문법

0. PostgreSQL 준비

Docker로 PostgreSQL 띄우기

version: '3.8'
services:
  db:
    image: postgres:15
    container_name: test-db
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: testtest
      POSTGRES_DB: testdb
    volumes:
      - test_db_data:/var/lib/postgresql/data

volumes:
  test_db_data:

1. 데이터베이스 스키마 정의

prisma/schema.prisma 파일에서 데이터베이스 모델을 정의합니다: graphql 문법임

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  name      String?
  posts     Post[]
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  published Boolean  @default(false)
  author    User     @relation(fields: [authorId], references: [id])
  authorId  Int
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}
prisma generate

2. Prisma Client 설정

lib/prisma.ts 파일을 생성하여 Prisma Client를 설정합니다:

import { PrismaClient } from '@prisma/client'

const globalForPrisma = global as unknown as { prisma: PrismaClient }

export const prisma = globalForPrisma.prisma || new PrismaClient()

if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma

3. 기본 CRUD 작업

생성 (Create)

const createUser = async () => {
  const user = await prisma.user.create({
    data: {
      email: 'user@example.com',
      name: 'John Doe',
    },
  })
  return user
}

조회 (Read)

const getUsers = async () => {
  const users = await prisma.user.findMany({
    include: {
      posts: true,
    },
  })
  return users
}

const getUser = async (id: number) => {
  const user = await prisma.user.findUnique({
    where: {
      id: id,
    },
    include: {
      posts: true,
    },
  })
  return user
}

수정 (Update)

const updateUser = async (id: number, name: string) => {
  const user = await prisma.user.update({
    where: {
      id: id,
    },
    data: {
      name: name,
    },
  })
  return user
}

삭제 (Delete)

const deleteUser = async (id: number) => {
  const user = await prisma.user.delete({
    where: {
      id: id,
    },
  })
  return user
}

알아둘 문법

  • where : 해당 query랑 비교 할때 (조건)
  • include : 관계 데이터 같이 가져오기
  • data : 해당 query 수정
  • select : 필요한 필드만 가져오기
  • skip,take : 페이지네이션 몇 개 건너뛰고(skip), 몇 개 가져올지(take)
  • cursor : 마지막으로 본 데이터 기준으로 다음 가져오기
await prisma.user.findMany({
  cursor: { id: 10 },
  take: 10,
})

=> id 10 다음부터 10개 가져옴

5. 고급 쿼리 기능

관계 필터링

const getUsersWithPublishedPosts = async () => {
	// 1. [O, O]
	// 2. [O, X]
	// 3. [X, X]
	
	// 하나라도 배포가 되어있는 포스트를 가지고 있는 유저들
	// 배포 되어있는 포스트들만 필터링 해서 가지고 오고싶다
	
	// [1번 유저 + 2개 포스트, 2번 유저 + 1개 포스트]
	
  const users = await prisma.user.findMany({
    where: {
      posts: {
        some: {
          published: true,
        },
      },
    },
    include: {
      posts: {
        where: {
          published: true,
        },
      },
    },
  })
  return users
}

그룹화 및 집계

const getPostStats = async () => {
  const stats = await prisma.post.groupBy({
    by: ['authorId'],
    _count: {
      _all: true,
    },
    _avg: {
      id: true,
    },
  })
  return stats
}

알아두기

  • 프로덕션 환경에서는 항상 환경 변수를 통해 데이터베이스 URL을 관리하기.
  • Prisma Client는 서버 사이드에서만 사용해야 한다. DB를 조작하는 것이기 때문에
  • 스키마를 변경할 때마다 prisma generate 명령어를 실행해야 합니다.
  • 데이터베이스 마이그레이션은 신중하게 계획하고 실행하자
profile
나만의 기록장

0개의 댓글