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 구조를 정의하는 파일
테이블(모델), 컬럼 타입, 관계, 열거형 등을 선언
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 대신 자바스크립트 메서드 체인으로 데이터 조작
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로 데이터 관리 편함