← 홈페이지 5강 목록으로
🔷
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 sqlite
text
prisma/
└── schema.prisma   ← 모델 정의
.env                ← DATABASE_URL

3. 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' }] }
  }
});
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗