카테고리 없음

백엔드 서버에 2개의 prisma 가 있는 이유는? 환경별 설정 (개발 / 운영 / 테스트 등)

김영수 2025. 4. 5. 12:43

이미지를 보다싶이 백엔드서버측에 두개의 prisma 폴더가 있는데 둘다 필요한가요?

 

 

응답:

보여주신 것처럼 프로젝트 루트 (ONEBITE-BOOKS-SERVER-MAIN/prisma)와 src 내부 (src/prisma)에 각각 prisma 폴더가 존재하고 있는데, 보통 둘 다 필요한 경우는 거의 없습니다.

각 역할을 구분해서 설명드리자면:

 

1. 루트 디렉토리의 prisma 폴더 (/prisma) 

  • 보통 Prisma 스키마 파일(schema.prisma)  마이그레이션 파일 등을 두는 곳입니다.
  • 예를 들어:
prisma/
  ├── schema.prisma
  └── migrations/

 

 

  • 즉, Prisma Client 생성 DB 마이그레이션 관리 목적의 폴더입니다.
  • Prisma CLI는 기본적으로 이 위치를 참조하도록 되어 있습니다.

 

2. src 내부의 prisma 폴더 (src/prisma) 

  • 여기는 코드 상에서 PrismaService, PrismaModule 같은 NestJS에서 DB 접근을 위한 서비스 클래스를 관리하는 용도로 보입니다.
  • 예를 들어:
src/prisma/
  ├── prisma.module.ts
  └── prisma.service.ts

 

즉, NestJS 의존성 주입(Dependency Injection)  DB 연결 관리를 위한 코드가 위치하는 부분입니다.

 

결론 (정리)

위치.                                역할                                                                                        삭제 가능 여부

 

/prisma Prisma CLI용 스키마, 마이그레이션 파일 관리 ❌ (Prisma Client, 마이그레이션 시 필요)
src/prisma NestJS에서 사용할 Prisma Service / Module 관리 ❌ (NestJS가 Prisma 사용하려면 필요)

따라서 둘 다 필요합니다, 역할이 다르기 때문입니다!

  • /prisma  Prisma Client와 DB 연동 준비
  • src/prisma  NestJS 앱에서 Prisma Client 사용하도록 래핑

 

 

 

 

지금의 구조는 잘 구성된 NestJS + Prisma 프로젝트의 전형적인 구조입니다:

📁 /prisma (루트)

  • Prisma 관련 설정과 마이그레이션, 시드 데이터 관리
  • 포함된 파일/폴더:
    • schema.prisma: Prisma 스키마 정의
    • migrations/: Prisma 마이그레이션 기록
    • seed/: 더미 데이터 시드용 코드 (seed.ts, data.ts)
  • 🧠 이 부분은 Prisma CLI 전용 영역으로 보면 됩니다.
    • npx prisma generate, npx prisma migrate, npx prisma db seed 등에 사용됨

📁 /src/prisma (NestJS 내부)

  • NestJS에서 Prisma Client를 DI(의존성 주입) 하기 위한 코드
  • 포함된 파일:
    • prisma.service.ts: PrismaClient 인스턴스를 래핑한 서비스
    • prisma.module.ts: 해당 서비스를 모듈로 등록
// 예: prisma.service.ts
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy { ... }

 

🧠 NestJS가 Prisma를 쓸 수 있도록 해주는 브릿지 역할입니다.

 

정리: 이 구조 그대로 유지하세요!

폴더 경로                                                      역할유지                                                                                                필요

 

/prisma Prisma 설정, 마이그레이션, 시드 관리 ✅ 필요
/src/prisma NestJS에서 Prisma 의존성 주입 관리 ✅ 필요

🙋🏻‍♂️ 추가 팁

  • NestJS에서 시드를 실행하고 싶으면 /prisma/seed/seed.ts를 CLI 명령과 연결하면 됩니다:
// package.json
"prisma": {
  "seed": "ts-node prisma/seed/seed.ts"
}

 

  • 그리고 npx prisma db seed로 실행하면 Nest 없이도 시드 데이터 주입 가능해요.
npx prisma db seed

 

 

 

 

NestJS에서 직접 시드 실행하거나 마이그레이션 제어하는 방법도 알려주세요. 시드 실행 방식, 마이그레이션 관리, 환경별 Prisma 설정 등...

 

1. NestJS에서 Prisma 시드 실행

🔹 기본 방식 (Prisma CLI 이용)

  1. prisma/seed/seed.ts 파일 작성
    이미 갖고 계신 것처럼, 이 파일에서 더미 데이터를 PrismaClient를 이용해 주입합니다:
// prisma/seed/seed.ts
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();

async function main() {
  await prisma.user.create({
    data: {
      email: 'test@example.com',
      name: 'Test User',
    },
  });
}

main()
  .catch((e) => {
    console.error(e);
    process.exit(1);
  })
  .finally(() => prisma.$disconnect());

 

2.package.json에 시드 스크립트 등록:

"prisma": {
  "seed": "ts-node prisma/seed/seed.ts"
}

 

3.실행:

npx prisma db seed

 

⚠️ ts-node가 설치되어 있어야 합니다:

npm install -D ts-node

 

2. 마이그레이션 관리

🔹 마이그레이션 생성

npx prisma migrate dev --name init

 

  • 개발환경에서 schema.prisma 변경사항을 기반으로 마이그레이션 생성 + 실행
  • prisma/migrations 폴더에 기록됨

🔹 마이그레이션 적용 (운영 서버에서)

npx prisma migrate deploy

 

이미 만들어진 마이그레이션을 운영 환경에서 실행만 

 

3. NestJS에서 프로그램적으로 시드 실행 (선택적)

NestJS 앱 코드에서 시드를 자동 실행하고 싶다면:

// main.ts 또는 별도 스크립트에서
import { PrismaService } from './src/prisma/prisma.service';
import { seed } from './prisma/seed/seed';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const prismaService = app.get(PrismaService);
  await prismaService.enableShutdownHooks();
  
  await seed(prismaService); // 시드 실행

  await app.listen(3000);
}

 

4. 환경별 설정 (개발 / 운영 / 테스트 등)

🔹 .env 파일 구분

  • .env.development, .env.production, .env.test 등을 나눠서 관리

🔹 schema.prisma에서 env로 DB 연결

prisma

// prisma/schema.prisma
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

 

🔹 NestJS에서 환경 적용 (@nestjs/config 활용)

 

// app.module.ts
ConfigModule.forRoot({
  isGlobal: true,
  envFilePath: `.env.${process.env.NODE_ENV}` || '.env',
});

 

실행 시:

NODE_ENV=development npx prisma migrate dev
NODE_ENV=production node dist/main.js

 

추가 팁: CI/CD에서 Prisma 적용

# 설치
npm install prisma --save-dev

# CI/CD 스크립트 예시
npx prisma generate
npx prisma migrate deploy

 

요약표

항목.                                           명령 / 코드                                                                           설명

 

시드 실행 npx prisma db seed CLI로 시드 실행
마이그레이션 생성 npx prisma migrate dev --name name 개발환경에서 마이그레이션 생성
마이그레이션 실행 npx prisma migrate deploy 운영환경에서 실행만
환경 설정 .env.{env} + env("...") + ConfigModule 다양한 환경 분리 가능
Nest에서 직접 시드 await seed(prisma) 앱 코드에서 시드 실행 가능