본문 바로가기

TIL

TIL 24.11.14 Prisma 전역 객체 선언 및 타입 지정

next.js 15 + react 19 에 대한 authenticaiton 강의를 들으면서 prisma 를 사용할 일이 생겼다.

우선 db를 셋팅하기 전 Node.js 에서 prisma 를 사용할 때 개발환경에서는 PrismaClient 인스턴스를 전역으로 설정해서 성능을 최적화 시켜주어야 한다.

 

전역객체에 Prisma 인스턴스를 선언하는 이유 

: 개발 환경에서는 코드가 변경될 때마다 서버가 재시작(hot-reload)되고, 이는 새로운 PrismaClient 인스턴스를 계속 생성하는 문제를 발생시킬 수 있다. 따라서 prisma 인스턴스를 전역 객체에 선언해서 node.js 의 전역범위에서 하나의 prisma 인스턴스를 재사용 할 수 있음.

 

var로 선언한 변수는 전역 스코프에서 전역객체 (global 또는 window)속성으로 추가된다. 따라서 global.prisma 와 같은 형태로 접근할 수 있음. 그러나 let, const 는 블록 스코프를 갖기 때문에 전역 객체에 속성으로 추가되지 않아 타입에러 발생

 

그렇지만 eslint 에서는 let 이나 const를 var 대신에 사용할 것을 권고하고 있는데,

import { PrismaClient } from "@prisma/client";

declare global {
  // eslint-disable-next-line no-var
  var prisma: PrismaClient | undefined;
}

export const db = globalThis.prisma || new PrismaClient();

if (process.env.NODE_ENV !== "production") globalThis.prisma = db;

 

ESLint 규칙을 비활성화 하기 위해 위처럼 주석을 작성해주면 no-var 규칙을 비활성화 하여 ESLint 경고를 무시한다.

 

prisma production mode 에서는 아래와같이 작성한다. 

export const db = new PrismaClient;