11주차: Prisma!

발행: (2025년 12월 17일 오후 01:57 GMT+9)
5 min read
원문: Dev.to

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는 이제 다음을 이해합니다:

  • 한 사용자가 여러 게시물을 가짐
  • 내부적으로 데이터를 조인하는 방법
  • 중첩 데이터를 안전하게 가져오는 방법
const user = await prisma.user.findUnique({
  where: { id: 1 },
  include: { posts: true }
});

6. New things I learned this week 🔄

  • Prisma는 코드와 데이터베이스 사이의 중개자 역할을 하며, 타입 안전성을 제공해 버그를 크게 줄여줍니다.
  • 스키마‑우선 설계는 전체 클래스의 런타임 오류를 방지합니다.

Wrapping up

Prisma는 “그냥 또 다른 도구”처럼 느껴질 수 있지만, 데이터베이스와 상호작용하는 방식을 근본적으로 바꿔줍니다. 깔끔한 스키마와 안전한 마이그레이션은 프로덕션 시스템을 훨씬 더 신뢰할 수 있게 만듭니다.

궁금한 점이나 피드백이 있으면 자유롭게 댓글을 남겨 주세요! 프로젝트 아이디어가 있다면 댓글에 공유해 주세요.

다음 주에 더 많은 내용으로 돌아올게요. 그때까지 꾸준히 하세요!

Back to Blog

관련 글

더 보기 »

2일차:SQL

데이터베이스 구조, 데이터 타입 및 테이블 기본 1. 데이터베이스 구조 요약 관계형 데이터베이스는 다음을 포함합니다: - Database (데이터베이스) - Tables (테이블) - Rows (Records) (행/레코드) - Columns (Fields) (열/필드)

2일차: Python 프로그래밍

데이터베이스 구조, 데이터 유형 및 테이블 기본 1. 데이터베이스 구조 요약 관계형 데이터베이스는 다음을 포함합니다: - Database - Tables - Rows (Records) - Columns (Fields) ...