Prisma란 무엇인가? (간단한 예시 포함)
KUKJIN LEE • 3개월 전 작성
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;