Prisma란 무엇인가? (간단한 예시 포함)

KUKJIN LEE's profile picture

KUKJIN LEE3개월 전 작성

Prisma를 사용하면 직접 쿼리를 작성할 필요 없이, Prisma Client를 통해 데이터베이스 작업을 수행할 수 있습니다. Prisma Client는 타입 안전성과 자동 완성 기능을 제공하여 코드 작성과 유지 보수를 크게 개선해 줍니다.

 

Prisma의 주요 장점

  • 타입 안전성: 데이터베이스 모델에 기반한 타입 안전성을 보장합니다. 이는 런타임 오류를 줄이고 코드를 더 신뢰성 있게 만듭니다.

  • 자동 완성: 데이터베이스 스키마에 맞춰 자동 생성된 쿼리 메서드를 제공하므로, IDE에서 자동 완성 기능을 사용할 수 있습니다.

  • 생산성 향상: 모델 정의, 마이그레이션, 쿼리 작성 등이 간소화되어 개발자의 생산성을 크게 향상시킵니다.

 

1. Prisma Client 설정

먼저 Prisma Client를 설치하고 설정합니다.

npm install @prisma/client
npx prisma generate

 

2. 모델 정의

schema.prisma 파일에서 모델을 정의합니다.

// prisma/schema.prisma

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

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

model User {
  id    Int    @id @default(autoincrement())
  name  String
  email String @unique
}

 

3. Prisma Client 사용 예제

Next.js 14의 app directory 구조를 사용하여 기본적인 CRUD 작업을 수행하는 예제를 살펴보겠습니다.

사용자 생성

// app/api/users/create/route.js

import prisma from '../../../lib/prisma';

export async function POST(req) {
  const { name, email } = await req.json();

  try {
    const user = await prisma.user.create({
      data: {
        name,
        email,
      },
    });
    return new Response(JSON.stringify(user), { status: 201 });
  } catch (error) {
    console.error(error);
    return new Response(JSON.stringify({ error: 'Internal Server Error' }), { status: 500 });
  }
}

 

사용자 조회

// app/api/users/[id]/route.js

import prisma from '../../../lib/prisma';

export async function GET(req) {
  const { id } = req.params;

  try {
    const user = await prisma.user.findUnique({
      where: { id: parseInt(id) },
    });

    if (!user) {
      return new Response(JSON.stringify({ error: 'User not found' }), { status: 404 });
    }

    return new Response(JSON.stringify(user), { status: 200 });
  } catch (error) {
    console.error(error);
    return new Response(JSON.stringify({ error: 'Internal Server Error' }), { status: 500 });
  }
}

 

사용자 업데이트

// app/api/users/[id]/route.js

import prisma from '../../../lib/prisma';

export async function PUT(req) {
  const { id } = req.params;
  const { name, email } = await req.json();

  try {
    const user = await prisma.user.update({
      where: { id: parseInt(id) },
      data: {
        name,
        email,
      },
    });

    return new Response(JSON.stringify(user), { status: 200 });
  } catch (error) {
    console.error(error);
    return new Response(JSON.stringify({ error: 'Internal Server Error' }), { status: 500 });
  }
}

 

사용자 삭제

// app/api/users/[id]/route.js

import prisma from '../../../lib/prisma';

export async function DELETE(req) {
  const { id } = req.params;

  try {
    await prisma.user.delete({
      where: { id: parseInt(id) },
    });

    return new Response(null, { status: 204 });
  } catch (error) {
    console.error(error);
    return new Response(JSON.stringify({ error: 'Internal Server Error' }), { status: 500 });
  }
}

 

4. Prisma Client

위 예제들에서 사용된 prisma 인스턴스를 초기화하는 파일을 생성합니다.

// lib/prisma.js

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

export default prisma;

New Tech Posts