
Next.js 프로젝트를 진행하면서 데이터베이스를 코드로 다루기 위해 Prisma를 사용했다.
Prisma는 Node.js 와 TypeScript 환경에서 사용할 수 있는 ORM이며, 타입 안전한 데이터 접근, 스키마 기반 모델링, 마이그레이션 관리, GUI 기반 데이터 확인 도구까지 함께 제공한다.
Prisma 공식 문서에서도 Prisma ORM을 타입 안전한 데이터 접근, 마이그레이션, 시각적 데이터 편집 기능을 제공하는 ORM으로 설명한다.
Prisma는 공식적으로 Node.js와 TypeScript를 위한 차세대 ORM으로 소개된다.
PostgreSQL, MySQL, SQL Server, MongoDB, CockroachDB 등 여러 데이터베이스를 지원하며, 핵심 구성은 보통 세 가지로 나뉜다.
Prisma Client, Prisma Migrate, Prisma Studio가 대표적이다.
각 역할은 다음과 같다.
findMany, create, update 같은 방식으로 DB를 다룰 수 있다.즉, Prisma는 단순한 "Query 헬퍼" 가 아니라, 데이터 모델 정의부터 쿼리 실행, 변경 이력 관리까지 한 흐름으로 가져가는 도구로 취급한다.
Next.js는 프론트엔드 프레임워크처럼 보이지만, 실제로는 서버 컴포넌트, 서버 액션, Route Handler, API Route 등 서버 로직도 함께 다루는 풀스택 구조에 가깝다. Prisma는 이런 환경에서 특히 잘 맞는다.
Prisma 공식 가이드도 Next.js에서 Prisma를 설정하고, 마이그레이션을 다루고, 배포하는 흐름을 별도로 제공한다.
Prisma를 선택한 이유는 크게 네 가지다.
Prisma Client는 Prisma schema를 바탕으로 자동 생성된다.
그래서 모델 필드명이나 타입이 바뀌면 TypeScript에서 바로 감지할 수 있는 경우가 많다.
문자열 기반 쿼리를 직접 흩뿌리는 것보다 훨씬 안정적이다.
Prisma는 Prisma Client를 auto-generated, type-safe ORM Interface로 설명한다.
Prisma에서는 schema.prisma 파일에 데이터 모델을 정의한다.
이 말은 즉, 데이터베이스 구조가 코드 레벨에서 관리된다는 뜻이다. 모델 정의가 프로젝트 안에 명시적으로 남기 때문에, 구조를 파악하기도 쉽고 팀원과 공유하기도 좋다.
Prisma schema API는 datasource, generator, model 등을 Prisma schema 언어로 정의하도록 안내한다.
스키마 변경이 생길 때마다 migration 파일을 생성해 이력을 남길 수 있다.
단순히 "테이블 바뀜"이 아닌 어떤 변경이 어떤 순서로 있었는지 Git에 함께 남길 수도 있다는 뜻이다.
Prisma Migrate는 SQL migration 파일 히스토리를 생성하고, Git 저장소에서 관리할 수 있게 해 준다.
Prisma는 Next.js용 공식 가이드를 제공하고, App Router 환경과 배포 흐름까지 다룬다.
즉, 레퍼런스가 잘 정리되어 있고 문제가 생겼으 때 공식 자료를 찾기도 쉽다.
Prisma를 처음 붙이면 보통 프로젝트 안에 prisma/schema.prisma 파일이 생긴다.
여기서 datasource, generator, model을 정의한다. Prisma 공식 문서는 prisma init 실행 시 Prisma 프로젝트 자산을 초기화하고, prisma.config.ts 역시 Prisma CLI 설정 파일로 사용할 수 있다고 설명한다.
model User {
id String @id @default(cuid())
email String @unique
name String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
이렇게 정의한 뒤 Prisma Client를 생성하면 코드에서 다음처럼 사용할 수 있다.
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
const users = await prisma.user.findMany();
const createdUser = await prisma.user.create({
data: {
email: "test@example.com",
name: "Lui",
},
});
Prisma Client는 schema를 기준으로 생성되기 때문에, 모델 이름과 필드에 맞춰 타입이 따라온다. 그게 Prisma를 사용하는 가장 크게 체감한 장점 중 하나다.
Next.js 프로젝트에서 Prisma를 사용할 때 보통 흐름은 아래와 같다.
schema.prisma 에 모델 정의이 흐름은 Prisma CLI와 Next.js 공식 가이드에서 안내하는 전형적인 패턴과 맞닿아 있다.
npx prisma db push
db push는 현재 Prisma schema 상태를 migration 없이 db에 반영한다.
이는 프로토타이핑이나 로컬 개발에 적합하다.
npx prisma migrate dev
migrate dev는 스키마 변경을 기반으로 migration 파일 히스토리를 생성하고 개발 DB 스키마를 Prisma schema와 동기화 시켜준다.
즉, 협업이나 운영 배포까지 생각한다면 보통 migrate dev 가 더 적절하다.
빠른 실험은 db push , 이력 관리가 필요한 개발은 migrate dev 라고 구분하면 이해하기 쉽다.
Prisma를 쓰다 보면 migrate dev 실행 중 shadow database 관련 메시지를 볼 수 있다.
이건 Prisma가 문제를 일으키는 게 아니라, 스키마 드리프트나 잠재적인 데이터 손실 가능성을 감지하기 위해 임시 데이터베이스를 사용하는 동작이다.
Prisma 문서에 따르면 shadow database는 prisma migrate dev 실행 시 자동 생성 및 삭제되며, migration 문제 감지에 사용된다.
사고를 미리 막기위해 검사하는 안전장치 정도로 이해하면 된다.
npx prisma init
prisma/ 디렉터리와 기본 설정 파일들이 생성됨npx prisma generate
npx prisma db push
npx prisma migrate dev
npx prisma migrate deploy
npx prisma studio
npx prisma db pull
npx prisma format
schema.prisma 파일을 포맷팅한다.npx prisma migrate diff
실제 개발에 사용해보니 이러한 흐름으로 가게 되었다.
npx prisma db push 사용npx prisma migrate dev --name... 로 migration 파일을 남긴다npx prisma generate로 Client를 다시 생성하고, npx prisma studio 로 데이터를 눈으로 확인한다.npx prisma init
npx prisma generate
npx prisma db push
npx prisma migrate dev --name init
npx prisma studio
Prisma를 사용하면서 가장 좋았던 점은, 코드와 함께 관리하는 구조로 바꿔준다는 점이었다.
모델을 schema로 정의하고, Client를 통해 타입 안전하게 접근하고, migration 파일로 이력을 남기고, Studio로 바로 데이터를 확인할 수 있다는 점이 Next.Js 프로젝트와 잘 맞았다.
특히 Next.js처럼 프론트와 서버 로직이 가까이 붙어있는 환경에서는 Prisma가 더 편하게 느껴졌다.
DB 구조와 애플리케이션 코드가 따로 노는 게 아니라, 하나의 흐름으로 연결되었기 때문이다.
개인적으로는 DB를 처음부터 서버 환경에서만 직접 관리하는 방식보다, 로컬에서 먼저 검증하고 migration 파일로 변경 이력을 남기는 방식이 더 안정적이라고 느꼈다.
배포된 DB에 바로 둩어 수정하는 방식은 빠를 수는 있지만, 구조 변경이 누적될수록 추적과 관리가 어려워질 수 있다.
Prisma를 사용한 이유도 바로 이런 점 때문이었고, 단순한 쿼리 편의성보다 스키마를 더 일관되게 관리할 수 있다는 점이 특히 크게 느껴졌다.