NestJS + Prisma 연결하기 - (공식 문서를 잘 확인하자...)

2025. 12. 20. 23:53·NestJS/개발

공식문서 잘 확인하기 ...

개발을 하다 보면 공식문서를 그대로 따라 썼는데도 예상치 못한 문제가 발생할 때가 있다. 나도 NestJS 공식문서의 예제 코드를 아무 생각 없이 가져다 쓰다가 나의 소중한 시간을 날렸다. 문제는 데이터베이스 연결 방식에서 발생했는데, 로그에는 단순히 "DB 접속 불가"라는 메시지만 떴을 뿐, 원인을 바로 알 수 없었다. 도커 컨테이너에 PostgreSQL이 제대로 설치되어 있는지도 확인하고, 모든 환경 설정을 점검했지만 여전히 문제는 해결되지 않았다. 그러던 중 Prisma 공식문서를 살펴보면서, 내가 사용한 파라미터 이름이 잘못되었다는 사실을 알게 되었다. 공식문서에는 연결 방식을 설명하면서 이유가 명확히 나와 있었지만, 나는 그 부분을 깊게 이해하지 않고 넘어간 것이었다. 이 경험을 통해, 공식문서를 우선적으로, 더 자세히 봐야겠다고 생각했다.


프로젝트 셋팅

처음으로 nest/cli로 프로젝트를 먼저 만들어 보도록 하겠다.

nest new prisma-test


prisma 설치하기

자 프로젝트가 정상적으로 셋팅이 되었고, 이제 해야하는 것은 prisma를 설치해야한다. 설치방법은 아래의 명령어로 해보자.

npm i prisma

그리고 나서 prisma 초기 셋팅을 해야하는데 그것은 명령어로 바로 가능하다. 아래의 명령어를 사용하여 셋팅해보자.

npx prisma init

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init

generator client {
  provider = "prisma-client"
  output   = "../generated/prisma"
  moduleFormat    = "cjs"
}

datasource db {
  provider = "postgresql"
}

기본적으로 저렇게 나올텐데 moduleFormat은 내가 추가 해주었다.

moduleFormat
Prisma v7은 기본적으로 ES 모듈로 제공되는데, 이는 NestJS의 CommonJS 설정과 호환되지 않으므로 이 설정이 필요하다. 이 설정을 활성화 하면 cjsPrisma가 ESM 대신 CommonJS 모듈을 생성하도록 강제할 수 있다.
https://docs.nestjs.com/recipes/prisma#set-the-generator-output-path

.env 확인하기

DATABASE_URL="postgresql://user:password@localhost:5432/db-name?schema=public"

각각에 알맞은 아이디, 비밀번호, 서버주소, 스키마 설정등을 해두자. 그리고 .env를 잘 가져오기 위해 아래의 패키지도 설치를 해야한다.

npm i @nestjs/config
  • process.env전역 변수를 통해 접근할 수 있다.

schema.prisma

schema.prisma 를 열고 하단에 테스트용으로 추가해보자. Prisma Schema에 정의하는 모델인데, 데이터베이스 테이블을 코드로 정의한 설계도이다.

model User {
  id    Int     @default(autoincrement()) @id
  email String  @unique
  name  String?
}

그리고 위의 설계도를 postgresql에 주입시켜보자.

npx prisma migrate dev

모델에 만들어둔 데이터들이 자동으로 테이블을 만들어주었다.

그리고 나서 중요한것은 아래의 명령어다.

npx prisma generate
  • 설계도를 읽어서 실제 사용할 코드(Client)를 만들어주는 단계다.

 PrismaService 만들기

nest g service prisma/prisma --flat

서비스 파일 하나 만들어두고 아래의 모듈을 설치해야한다.

npm install @prisma/client
npm install @prisma/adapter-pg
import { Injectable } from '@nestjs/common';
import { PrismaPg } from '@prisma/adapter-pg';
import { PrismaClient } from 'generated/prisma/client';

@Injectable()
export class PrismaService extends PrismaClient {
  constructor() {
    const adapter = new PrismaPg({
      connectionString: process.env.DATABASE_URL,
    });
    super({ adapter });
  }
}

모듈도 하나 작업해주자

import { Global, Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';

@Global()
@Module({
  providers: [PrismaService],
  exports: [PrismaService],
})
export class PrismaModule {}

실수 방지하기

이게 공식문서인데 지금 저 코드는 Sqlite3를 연결하는 코드이다. Prisma 공식 사이트에 들어가면 PrismaPg에 대한 파라미터가 나온다.
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { PrismaModule } from './prisma/prisma.module';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [ConfigModule.forRoot({ isGlobal: true }), PrismaModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

ConfigModule.forRoot()를 사용하여 전역에서 사용할수 있게 해놓는다.


테스트하기

import { Injectable } from '@nestjs/common';
import { PrismaService } from './prisma/prisma.service';
import { User } from 'generated/prisma/client';

@Injectable()
export class AppService {
  constructor(private readonly prisma: PrismaService) {}
  async getHello(): Promise<User[]> {
    return await this.prisma.user.findMany();
  }
}
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello() {
    return this.appService.getHello();
  }
}


셋팅정리 

npm i prisma
npm i @nestjs/config
npm i @prisma/client
npm i @prisma/adapter-pg
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { PrismaModule } from './prisma/prisma.module';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [ConfigModule.forRoot({ isGlobal: true }), PrismaModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

참고

https://docs.nestjs.com/recipes/prisma

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

https://www.prisma.io/docs/orm/overview/databases/postgresql

 

PostgreSQL database connector | Prisma Documentation

This page explains how Prisma can connect to a PostgreSQL database using the PostgreSQL database connector.

www.prisma.io

 

'NestJS > 개발' 카테고리의 다른 글

Redis/BullMQ 이용하여 연산 작업 따로하기  (0) 2025.12.23
JWT - Passport 사용하기  (0) 2025.12.22
JWT - 역할 기반 관리하기  (1) 2025.12.21
JWT - 토큰 활용하기  (0) 2025.12.21
JWT - 로그인 후 발급하기  (1) 2025.12.21
'NestJS/개발' 카테고리의 다른 글
  • JWT - Passport 사용하기
  • JWT - 역할 기반 관리하기
  • JWT - 토큰 활용하기
  • JWT - 로그인 후 발급하기
나는지토
나는지토
  • 나는지토
    안녕은헬로입니다.
    나는지토
  • 전체
    오늘
    어제
    • 분류 전체보기 (27)
      • Backend Design (1)
      • NestJS (19)
        • 개발 (9)
        • 개념과 구조 정리 (10)
      • SpringBoot (0)
      • Java (4)
        • 코테 (0)
      • PostgreSQL (2)
      • Docker (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    인증 가드
    db 연결 오류
    조회 방식
    Redis
    서비스
    커서기반 조회
    역할 검사
    컨트롤러
    JWT
    코딩테스트
    ArrayList
    토큰 검사
    채팅
    Java
    자료구조
    BullMQ
    nestjs
    nestjs/jwt
    PostgreSQL
    Collections
  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
나는지토
NestJS + Prisma 연결하기 - (공식 문서를 잘 확인하자...)
상단으로

티스토리툴바