[Nest.js] 루트 디렉토리에서 하위 디렉토리에 위치한 Prisma 명령어 스크립트로 실행시키기

정지현·2022년 11월 15일
0

지금 나의 프로젝트 구조는 다음과 같이 구성되어있다.

/ 루트
|-- web (프론트 서버)
|-- server (백엔드 서버)
|-- .git, package.json 등의 디렉토리 및 파일

현재 프로젝트의 경우, 루트 디렉토리에 위치한 package.json 에 작성한 스크립트를 통해 concurrently 커맨드로 webserver 프로젝트를 동시에 실행하는 형태이다.

그러다보니 Prisma 에 대하여 Prisma Client 를 갱신하는 npx prisma generate 나, DB 에 스키마 반영을 위한 npx prisma migrate 와 같은 명령어를 실행시키기 위해서는 Prisma 패키지가 위치한 server 디렉토리(이하 하위 디렉토리)로 이동 후 실행시켜야했다.

어느 날, 이런 과정이 너무 귀찮아서 루트 디렉토리에 있는 package.json 에 하위 디렉토리의 Prisma 커맨드를 실행할 수 있는 스크립트를 작업해보면 어떨까하는 생각이 들었다.

가령, npm run prisma:generate 라던가, npm run prisma:migrate 와 같은 커스텀 스크립트를 실행시키는 것말이다.

그래서 이번 메모글에서는 루트 디렉토리에서 하위 디렉토리에 위치한 Prisma 커맨드를 실행시키는 방법에 대해서 기록해보려고 한다.

루트 디렉토리에서 하위 디렉토리의 npx prisma generate 동작시키기

기존 npm 명령어를 실행시킬 때, 하위 디렉토리를 지정해주려면 --prefix 옵션을 추가하고는 했다. 동일한 방법으로 npx --prefix server prisma generate 를 실행시키면 다음과 같은 오류를 마주할 수도 있다.

상기 오류는 schema.prisma 파일을 찾지 못했기 때문에 발생한다. 이를 해결하기 위해서는, 루트 디렉토리에 위치한 package.json 에 해당 파일이 어디있는지 명세해주면 된다.

package.json (루트 디렉토리)

  // 생략...
  "main": "index.js",
  // 시작
  "prisma": {
    "schema": "./server/prisma/schema.prisma"
  },
  // 끝
  "scripts": {
    // 스크립트 생략
  },

상기와 같이 prismaschemaschema.prisma 파일이 어디있는지 루트 디렉토리 기준으로 지정해주면 된다.

이제 루트 디렉토리는 schema.prisma 파일이 어디있는지 알고있으니, 커스텀 명령어를 작성해주면 된다. 나의 경우, "prisma:gen": "npx --prefix server prisma generate" 와 같이 작성하였다.

루트 디렉토리에서 하위 디렉토리의 npx prisma migrate 명령어 동작시키기

해결 방법은 매우 간단하다. 결론부터 말하자면, 하위 디렉토리에 위치한 .env 파일을 해당 커맨드를 호출하기 위한 루트 디렉토리로 옮겨주면 된다.

하위 디렉토리에 Prisma 를 설치하였다면, 하위 디렉토리 내에 데이터소스 생성을 위한 .env 파일을 작성하였을 것이다.

보통 공식 도큐먼트를 통해 설치하였다면 다음과 같이 구성되어있을 것이다.

.env (하위 디렉토리)

# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema

# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings

DATABASE_URL="postgresql://postgres:password@localhost:5432/local_db?schema=military_count_down"

만일, 루트 디렉토리에서 npx --prefix server prisma migrate dev --name test 와 같이 커맨드를 실행시켰다면 오류가 발생한다. 루트 디렉토리에서는 .env 파일을 읽어올 수 없기 때문이다(하위 디렉토리의 .env 를 읽어올 수 있는지 좀 더 찾아봐야겠다).

따라서, 하위 디렉토리에 위치한 .env 파일을 루트 디렉토리로 옮겨주면 된다.

이제 루트 디렉토리의 package.json 에 커스텀 스크립트를 작성하면 된다. 나의 경우, "prisma:mig-dev": "npx --prefix server prisma migrate dev" 와 같이 작성하였다.

결과

$ npx prisma generate

$ npx prisma migrate dev

두 번째 커맨드 결과의 경우, 이미 스키마를 한 번 반영하였기 때문에 이미 동기화 되었다고 나온다.

끗.

profile
나를 성장시키는 좌절에 감사하고 즐기려고 노력 중

0개의 댓글