-
이전 포스팅으로 프리즈마에 대한 설명과 설정까지 되었다.
이제 실제로 작성하며 어떻게 Next.js 를 통해 스키마를 생성하고, 관리하는지 적어볼려고한다.
순서는 다음과 같다.
1. 스키마 설계 - 모델이란?
2. 마이그레이션 - 스키라를 실제로 적용하기
3. 클라이언트로 실제 코드 작성하기
[스키마 설계 - 모델이란?]
프리즈마에서는 테이블 하나를 "모델(model)"이라고 부른다.
schema.prisma 파일에 작성하며, 이전 설정까지 있다면 다음과 같은 파일이 된다.
/(루트파일)
ㄴ.env
ㄴprisma.config.ts
ㄴprisma
ㄴschema.prisma
참고로 이 파일의 위치는 prisma.config.ts에 defineConfig.schema에 정의되어있으니, 이전 설정을 그래도 했다면 똑같이 생성해야한다. 후에 있을 migration 파일또한 prisma 파일에 생성될 것이다.
예시로 다음과 같은 내용을 적는다고 가정한다.
model User { id String @id @default(cuid()) email String @unique password String name String? targets Target[] } #---- model Target { id String @id @default(cuid()) userId String name String user User @relation(fields: [userId], references: [id], onDelete: Cascade) }여기서 id값이 기본키(PK)이며, cuid는 prisma가 자동으로 만들어주는 고유 문자열이다. auto-increment대신 사용하며, 아무래도 장점은 후에 여러 DB로 나눠도 ID가 겹치지 않는다는 장점이 있다.
email은 유니크로 중복 불가 설정이라는 것이며,
name의 경우 String? 에 ?부분은 없어도 되는 널에이블(nullable)이라는 뜻이다.
targets Target[]이 핵심인데,
이 User는 여러개의 Target을 가질 수 있다는 "관계"를 나타낸다. 실제 DB에서는 이 컬럼은 생성되지 않는다.
prisma가 알아서 Target테이블 쪽에 있는 외래키를 보고 역방향으로 설계해주는 셈이다.
당연히 테이블 네임이 Target 이기때문에 Target이라고 적혀있는 것이며, 만약 Job이라는 테이블이 있다면 다음과 같이 작성할 수 있는 것이다.
jobs Job[]여기서 onDelete: Cascade는 User삭제시 해당 User한테 달린 Target도 같이 삭제하라는 규칙이다.
이런 규칙을 미리 정해준다면 user삭제만 신경쓰면 user에 달려있는 것들을 따로 삭제할 필요가 없다.
[마이그레이션]
위의 스키마 생성이 일종의 설계라면, 다음으로 진행할 것은 이것을 실제 반영시키는 단계이다.
현재까지는 그저 schema.prisma 라는 텍스트 파일이 있을 뿐인 것이다.
npx prisma migrate dev --name init위 명령어를 입력하면 prisma는 내부적으로 다음과 같은 일(?)을 진행한다.
1. 현재 schma.prisma와 실제 DB상태 비교
2. 차이만큼 CREATE TABLE, ALTER TABLE 따위의 명령어를 통해 SQL을 자동으로 생성한다.
3. 그 SQL파일을 migrations 파일에 저장한다.
4. 그 SQL 파일을 실제 PostgreSQL에 실행해서 진짜 테이블을 만든다.
그리하여 실제 테이블이 생성되는 것을 확인할 수 있을 것이다.
[클라이언트로 실제 코드 작성하기]
이제 테이블도 생성되었으니, 코드에서 이 데이터를 다루면 된다.
먼저 스키마 기반으로 타입스크립트 코드를 자동으로 생성한다.
npx prisma generate위 명령어 입력시 schema.prisma에 적어둔 모델을 보고 자동으로 타입과 함수들을 만들어준다.
스키마만 정의 (1번)하면 나머지는 자동으로 생성된다.
물론 이걸 매번 만들 수 없으니, 한번만 만들어서 앱 전체에서 재사용하도록 파일로 생성하면 된다.
// src/lib/prisma.ts import { PrismaClient } from "@/generated/prisma/client"; import { PrismaPg } from "@prisma/adapter-pg"; const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL }); export const prisma = new PrismaClient({ adapter });이제 다른 코드에서는 이 prisma를 사용하면 SQL 한줄없이 데이터를 다룰 수 있게 된다.
const target = await prisma.target.create({ data: { userId, name: "test", }, });위 명령어는 target 테이블에 create 명령어를 날리는 것으로, test자리에 변수로 받는 입력을 받는 하는 식으로 처리 가능하다.
[마무리]
이렇게 스키마를 설계하며 적용하고, 코드로 쓸 수 있는 예시 하나까지 하였다.
이것으로 Prisma 7버전 이상의 포스팅을 종료하겠다.
'개발 > Prisma' 카테고리의 다른 글
프리즈마(Prisma) - 설치부터 설정까지(prisma.config.ts) (0) 2026.09.18 프리즈마(Prisma) 란 무엇인가? (0) 2026.09.18 댓글
