도커 NestJs - #3 Prisma 붙이기

혀어어언·2023년 4월 9일
2

Docker

목록 보기
10/11

DB 설정

prisma 설치

프로젝트에서 prisma를 설치합니다.

$ npm i -D prisma

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` 파일에 다음과 같이 적어줍시다.

  • 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)
}

마이그레이션

Running migrations

#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

prisma 디렉토리 경로 변경

디렉토리 이동 및 디렉토리명 변경

src/
  database/
    schema.prisma
    migrations/

package.json 수정

prisma 디렉터리를 이동한 경우, Prisma CLI가 스키마를 찾을 수 있는 위치를 알 수 있도록 package.json 파일에 해당 위치를 추가해야 합니다:

package.json

"prisma": {
	"schema": "src/database/schema.prisma"
}

prisma 클라이언트로 nestJS 앱에서 DB 접근

지금까지 데이터베이스 측면을 설정했지만 아직 NestJS 앱 내에서 데이터베이스에 대한 읽기/쓰기를 할 수 없습니다.

Prisma 클라이언트로 들어가기 전에, NestJS 로컬 컨테이너와 Postgres 로컬 컨테이너가 올바르게 통합되도록 docker-compose.yml 파일을 약간 수정해보겠습니다.

docker-compose 수정

# ... 중략
env_file:
  - .env
environment:
  DATABASE_URL: ${DATABASE_URL}
  PORT: ${PORT}

prisma-client 설치

$ npm install @prisma/client

Dockerfile 수정

프리즈마 클라이언트는 코드를 프로젝트의 node_modules 폴더에 자동 생성함으로서 작동합니다. 이러한 자동 생성은 로컬 마이그레이션 실행 또는 @prisma/client 패키지를 설치할 때 자동으로 이루어집니다.

현재 Dockerfilenpm ci 단계에서 종속성을 설치하고 있지만, 로컬 디렉토리에 파일을 COPY하기 전 단계에서 실행하고 있기 때문에 이러한 자동생성은 발생하지 않습니다.

따라서 자동 생성을 수동으로 수행하기 위해서 명령어가 필요합니다. package.json 파일에 prisma generate 명령을 스크립트로 추가해보겠습니다.

package.json 수정
"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(파일 수정 시 필요)

0개의 댓글