• 프리즈마(Prisma) - 실제 적용하기

    2026. 9. 18.

    by. Daramu

    이전 포스팅으로 프리즈마에 대한 설명과 설정까지 되었다.

    이제 실제로 작성하며 어떻게 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버전 이상의 포스팅을 종료하겠다.

     

    댓글