NestJS with Prisma

2025. 9. 21. 15:11NestJS

NestJS와 Prisma를 사용하여 백엔드 개발은 처음이라 아닌 내용도 있을 수 있습니다.

만약 잘못된 내용이 있다면 알려주세요

 

NestJS에서 다양한 ORM이 존재하며 이전 회사에서는 대부분의 서비스에서 Sequelize를 사용했었으며 내가 이전에 새롭게 프로젝트를 시작하면서는 TypeORM을 사용했었다. (현재 회사는 go와 로우쿼리로...)

 

이번에 새롭게 프로젝트 할 일이 생겨 오랜만에 NestJS를 다시 하게 되었고 이번에는 Prisma로 선택하였다.

지금도 그러는지 모르겠지만 TypeORM이 런타임에서 타입안정성이 좋지 않다는 이야기가 있었고 Sequelize는 너무 오래되고 Typescript보다는 Javascript에 더 적합하다고 생각이 들었다.

다른 ORM들보다 요즘에는 Prisma가 커뮤니티가 활성화 되어있는 거 같기도 하고 래퍼런스 찾기 쉬울 거라 생각했다.

 

좀 여유롭게 Prisma에 대한 동작을 공부하고 시작하고 싶었는데 못 했다.. (개발기간이 일주일 좀 넘게 있을 줄 알았는데 다른 거 하느라 2~3일 정도밖에 없었다..)

 

 

설치방법

pnpm add prisma @prisma/client

일단 package manager로 pnpm을 사용하였기에 이런식으로 하였다.

vscode를 쓴다면 prisma extension을 사용하는 것을 추천한다.

나는 처음부터 썼고 있다고 해서 나쁘지 않으니 그리고 가장 추천하는 설정은 저장할 때마다 format해주는 설정이다. 이거는 강추다. 진짜 go는 vscode go 서버에서 default로 설정되어 있지만 다른 거는 아니다..

 

설정

npx prisma init

 

위의 명령어를 쓰면 `prisma/schema.prisma` 파일이 생기며 아래와 같이 코드가 생성되어 있을 것이다.

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init

generator client {
  provider = "prisma-client-js"
  output   = "../generated/prisma"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

 

분명 prisma의 공식 문서에 나와 있어 이거를 그래로 써야 하는 줄 알았지만.. 이 파일에 output이 있는 데 이것 때문에 좀 고생을 했다. output을 지워주면 굉장히 훌륭한 상태가 된다. (남겨두면 빌드할 때 힘들다..)

그리고 나는 cloud run을 사용했는데 공식문서에는 Azure도 있고 AWS도 있고 다른 것들은 있었으나 GCP만... 못 찾았다.. (난 GCP가 좋은데.. 왜 싫어하지..)

그래서 os때문에 다른 provider를 추가해야했다. 이거는 다음에 이슈해결부분에서 다시 작성하겠다. (GCP에서 나온 이슈들과 함께 하겠다.)

 

model Auth {
  id         String    @id @default(uuid()) @db.Uuid
  sequence   Int       @default(autoincrement())
  externalId String    @map("external_id") @db.VarChar(255)
  createdAt  DateTime  @default(now()) @map("created_at")
  updatedAt  DateTime  @updatedAt @map("updated_at")
  deletedAt  DateTime? @map("deleted_at") @db.Timestamptz()

  recommendations Recommendation[]
  consumption     Consumption[]
  Stat            Stat[]

  @@map("auth")
}

model Recommendation {
  id            String    @id @default(uuid()) @db.Uuid
  sequence      Int       @default(autoincrement())
  stockName     String    @map("stock_name") @db.VarChar(255)
  userId        String    @map("user_id") @db.Uuid
  recommendedAt DateTime? @map("recommended_at") @db.Timestamptz()
  score         Float?    @db.DoublePrecision
  createdAt     DateTime  @default(now()) @map("created_at")
  updatedAt     DateTime  @updatedAt @map("updated_at")

  user Auth @relation(fields: [userId], references: [id])

  @@map("recommendations")
}

 

일단 프로젝트에서 prisma의 일부를 발췌해왔다. 일단 기본적으로 schema.prisma파일에 설정 밑에 위와 같은 형식으로 스키마를 정의하고 아래와 같이 하면 `prisma/migrations`에 migration 파일이 생성 된다

npx prisma migrate dev --name migration_name

 

이후에는 db연결이 된다면 아래와 같이 명령어를 쓰면 된다. dev와 deploy의 차이는 아직 확실히 모르겠지만 일단은 명령어는 나눠져 있다. (이 부분은 나중에 찾아보고 추가할 예정이다.)

일단 필자는 local에서 docker compose로 하여 테스트할때는 dev로 하였고 cloud sql에서는 deploy를 사용하였다.

# development
npx prisma migrate dev

# production
npx prisma migrate deploy