🔷
EPISODE 05
schema.prisma · migrate · Client · 1:N 관계
Prisma ORM
차세대 ORM Prisma로 schema.prisma 파일에 모델을 정의하고, 마이그레이션으로 DB 스키마를 관리하며, 자동 생성된 Client로 타입 안전한 CRUD를 작성합니다.
PrismaORMmigration
소요 시간
⏱ 60분
난이도
📊 중급
선수 조건
🎯 db-04
결과물
User-Post 1:N 관계가 있는 SQLite 기반 앱
이 강의에서 배우는 것
- 1Prisma의 동작 흐름(schema → migrate → Client)을 안다
- 2schema.prisma의 모델/필드/속성을 작성한다
- 3prisma migrate dev로 마이그레이션을 적용한다
- 4Prisma Client의 create/findMany/update/delete를 사용한다
- 5include로 관계 데이터를 함께 조회한다
1. Prisma란
text
schema.prisma (모델 정의)
↓ npx prisma migrate dev
DB 테이블 자동 생성
↓
Prisma Client (자동 생성 코드)
↓
JavaScript 코드에서 타입 안전한 DB 조작javascript
// 기존 (better-sqlite3)
const users = db.prepare('SELECT * FROM users WHERE age > ?').all(20);
// Prisma
const users = await prisma.user.findMany({
where: { age: { gt: 20 } }
});2. 설치 및 초기화
bash
npm init -y
npm install @prisma/client
npm install -D prisma
npx prisma init --datasource-provider sqlitetext
prisma/
└── schema.prisma ← 모델 정의
.env ← DATABASE_URL3. schema.prisma
prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String
posts Post[]
createdAt DateTime @default(now())
}
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
}| 속성 | 설명 |
|---|---|
| @id | 기본키 |
| @default(autoincrement()) | 자동 증가 |
| @unique | 유니크 |
| @default(now()) | 현재 시각 |
| @updatedAt | 수정 시 자동 갱신 |
| @relation | 관계 정의 |
4. 마이그레이션
bash
npx prisma migrate dev --name init # 생성·적용
npx prisma migrate status # 목록
npx prisma studio # GUI 도구5. Prisma Client CRUD
javascript
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();
// Create
const user = await prisma.user.create({
data: { email: 'kim@example.com', name: '김철수' }
});
// Read - many
const users = await prisma.user.findMany();
// Read - 조건/정렬/제한
const active = await prisma.user.findMany({
where: { posts: { some: { published: true } } },
orderBy: { createdAt: 'desc' },
take: 10,
});
// Read - 단일
const user = await prisma.user.findUnique({ where: { id: 1 } });
// Update
await prisma.user.update({
where: { id: 1 },
data: { name: '김영수' }
});
// Delete
await prisma.user.delete({ where: { id: 1 } });6. 관계 데이터
javascript
// include로 관련 데이터 함께 조회
const userWithPosts = await prisma.user.findUnique({
where: { id: 1 },
include: { posts: true }
});
// 기존 유저와 연결
const post = await prisma.post.create({
data: {
title: '첫 번째 포스트',
content: '내용',
author: { connect: { id: 1 } }
}
});
// 중첩 create
const userWithPost = await prisma.user.create({
data: {
name: '이영희',
email: 'lee@example.com',
posts: { create: [{ title: '포스트 1', content: '내용 1' }] }
}
});