11주차: Prisma!
Source: Dev.to
Topics Covered✅
- ORM이 실제로 해결하는 것이 무엇인지 이해하기
- Prisma를 사용하여 데이터베이스 스키마 정의하기
- 타입 안전한 데이터베이스 클라이언트 생성하기
- CRUD 작업을 깔끔하고 안전하게 수행하기
1. What is Prisma and why do we need it? 🧠
Prisma는 ORM (Object Relational Mapper) 로, 데이터베이스와 애플리케이션 코드 사이의 다리 역할을 합니다.
Without Prisma
SELECT * FROM users WHERE email = 'test@gmail.com';
With Prisma
const user = await prisma.user.findUnique({
where: { email: "test@gmail.com" }
});
Why this matters
- 모든 작업에 대해 raw SQL을 작성할 필요가 없음
- 쿼리가 타입 안전해짐
- 데이터베이스 필드 리팩토링이 조용히 깨지는 것을 방지
- 자동완성 + 컴파일 타임 체크가 런타임 버그를 방지
2. Prisma Schema — the single source of truth 📄
먼저 프로젝트에 Prisma를 초기화하세요 (공식 문서 참고: official docs).
schema.prisma 파일은 다음을 정의합니다:
- 데이터베이스 연결
- 모델(테이블)
- 모델 간 관계
Basic example
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
createdAt DateTime @default(now())
}
User테이블을 생성합니다email에 대한 고유성을 강제합니다- 에디터가 이해할 수 있는 타입을 생성합니다
Generate the client:
npx prisma generate
Using the generated client
import { PrismaPg } from '@prisma/adapter-pg';
import { PrismaClient } from "@/app/generated/prisma/client";
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL,
});
const prisma = new PrismaClient({ adapter });
3. Migrations — evolving the database safely 🔁
데이터베이스는 시간이 지남에 따라 변합니다. Prisma는 마이그레이션을 통해 스키마 변화를 처리합니다.
npx prisma migrate dev --name add-user-model
이 명령이 수행하는 작업:
- 마이그레이션 파일을 생성합니다
- 데이터베이스에 변경 사항을 적용합니다
- 스키마 진화 기록을 유지합니다
마이그레이션은 로컬, 스테이징, 프로덕션 데이터베이스를 동기화하고, 생성된 파일에는 각 변경에 대한 raw SQL이 포함됩니다.
4. CRUD operations with Prisma ✍️
Create
await prisma.user.create({
data: {
email: "nikhil@gmail.com",
name: "Nikhil"
}
});
Read
const users = await prisma.user.findMany();
Update
await prisma.user.update({
where: { id: 1 },
data: { name: "Updated Name" }
});
Delete
await prisma.user.delete({
where: { id: 1 }
});
모든 작업은 다음과 같습니다:
- 타입이 지정됨
- 컴파일 타임에 검증됨
- 동작이 예측 가능함
전체 파라미터 상세는 Prisma 문서를 참고하세요.
5. Relations and foreign keys made simple 🔗
Prisma에서 관계를 정의하는 것은 깔끔하고 표현력이 풍부합니다.
model User {
id Int @id @default(autoincrement())
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
user User @relation(fields: [userId], references: [id])
userId Int
}
Prisma는 이제 다음을 이해합니다:
- 한 사용자가 여러 게시물을 가짐
- 내부적으로 데이터를 조인하는 방법
- 중첩 데이터를 안전하게 가져오는 방법
Fetching related data
const user = await prisma.user.findUnique({
where: { id: 1 },
include: { posts: true }
});
6. New things I learned this week 🔄
- Prisma는 코드와 데이터베이스 사이의 중개자 역할을 하며, 타입 안전성을 제공해 버그를 크게 줄여줍니다.
- 스키마‑우선 설계는 전체 클래스의 런타임 오류를 방지합니다.
Wrapping up
Prisma는 “그냥 또 다른 도구”처럼 느껴질 수 있지만, 데이터베이스와 상호작용하는 방식을 근본적으로 바꿔줍니다. 깔끔한 스키마와 안전한 마이그레이션은 프로덕션 시스템을 훨씬 더 신뢰할 수 있게 만듭니다.
궁금한 점이나 피드백이 있으면 자유롭게 댓글을 남겨 주세요! 프로젝트 아이디어가 있다면 댓글에 공유해 주세요.
다음 주에 더 많은 내용으로 돌아올게요. 그때까지 꾸준히 하세요!