⚙️ Prisma 설정 파일 정리: .env, prisma.ts, schema.prisma의 역할

Jisunmin·2025년 6월 20일
post-thumbnail

Prisma를 사용할 때 기본적으로 다루게 되는 파일은 다음 세 가지입니다:

  • .env
  • prisma.ts
  • schema.prisma

각 파일이 어떤 역할을 하는지에대해 알아보겠습니다.


1. 📁 .env – 환경 변수 설정 파일

.env 파일은 데이터베이스 접속 정보와 같은 민감한 환경 변수를 저장하는 파일입니다. schema.prisma에서는 이 파일을 참조해 DATABASE_URL과 같은 값을 가져옵니다.

예시

# Supabase 연결 (Connection Pooling)
DATABASE_URL="postgresql://postgres.********:********@aws-0-ap-northeast-2.pooler.supabase.com:6543/postgres?pgbouncer=true"

# 마이그레이션 등 직접 연결용
DIRECT_URL="postgresql://postgres.********:********@aws-0-ap-northeast-2.pooler.supabase.com:5432/postgres"

⚠️ 주의:
.env는 절대 Git에 커밋되면 안 됩니다.
.gitignore에 반드시 포함해야 합니다.

2. 🔧 prisma.ts – Prisma Client 인스턴스 관리

이 파일은 Prisma Client를 싱글톤으로 생성하고, 이를 애플리케이션 어디에서든 사용할 수 있도록 내보내는 역할을 합니다.

// src/lib/prisma.ts
import { PrismaClient } from "@prisma/client";

const globalForPrisma = globalThis as unknown as {
  prisma: PrismaClient | undefined;
};

export const prisma =
  globalForPrisma.prisma ?? new PrismaClient();

if (process.env.NODE_ENV !== "production") {
  globalForPrisma.prisma = prisma;
}

✅ 주요 포인트

  • 개발환경에서는 PrismaClient가 여러 번 생성되는 문제를 방지하기 위해 globalThis에 저장
  • production 환경에서는 매번 새로 생성해도 무방

🤔 왜 production에서는 괜찮을까?

production은 일반적으로 핫 리로딩이 없고, 서버도 한 번 실행되면 계속 유지되기 때문입니다.
그래서 굳이 싱글톤을 만들지 않아도 인스턴스가 하나만 생성되고 안정적으로 유지됩니다.

⚡ Next.js와 핫 리로딩 (Hot Reloading)
Next.js 개발 환경에서는 코드가 저장되면 자동으로 리프레시 됩니다.
이걸 핫 리로딩(Hot Reloading)이라고 하는데 이때 전체 앱(서버 프로세스)이 다시 실행되기 때문에, new PrismaClient()가 매번 호출될 수 있어요.
→ 이러면 개발 중에 DB 연결 수가 폭발적으로 증가할 수 있습니다.

3. 📜 prisma/schema.prisma – Prisma 스키마 정의 파일

이 파일은 Prisma의 핵심 설정 파일로, 다음 내용을 정의합니다:

  • 사용할 DB 종류
  • 연결 URL
  • Prisma Client 생성기
  • 데이터 모델 (예: User, Post 등)

예시

generator client {
  provider = "prisma-client-js"
}

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

model User {
  id       Int    @id(map: "user_pkey") @default(autoincrement())
  password String
  userId   String @unique(map: "user_userId_key")
  name     String
}

✅ 주요 포인트

  • generator 블록은 Prisma Client를 생성하기 위한 설정입니다.
  • datasource 블록은 어떤 데이터베이스와 연결할지를 명시합니다.
  • model은 실제 DB 테이블을 정의합니다.

🤔이 세 가지 파일 .env, lib/prisma.ts, prisma/schema.prisma는 꼭 있어야 할까?

  • schema.prisma: ✅ 반드시 있어야 합니다. 데이터 모델, DB 연결 정보를 정의하기 때문입니다.
    -.env: 🔺 Prisma 설정(DATABASE_URL)을 .ev로 분리해서 관리하는게 일반적이지만, 직접 schema.prisma안에 넣는것도 가능합니다. 다만 보안과 유지보수 측면에서 .env 사용이 권장됩니다.
  • prisma.ts: ❌ 필수는 아닙니다. 프로젝트에서 Prisma Client를 직접 import해서 쓰는 것도 가능하지만, lib/prisma.ts 처럼 싱글톤 패턴으로 만들어 중복 인스턴스 생성 방지를 위해 사용됩니다.

❓ 개발 환경에서 PrismaClient가 여러 번 생성된다는 건

  • PrismaClient는 무겁고, DB 연결을 유지하기 때문에 여러 개가 생성되면 리소스 낭비가 커집니다.
// 잘못된 예
const prisma = new PrismaClient(); // 페이지 리로드나 API 호출마다 새로 생성됨

✅ 해결: 싱글톤 패턴

// globalThis를 활용해서 중복 생성을 방지
if (!globalThis.prisma) {
  globalThis.prisma = new PrismaClient();
}

✅ 요약 정리

파일명역할 설명
.envDB 접속 정보 등 민감한 환경 변수 저장
lib/prisma.tsPrisma Client를 싱글톤으로 생성, 전역에서 사용 가능
schema.prismaDB 스키마 정의 및 설정 파일
profile
단순 사용자가 아닌, 이해하고 만드는 개발자가 되기 위한 기록.

0개의 댓글