프로젝트에서 prisma를 설치합니다.
$ npm i -D prisma
아래의 커맨드를 통해 schema.prisma
파일을 가진 prisma
디렉토리를 생성합니다.
$ npx prisma init
프로젝트 내부의 .env
파일에 DATABASE_URL
환경 변수를 작성해줍니다.
DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?schema=public"
도커파일에서는 node-alpine을 기본 이미지로 사용하기 때문에 Prisma의 binaryTargets
을 구성해야 합니다. schema.prisma` 파일에 다음과 같이 적어줍시다.
generator client {
provider = "prisma-client-js"
binaryTargets = ["native", "linux-musl"]
}
모델을 작성해줍니다.
model Users {
id String @default(uuid()) @id
email String
name String
password String
date_of_birth DateTime
phone String
is_active Boolean @default(true)
}
#2의 Docker-compose에서 설정한 로컬 postgres 서버가 가동중이라면 마이그레이션을 실행할 수 있습니다.
새로운 Prisma 스키마를 추가하거나 기존 스키마를 조정할 때는 로컬에서 마이그레이션을 실행해야 하므로 마이그레이션을 실행해봅시다.
$ npx prisma migrate dev --name init
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "test", schema "public" at "localhost:5432"
Applying migration `20230409055400_init`
The following migration(s) have been created and applied from new schema changes:
migrations/
└─ 20230409055400_init/
└─ migration.sql
Your database is now in sync with your schema.
Running generate... (Use --skip-generate to skip the generators)
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE package: '@angular-devkit/core@15.2.4',
npm WARN EBADENGINE required: {
npm WARN EBADENGINE node: '^14.20.0 || ^16.13.0 || >=18.10.0',
npm WARN EBADENGINE npm: '^6.11.0 || ^7.5.6 || >=8.0.0',
npm WARN EBADENGINE yarn: '>= 1.13.0'
npm WARN EBADENGINE },
npm WARN EBADENGINE current: { node: 'v18.4.0', npm: '9.6.4' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE package: '@angular-devkit/schematics@15.2.4',
npm WARN EBADENGINE required: {
npm WARN EBADENGINE node: '^14.20.0 || ^16.13.0 || >=18.10.0',
npm WARN EBADENGINE npm: '^6.11.0 || ^7.5.6 || >=8.0.0',
npm WARN EBADENGINE yarn: '>= 1.13.0'
npm WARN EBADENGINE },
npm WARN EBADENGINE current: { node: 'v18.4.0', npm: '9.6.4' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE package: '@angular-devkit/schematics-cli@15.2.4',
npm WARN EBADENGINE required: {
npm WARN EBADENGINE node: '^14.20.0 || ^16.13.0 || >=18.10.0',
npm WARN EBADENGINE npm: '^6.11.0 || ^7.5.6 || >=8.0.0',
npm WARN EBADENGINE yarn: '>= 1.13.0'
npm WARN EBADENGINE },
npm WARN EBADENGINE current: { node: 'v18.4.0', npm: '9.6.4' }
npm WARN EBADENGINE }
added 2 packages, and audited 681 packages in 11s
96 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
✔ Generated Prisma Client (4.12.0 | library) to ./node_modules/@prisma/client in 204ms
src/
database/
schema.prisma
migrations/
prisma 디렉터리를 이동한 경우, Prisma CLI가 스키마를 찾을 수 있는 위치를 알 수 있도록 package.json 파일에 해당 위치를 추가해야 합니다:
package.json
"prisma": {
"schema": "src/database/schema.prisma"
}
지금까지 데이터베이스 측면을 설정했지만 아직 NestJS 앱 내에서 데이터베이스에 대한 읽기/쓰기를 할 수 없습니다.
Prisma 클라이언트로 들어가기 전에, NestJS 로컬 컨테이너와 Postgres 로컬 컨테이너가 올바르게 통합되도록 docker-compose.yml
파일을 약간 수정해보겠습니다.
# ... 중략
env_file:
- .env
environment:
DATABASE_URL: ${DATABASE_URL}
PORT: ${PORT}
prisma-client
설치$ npm install @prisma/client
프리즈마 클라이언트는 코드를 프로젝트의 node_modules
폴더에 자동 생성함으로서 작동합니다. 이러한 자동 생성은 로컬 마이그레이션 실행 또는 @prisma/client
패키지를 설치할 때 자동으로 이루어집니다.
현재 Dockerfile
의 npm ci
단계에서 종속성을 설치하고 있지만, 로컬 디렉토리에 파일을 COPY하기 전 단계에서 실행하고 있기 때문에 이러한 자동생성은 발생하지 않습니다.
따라서 자동 생성을 수동으로 수행하기 위해서 명령어가 필요합니다. package.json
파일에 prisma generate
명령을 스크립트로 추가해보겠습니다.
"scripts": {
...
"prisma:generate": "npx prisma generate"
},
이제 Dockerfile
내부에서 사용자 정의 스크립트를 사용할 수 있습니다.
스크립트는 로컬 디렉터리에 있는 파일을 이미지로 COPY한 후 RUN 되어야 하므로 소스 번들링 이후에 작성해줍니다.
# 소스 번들링
COPY --chown=node:node . .
# 소스 번들링 이후에 작성해줍니다!
# prisma 데이터 베이스 client 코드 생성
RUN npm run prisma:generate
마찬가지로 Docker Compose 파일을 수정했기 때문에 실행 중인 컨테이너를 중지 후 재실행합니다.
$ docker-compose down
$ docker-compose up -d -V --build
# -d 컨테이너 백그라운드에서 실행
# -V 컨테이너에 종속성의 강제로 새로 설치(새로운 npm 패키지를 설치했다면 필요합니다)
# --build 이미지 re-build(파일 수정 시 필요)