728x90

1. 💡 Prisma Client란 무엇인가요?
Prisma Client는 NestJS를 비롯한 TypeScript/Node.js 애플리케이션에서 데이터베이스와 상호작용하기 위해 사용하는 자동 생성된(auto-generated) 타입 안전한 쿼리 빌더입니다.
이 클라이언트는 이전에 설계한 schema.prisma 파일의 모델 구조(예: User, Post)를 기반으로 생성됩니다.
Prisma Client의 주요 특징
- 타입 안전성: Prisma Client의 모든 메서드와 반환 타입은 schema.prisma에 정의된 모델을 기반으로 생성됩니다. 따라서 쿼리를 작성할 때 오타나 잘못된 필드 사용을 컴파일 시점에 잡아낼 수 있어 TypeScript 환경에서 최고의 개발 경험을 제공합니다.
- 직관적인 API: 데이터베이스 작업(CRUD)이 매우 직관적인 메서드(예: prisma.user.findMany(), prisma.post.create())로 제공됩니다.
- 자동 완성 지원: TypeScript의 타입 추론 덕분에, IDE에서 쿼리를 작성할 때 강력한 자동 완성 기능(IntelliSense)을 지원합니다.
728x90
2. 🛠️ Prisma Client 생성 명령어
schema.prisma 파일을 설계하거나 변경할 때마다, NestJS 코드에서 사용할 수 있도록 Prisma Client를 다시 생성해야 합니다.
npx prisma generate
명령어의 역할
- node_modules/.prisma/client 경로에 Prisma Client 라이브러리 파일을 생성합니다.
- 이 생성된 파일에는 schema.prisma에 정의된 모든 모델에 대한 TypeScript 타입 정의가 포함됩니다.
- (npx prisma migrate dev 명령을 사용하면 마이그레이션과 함께 Client 생성이 자동으로 포함되어 실행됩니다.)
3. NestJS에서 Prisma Client 사용을 위한 통합 (Prisma Service)
Prisma Client는 데이터베이스 연결을 관리하는 객체이므로, NestJS의 의존성 주입(DI) 시스템을 통해 애플리케이션 전체에서 재사용 가능한 PrismaService로 래핑하여 사용하는 것이 일반적인 베스트 프랙티스입니다.
3.1. PrismaService 생성
Nest CLI를 사용하여 서비스 파일을 생성합니다.
nest generate service prisma
3.2. PrismaService 구현
@Injectable()로 정의된 PrismaService는 onModuleInit 라이프사이클 훅을 사용하여 애플리케이션 시작 시 데이터베이스에 연결하고, OnModuleDestroy 훅을 사용하여 종료 시 연결을 끊습니다.
// src/prisma/prisma.service.ts
import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
import { PrismaClient } from '@prisma/client'; // 💡 자동 생성된 클라이언트 가져오기
@Injectable()
export class PrismaService extends PrismaClient
implements OnModuleInit, OnModuleDestroy
{
// 생성자에서 PrismaClient를 상속받아 사용
constructor() {
super({
// 💡 개발 환경 로깅 설정 (선택 사항)
log: ['query', 'info', 'warn', 'error'],
});
}
// 💡 NestJS 모듈이 초기화될 때 DB 연결
async onModuleInit() {
await this.$connect();
}
// 💡 NestJS 애플리케이션이 종료될 때 DB 연결 해제
async onModuleDestroy() {
await this.$disconnect();
}
}
728x90
3.3. DI를 통한 사용
이제 UsersService와 같은 비즈니스 로직을 담당하는 서비스에서 PrismaService를 주입(Inject)받아 타입 안전하게 데이터베이스 쿼리를 실행할 수 있습니다.
// src/users/users.service.ts
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import { User } from '@prisma/client'; // 💡 Prisma가 생성한 User 타입 사용
@Injectable()
export class UsersService {
// 💡 생성자 주입을 통해 PrismaService 인스턴스를 받습니다.
constructor(private prisma: PrismaService) {}
async findAllUsers(): Promise<User[]> {
// 💡 prisma.user.findMany()는 타입 안전성을 보장합니다.
return this.prisma.user.findMany();
}
}
이러한 통합 과정을 통해 NestJS는 Prisma의 강력한 타입 시스템을 활용하여 안정적이고 유지보수하기 쉬운 데이터베이스 접근 계층을 구축하게 됩니다.
728x90
'Nest.js를 배워보자 > 4. NestJS에서 데이터베이스 연결하기 — Prisma 기반 실습' 카테고리의 다른 글
| NestJS + Prisma: 트랜잭션과 관계(Relation) (0) | 2025.12.02 |
|---|---|
| NestJS + Prisma: CRUD 예제 (Service 구현) (0) | 2025.12.02 |
| Prisma 스키마 설계 (0) | 2025.12.02 |
| Prisma 설치: NestJS 데이터베이스 연동의 시작 (1) | 2025.12.02 |