서론
이번에 새로운 기능 개발건에 대하여 nest와 prisma를 이용하여 개발 하기로 했다.
두가지를 조합해서 사용하는건 처음인데, 제대로 사용하기 위해서는 사전 세팅 되어야 할 것들이 많았다.
일단 prisma 에서 현재 미 지원 중 이지만, 반드시 필요해야 하는 기능들은 다음과 같았다.
Custom 기능 개발 항목
- model 정의를 위한 파일 분리 (model separate file)
- mock db를 이용한 test
- soft delete
- prisma model to ERD
희소식으로는 현재 model별 정의의 경우에는 약 5주전에 작업에 들어갔다라고 한다. (2024.06.12 기준, 현재 개발이 완료 되었다.)
해당 이슈 코멘트 (issue 2377)
Support for splitting Prisma schema into multiple files · Issue #2377 · prisma/prisma
Problem Prisma currently only supports one single Prisma Schema file. Developers want more flexibility for managing their Prisma Schema files. Motivations: breaking up large schema files to make th...
github.com
현재는 schema.prisma
파일에 모든 모델을 정의해야 해서, model이 많으면 많을수록 코드가 복잡해 지는 문제가 있다.
하지만 그 전에도 사용해야 하니, 일단 다른 방식으로 구현 해 두고 해당 내용이 prisma에 적용되면 코드에도 적용하는 방향으로 정했다.
세팅
일단 세팅을 해야 위 내용들도 처리를 하기 때문에, nest 공식문서를 이용하여 세팅을 먼저 진행 했다.
nest 프로젝트는 이미 생성되었다는 가정하에, 아래 공식 문서를 그대로 따라하기만 하면 일차적으로 prisma를 nest에서 활용 할 수 있는 상태가 된다.
Documentation | NestJS - A progressive Node.js framework
Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea
docs.nestjs.com
prisma install
npm install prisma --save-dev
이후, 아래 명령어를 실행해 주면 prisma/schema.prisma 파일이 생성된다.
npx prisma init
prisma setting
schema.prisma 파일에 다음 코드를 추가한다.
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
provider는 각자 원하는 DB를 사용하면 되고, url은 env에 정의된 값을 사용하도록 처리했다.
각각 구동되는 .env
파일 하위에 DATABASE_URL
을 정의해 주자.
(이는 사용되는 DB의 종류에 따라 서로 상이하기 때문에 확인 해 보자!)
postgresql의 경우 .env 파일에 다음과 같이 적어준다.
DATABASE_URL="postgresql://[USER_NAME]:[PASSWORD]@[HOST]:[PORT]/[DATABASE]?schema=[SCHEMA_NAME]"
prisma client install
npm install @prisma/client
prisma service 정의
nest g s prisma
import { Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
async onModuleInit() {
await this.$connect();
}
}
prisma module 설정
PrismaModule을 생성하고, 해당 모듈을 전역 등록 하여 각 모듈들에서 일일히 PrismaService를 Provide 하지 않아도 사용 할 수 있도록 한다.
nest g mo prisma
import { Global, Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';
@Global()
@Module({
providers: [PrismaService],
exports: [PrismaService],
})
export class PrismaModule {}
nest cli 를 통하여 모듈을 생성하였기 때문에, app.module.ts 에 등록이 이미 되어있을 것이다.
model 정의
아래와 같이 모델을 정의해 준다.
model User {
id Int @default(autoincrement()) @id
email String @unique
name String?
posts Post[]
}
model Post {
id Int @default(autoincrement()) @id
title String
content String?
published Boolean? @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
TIP
Model 스키마를 분리 할 수 있는 기능이 Prisma 5.15.0 버전에서 개발 되었으니, 아래 방법을 이용하여 개발을 진행 하자.
[nest.js] prisma schema 분리
old - prisma schema 분리서론글을 작성 하던 도중, prisma 에서 드디어 스키마 분리를 지원해 준다는 이슈가 작성 되었다. Support for splitting Prisma schema into multiple files · Issue #2377 · prisma/prismaProblem Prisma
jjong-factory.tistory.com
prisma db push
prisma db push
해당 명령어를 통해 현재 모델을 DB에 저장한다.
정리
nest.js를 통하여 prisma에 대한 기본적인 세팅을 완료 하였다.
이후에는 위에서 언급 하였듯 아래 내용에 대한 내용을 서술 할 예정이다.
추가적으로 현재 schema.prisma에 정의된 내용을 sql 파일로 떨어뜨리기 위해 다음과 같은 명령어를 사용한다.
npx prisma migrate dev --name init
'JAVASCRIPT > nest.js' 카테고리의 다른 글
[NestJS] NestJS + prisma CRUD (0) | 2024.06.11 |
---|---|
[nest.js] prisma schema 분리 (0) | 2024.06.04 |
[nest.js] module reference (2) | 2023.10.02 |
[Nest.js] Circular dependency (0) | 2023.10.02 |