0266

BE

[Node.js] Prisma 완벽 가이드: 개념, 구조, MySQL 주의사항까지 한 번에 정리

Prisma란?

Prisma는 TypeScript/JavaScript 환경에서 사용되는 차세대 ORM(Object-Relational Mapping) 도구이다.

전통적인 ORM들과 달리 개발 경험타입 안전성에 특히 초점을 맞춘다.

쉽게 말해서,

  • SQL 쿼리를 직접 작성하지 않아도

  • TypeScript 타입이 자동으로 생성되고

  • 자동완성 기능컴파일 타임 오류 방지가 되는

  • DB 조작 전용 API를 제공하는 라이브러리다.

Prisma의 구조

Prisma는 크게 3가지 핵심 컴포넌트로 나눌 수 있다.

1) Prisma Schema (schema.prisma)

  • DB 구조를 정의하는 파일

  • 테이블(모델), 컬럼 타입, 관계, 열거형 등을 선언

JavaScript
model User {
  id    Int    @id @default(autoincrement())
  name  String
  email String @unique
}

: 이 스키마를 기반으로 타입 안전 클라이언트 코드가 생성된다

2) Prisma Migrate

  • DB 스키마 변경을 관리하는 마이그레이션 도구

  • npx prisma migrate dev 명령으로 SQL 마이그레이션을 자동 생성 및 실행

  • 마이그레이션 파일이 남아 있어, 스키마 변경 이력 추적이 가능하다.

  • dp push와 차이

    • dp push : 개발 중 빠르게 구조를 DB에 반영 (마이그레이션 파일 X)

    • migrate : 구조 변경 이력을 파일로 관리 (운영 환경 배포 시 필수)

3) Prisma Client

  • npx prisma generate로 생성되는 타입 안전 DB 클라이언트

  • SQL 대신 자바스크립트 메서드 체인으로 데이터 조작

JavaScript
const user = await prisma.user.findUnique({
  where: { id: 1 },
});

: 완전 타입 안전: 오타나 없는 필드 접근 시 컴파일 에러 발생

Prisma의 동작 흐름

1) 스키마 작성schema.prisma에 DB 구조 정의

2) DB 반영

  • 개발 초기: npx prisma db push (빠르게 반영)

  • 운영/버전관리: npx prisma migrate dev --name "설명"

3) 클라이언트 생성npx prisma generate

4) 코드에서 사용import { PrismaClient } from '@prisma/client'

MySQL에서 Prisma 사용할 때 주의할 점

Prisma에서 MySQL을 사용할 경우, 몇 가지 주의해야 할 사항이 있다.

1) VARCHAR(191): MySQL 인덱스 키 제한

  • VARCHAR의 길이는 191자로 제한되는데, 이는 MySQL의 인덱스 키 길이 제한 때문이다.

  • 따라서 인덱스를 걸어야 하는 문자열 필드는 길이를 191자 이하로 설정하는 것이 안전하다.

2) Partial Unique 없음 → 복합키 + Boolean 플래그

  • MySQL은 Partial Unique(조건부 유니크 제약)를 지원하지 않기 때문에,

  • 특정 조건에서만 유니크를 보장하려면 복합키와 Boolean 플래그를 함께 사용하는 방식으로 구현해야 한다.

3) @updatedAt는 자동 갱신이므로 기존 데이터 마이그레이션 시 default 필요

  • @updatedAt 필드는 Prisma가 레코드 수정 시 자동으로 값을 갱신해주지만,

  • 기존 데이터를 마이그레이션할 때는 기본값(default)을 설정해야 에러를 방지할 수 있다.

4) now() 기본값은 UTC 기준 → 시간대 보정 필요

  • Prisma에서 now() 기본값은 UTC 기준 시간이기 때문에,

  • 한국 시간(KST) 기준으로 저장하려면 시간대 보정 로직을 추가해야 한다.

Prisma가 다른 ORM보다 좋은 점

  • 타입스크립트에 최적화: 타입 안전성 + 자동완성 최고 수준

  • 쿼리 가독성: 복잡한 JOIN도 구조적으로 표현 가능

  • 빠른 반영: db push로 개발 속도 높임

  • UI 지원: Prisma Studio로 데이터 관리 편함