티스토리 뷰

반응형

📌 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. 코드별 데이터 타입 설정을 다룰 예정입니다. 🚀

 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함
반응형