ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 03. Prisma 7 + NestJS 셋업 트러블 슈팅 — `datasources`는 이제 없다
    프로젝트/개인프로젝트 2026. 2. 26. 13:49

    환경: NestJS + Prisma 7.4.1 + PostgreSQL / macOS


    배경

    NestJS 백엔드 프로젝트를 새로 세팅하면서 Prisma를 ORM으로 선택했다. 예전에 쓰던 코드를 그대로 가져왔는데, 서버를 켜는 순간 오류 폭탄을 맞았다. Prisma 7은 이전 버전과 설정 방식이 완전히 바뀌어 있었다.


    1단계 오류 — datasources is Unknown

    서버 실행 시 처음 만난 오류:

    PrismaClientConstructorValidationError: Unknown property datasources provided to PrismaClient constructor.

    기존 PrismaService는 이렇게 생겼었다:

    super({
      datasources: {
        db: { url: process.env.DATABASE_URL },
      },
    } as any);

    Prisma 6까지는 잘 동작하던 코드다. 그런데 Prisma 7에서는 datasources 옵션이 생성자에서 완전히 제거됐다. 에러 메시지를 보고 공식 문서 링크(https://pris.ly/d/client-constructor)를 따라가 봤다.


    2단계 오류 — PrismaClientInitializationError: non-empty options required

    datasources를 제거하고 super()만 쓰니 이번엔 이런 오류가 났다:

    PrismaClientInitializationError: `PrismaClient` needs to be constructed with a non-empty, valid `PrismaClientOptions`

    Prisma 7에서는 prisma.config.ts가 별도로 존재하면 클라이언트 생성자에 반드시 옵션을 넘겨야 하는데, 동시에 datasources는 쓸 수 없는 상황이 생긴다.


    3단계 오류 — datasourceUrl does not exist in type

    그래서 Prisma 7 문서에서 찾은 datasourceUrl 옵션을 써봤다:

    super({
      datasourceUrl: process.env.DATABASE_URL,
    });

    TypeScript 컴파일 오류:

    error TS2353: Object literal may only specify known properties, and 'datasourceUrl' does not exist in type 'Subset<PrismaClientOptions, PrismaClientOptions>'.

    as any로 우회했더니, 이번엔 런타임에서:

    PrismaClientConstructorValidationError: Unknown property datasourceUrl provided to PrismaClient constructor.

    즉, prisma.config.ts가 존재하면 생성자에서 어떤 datasource 관련 옵션도 받지 않는다.


    4단계 오류 — schema.prisma에서 url 사용 불가

    전통적인 방식으로 돌아가려고 schema.prisma에 url을 추가했다:

    datasource db {
      provider = "postgresql"
      url      = env("DATABASE_URL")
    }

    npx prisma generate를 실행하니:

    Error: P1012
    The datasource property `url` is no longer supported in schema files.

    Prisma 7은 스키마 파일에서 url 설정을 완전히 금지했다.


    5단계 오류 — @prisma/client를 찾을 수 없음

    이제 Prisma 7의 새로운 방식인 드라이버 어댑터를 써야 한다는 걸 알았다. previewFeatures = ["driverAdapters"]를 추가하고 npx prisma generate를 실행했더니:

    Error: Could not resolve @prisma/client.

    프로젝트 구조가 모노레포처럼 되어 있어서 루트의 node_modules에 설치된 prisma CLI가 실행되고 있었고, 정작 smart-diet-backend 안에는 prisma CLI 자체가 없었다.

    # smart-diet-backend에 prisma CLI가 없음을 확인
    ls ./node_modules/.bin/prisma  # → No such file or directory

    최종 해결 방법

    1. smart-diet-backend에 패키지 설치

    cd smart-diet-backend
    npm install prisma --save-dev
    npm install @prisma/adapter-pg pg
    npm install -D @types/pg

    포인트: 루트의 npx prisma generate가 계속 실패했던 이유가 바로 여기 있었다. smart-diet-backend 안에 prisma CLI 자체가 없었기 때문에 ./node_modules/.bin/prisma 경로 자체가 존재하지 않았다. npm install prisma --save-dev로 로컬에 설치한 뒤, 아래처럼 직접 경로를 지정해서 실행하니 처음으로 성공했다:

    ./node_modules/.bin/prisma generate

    이후에는 npx가 로컬 node_modules를 우선 탐색하므로 npx prisma generate로도 정상 동작한다.

    2. schema.prisma — url 없이, driverAdapters 선언

    generator client {
      provider        = "prisma-client-js"
      previewFeatures = ["driverAdapters"]
    }
    
    datasource db {
      provider = "postgresql"
    }

    3. prisma.config.ts — CLI(migrate, generate)용 URL 설정

    import { defineConfig } from '@prisma/config';
    import 'dotenv/config';
    
    export default defineConfig({
      datasource: {
        url: process.env.DATABASE_URL,
      },
    });

    4. prisma.service.ts — 드라이버 어댑터로 연결

    import { Injectable, OnModuleInit } from '@nestjs/common';
    import { PrismaClient } from '@prisma/client';
    import { PrismaPg } from '@prisma/adapter-pg';
    import 'dotenv/config';
    
    @Injectable()
    export class PrismaService extends PrismaClient implements OnModuleInit {
      constructor() {
        const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
        super({ adapter });
      }
    
      async onModuleInit() {
        await this.$connect();
      }
    }

    5. 클라이언트 재생성 및 서버 실행

    npx prisma generate
    npm run start:dev

    핵심 정리 — Prisma 7의 변경점

    항목 Prisma 6 이하 Prisma 7
    생성자 URL 설정 datasources: { db: { url } } 생성자에서 불가, 어댑터 사용
    스키마 URL 설정 url = env("DATABASE_URL") 지원 안 함
    CLI URL 설정 스키마 파일 prisma.config.ts
    DB 연결 방식 내장 엔진 드라이버 어댑터 필수

    교훈

    • Prisma 7은 메이저 버전답게 breaking change가 크다. 마이그레이션 가이드를 먼저 읽자.
    • 모노레포 구조에서는 패키지 위치에 주의. CLI가 어느 node_modules를 참조하는지 꼭 확인해야 한다.
    • prisma.config.tsschema.prisma의 역할이 분리됐다. 스키마는 모델 정의만, URL 설정은 prisma.config.ts가 담당한다.
Designed by Tistory.