티스토리 뷰
📌 NestJS + Prisma + Next.js로 만드는 웹 애플리케이션 첫걸음 - 애자일 쇼핑몰 프로젝트 - Prisma ORM을 활용한 데이터 모델링
octo54 2025. 3. 12. 11:40📌 NestJS + Prisma + Next.js로 만드는 웹 애플리케이션 첫걸음 - 애자일 쇼핑몰 프로젝트 - Prisma ORM을 활용한 데이터 모델링
1. Prisma란?
Prisma는 TypeScript 기반의 ORM(Object-Relational Mapping) 라이브러리로, SQL 데이터베이스를 간편하게 관리할 수 있도록 도와줍니다.
NestJS와 Prisma를 함께 사용하면 데이터베이스 모델링, 마이그레이션, 쿼리 실행이 직관적이고 효율적으로 이루어집니다.
✅ Prisma의 주요 특징
- TypeScript 지원 (자동 타입 생성)
- 직관적인 데이터베이스 모델링 가능
- 마이그레이션 기능 제공 (데이터베이스 변경 사항 관리)
- PostgreSQL, MySQL, SQLite, MongoDB 등 다양한 데이터베이스 지원
💡 이 프로젝트에서는 Prisma + PostgreSQL을 사용하여 쇼핑몰의 데이터를 관리합니다.
2. Prisma 설치 및 초기 설정
2.1. Prisma 패키지 설치
먼저, 프로젝트에 Prisma를 추가합니다.
npm install @prisma/client
npm install --save-dev prisma
2.2. Prisma 초기 설정
npx prisma init
이 명령어를 실행하면 prisma/ 폴더가 생성되고, .env 파일이 추가됩니다.
💡 .env 파일에서 데이터베이스 연결 설정 (PostgreSQL 사용)
DATABASE_URL="postgresql://user:password@localhost:5432/shoppingmall"
3. 쇼핑몰 데이터 모델링 (Prisma Schema 작성)
3.1. 기본 데이터 모델 정의
💡 Prisma의 schema.prisma 파일을 수정하여 데이터 모델을 정의합니다.
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
name String
email String @unique
password String
role String @default("customer") // customer, admin
orders Order[]
}
model Product {
id Int @id @default(autoincrement())
name String
description String
price Int
stock Int
orders Order[]
}
model Order {
id Int @id @default(autoincrement())
userId Int
user User @relation(fields: [userId], references: [id])
productId Int
product Product @relation(fields: [productId], references: [id])
quantity Int
total Int
createdAt DateTime @default(now())
}
✅ 설명:
- User 모델: 사용자 정보 저장 (일반 사용자 & 관리자 구분)
- Product 모델: 상품 정보 저장 (이름, 가격, 재고 포함)
- Order 모델: 주문 정보 저장 (사용자, 상품, 수량, 총 금액)
- 각 모델은 관계(Relation)를 설정하여 연결됨 (@relation 사용)
4. Prisma 마이그레이션 적용
4.1. 데이터베이스 스키마 적용 (마이그레이션 실행)
Prisma에서 정의한 모델을 데이터베이스에 반영하려면 다음 명령어를 실행합니다.
npx prisma migrate dev --name init
이 명령어를 실행하면, PostgreSQL에 User, Product, Order 테이블이 자동으로 생성됩니다.
4.2. Prisma Studio를 활용한 데이터 확인
Prisma는 GUI 기반의 데이터 관리 툴인 Prisma Studio를 제공합니다.
npx prisma studio
이 명령어를 실행하면 웹 브라우저에서 데이터베이스의 데이터를 쉽게 조회하고 수정할 수 있습니다.
5. NestJS에서 Prisma 사용하기
5.1. Prisma Client 생성
NestJS에서 Prisma를 사용하려면 Prisma Client를 생성해야 합니다.
npx prisma generate
이제 @prisma/client를 이용하여 데이터베이스와 상호작용할 수 있습니다.
5.2. Prisma를 활용한 서비스 구현
💡 사용자(User) 서비스 예제
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class UsersService {
constructor(private prisma: PrismaService) {}
async getAllUsers() {
return this.prisma.user.findMany();
}
async createUser(data: { name: string; email: string; password: string }) {
return this.prisma.user.create({ data });
}
}
💡 상품(Product) 서비스 예제
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class ProductsService {
constructor(private prisma: PrismaService) {}
async getAllProducts() {
return this.prisma.product.findMany();
}
async createProduct(data: { name: string; description: string; price: number }) {
return this.prisma.product.create({ data });
}
}
6. Prisma를 활용한 CRUD 예제
6.1. 사용자(User) CRUD 예제
✅ 사용자 생성 (Create)
const newUser = await prisma.user.create({
data: {
name: 'John Doe',
email: 'john@example.com',
password: 'hashedpassword',
},
});
✅ 모든 사용자 조회 (Read)
const users = await prisma.user.findMany();
✅ 사용자 정보 업데이트 (Update)
const updatedUser = await prisma.user.update({
where: { id: 1 },
data: { name: 'Updated Name' },
});
✅ 사용자 삭제 (Delete)
await prisma.user.delete({
where: { id: 1 },
});
💡 위와 같은 Prisma Client API를 활용하면 데이터베이스 연산을 쉽게 수행할 수 있습니다.
7. Prisma와 NestJS를 함께 사용할 때의 장점
✅ TypeScript 기반 ORM으로 안정적인 개발 가능
✅ 데이터베이스 마이그레이션이 간편
✅ 자동 생성된 타입을 활용하여 안전한 데이터 처리 가능
✅ PostgreSQL, MySQL, MongoDB 등 다양한 데이터베이스 지원
✅ Prisma Studio를 활용한 편리한 데이터 관리
🎯 마무리하며
이번 챕터에서는 Prisma ORM을 활용하여 데이터 모델링을 수행하고, NestJS에서 데이터베이스와 연동하는 방법을 다뤘습니다.
다음 단계에서는 3.3. 코드별 데이터 타입 설정을 다룰 예정입니다. 🚀
'project > NestJS + Prisma로 만드는 웹 애플리케이션 첫걸음 - 쇼핑몰' 카테고리의 다른 글
- Total
- Today
- Yesterday
- 스마트 컨트랙트
- Webpack
- Ktor
- fastapi
- AI챗봇
- llm
- App Router
- 개발블로그
- 웹개발
- nodejs
- rag
- Prisma
- PostgreSQL
- SEO 최적화
- 프론트엔드
- LangChain
- CI/CD
- nextJS
- Docker
- 관리자
- NestJS
- Next.js
- gatsbyjs
- github
- 백엔드개발
- kotlin
- REACT
- SEO최적화
- AI 자동화
- seo 최적화 10개
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |