지금 나의 프로젝트 구조는 다음과 같이 구성되어있다.
/ 루트
|-- web (프론트 서버)
|-- server (백엔드 서버)
|-- .git, package.json 등의 디렉토리 및 파일
현재 프로젝트의 경우, 루트 디렉토리에 위치한 package.json
에 작성한 스크립트를 통해 concurrently
커맨드로 web
과 server
프로젝트를 동시에 실행하는 형태이다.
그러다보니 Prisma 에 대하여 Prisma Client 를 갱신하는 npx prisma generate
나, DB 에 스키마 반영을 위한 npx prisma migrate
와 같은 명령어를 실행시키기 위해서는 Prisma 패키지가 위치한 server
디렉토리(이하 하위 디렉토리)로 이동 후 실행시켜야했다.
어느 날, 이런 과정이 너무 귀찮아서 루트 디렉토리에 있는 package.json
에 하위 디렉토리의 Prisma 커맨드를 실행할 수 있는 스크립트를 작업해보면 어떨까하는 생각이 들었다.
가령, npm run prisma:generate
라던가, npm run prisma:migrate
와 같은 커스텀 스크립트를 실행시키는 것말이다.
그래서 이번 메모글에서는 루트 디렉토리에서 하위 디렉토리에 위치한 Prisma 커맨드를 실행시키는 방법에 대해서 기록해보려고 한다.
기존 npm
명령어를 실행시킬 때, 하위 디렉토리를 지정해주려면 --prefix
옵션을 추가하고는 했다. 동일한 방법으로 npx --prefix server prisma generate
를 실행시키면 다음과 같은 오류를 마주할 수도 있다.
상기 오류는 schema.prisma
파일을 찾지 못했기 때문에 발생한다. 이를 해결하기 위해서는, 루트 디렉토리에 위치한 package.json
에 해당 파일이 어디있는지 명세해주면 된다.
// 생략...
"main": "index.js",
// 시작
"prisma": {
"schema": "./server/prisma/schema.prisma"
},
// 끝
"scripts": {
// 스크립트 생략
},
상기와 같이 prisma
의 schema
에 schema.prisma
파일이 어디있는지 루트 디렉토리 기준으로 지정해주면 된다.
이제 루트 디렉토리는 schema.prisma
파일이 어디있는지 알고있으니, 커스텀 명령어를 작성해주면 된다. 나의 경우, "prisma:gen": "npx --prefix server prisma generate"
와 같이 작성하였다.
해결 방법은 매우 간단하다. 결론부터 말하자면, 하위 디렉토리에 위치한 .env
파일을 해당 커맨드를 호출하기 위한 루트 디렉토리로 옮겨주면 된다.
하위 디렉토리에 Prisma 를 설치하였다면, 하위 디렉토리 내에 데이터소스 생성을 위한 .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"
와 같이 작성하였다.
두 번째 커맨드 결과의 경우, 이미 스키마를 한 번 반영하였기 때문에 이미 동기화 되었다고 나온다.
끗.