project/NestJS + Prisma로 만드는 웹 애플리케이션 첫걸음 - 쇼핑몰

📌 NestJS + Prisma + Next.js로 만드는 웹 애플리케이션 첫걸음 - 애자일 쇼핑몰 프로젝트 - 코드별 데이터 타입 설정

octo54 2025. 3. 12. 12:01
반응형

 

1. 데이터 타입 설정이 중요한 이유

백엔드에서 데이터 타입을 명확하게 설정하면 데이터의 무결성을 보장하고, 코드의 안정성을 향상할 수 있습니다.
NestJS + Prisma를 사용할 때, TypeScript의 강력한 타입 시스템을 활용하여 각 데이터 모델의 타입을 명확하게 정의하는 것이 중요합니다.

정확한 데이터 타입 설정의 이점

  • 데이터베이스 스키마와 코드 간 일관성 유지
  • 불필요한 런타임 에러 방지
  • 자동 완성 및 코드 가독성 향상

💡 이 챕터에서는 Prisma, TypeScript, DTO(Data Transfer Object)를 활용하여 데이터 타입을 올바르게 설정하는 방법을 다룹니다.


2. Prisma에서 데이터 타입 정의

반응형

2.1. Prisma의 기본 데이터 타입

Prisma에서는 다음과 같은 기본 데이터 타입을 제공합니다.

Prisma 타입 설명 예제

String 문자열 "example text"
Int 정수형 숫자 123
Float 소수점 숫자 123.45
Boolean 참/거짓 값 true / false
DateTime 날짜 및 시간 "2024-03-07T12:00:00Z"
Json JSON 데이터 {"key": "value"}

2.2. 쇼핑몰 프로젝트의 Prisma 데이터 타입 설정

💡 Prisma의 schema.prisma에서 각 모델의 데이터 타입을 정의합니다.

model User {
  id        Int     @id @default(autoincrement())
  name      String
  email     String  @unique
  password  String
  role      String  @default("customer") // "customer", "admin"
  createdAt DateTime @default(now())
}

model Product {
  id          Int     @id @default(autoincrement())
  name        String
  description String
  price       Int
  stock       Int
  createdAt   DateTime @default(now())
}

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())
}

여기서 각 필드의 데이터 타입을 명확하게 지정하여, NestJS의 서비스 및 DTO에서도 일관된 타입을 유지할 수 있습니다.


3. NestJS에서 DTO(Data Transfer Object) 활용

3.1. DTO란?

DTO(Data Transfer Object)는 API에서 데이터를 주고받을 때 사용하는 객체로, 데이터 유효성을 검증하는 데 사용됩니다.
NestJS에서는 클래스를 활용한 DTO 정의를 권장합니다.


3.2. 사용자(User) 관련 DTO 정의

💡 NestJS에서 CreateUserDto 및 UpdateUserDto를 정의하여 데이터 유효성을 검증합니다.

import { IsString, IsEmail, MinLength } from 'class-validator';

export class CreateUserDto {
  @IsString()
  name: string;

  @IsEmail()
  email: string;

  @MinLength(6)
  password: string;
}

DTO 활용의 장점:

  • 사용자가 올바른 형식의 데이터를 입력했는지 확인 가능
  • 잘못된 데이터 입력을 방지하여 보안 강화
  • API의 일관성을 유지

3.3. 상품(Product) 관련 DTO 정의

import { IsString, IsInt, Min, Max } from 'class-validator';

export class CreateProductDto {
  @IsString()
  name: string;

  @IsString()
  description: string;

  @IsInt()
  @Min(0)
  price: number;

  @IsInt()
  @Min(0)
  stock: number;
}

상품 등록 시 가격(price)과 재고(stock)이 음수가 되지 않도록 검증할 수 있습니다.


4. Prisma & NestJS에서 자동 생성된 타입 활용하기

Prisma는 prisma generate 명령어를 실행하면 자동으로 TypeScript 타입을 생성합니다.

npx prisma generate

💡 이제 Prisma에서 자동 생성된 타입을 서비스 로직에서 활용할 수 있습니다.

import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import { User } from '@prisma/client';

@Injectable()
export class UsersService {
  constructor(private prisma: PrismaService) {}

  async getAllUsers(): Promise<User[]> {
    return this.prisma.user.findMany();
  }
}

자동 생성된 타입(User)을 사용하면, 타입 안정성이 보장되고 코드의 가독성이 높아집니다.


5. 데이터 타입 적용 후 API 요청 및 응답 예제

5.1. 사용자(User) 생성 요청 (DTO 적용)

💡 DTO를 활용하여 POST /users API에서 유효한 데이터를 받도록 설정합니다.

@Post()
createUser(@Body() createUserDto: CreateUserDto) {
  return this.usersService.createUser(createUserDto);
}

5.2. API 요청 예제 (Postman 또는 cURL 활용)

올바른 요청 예제:

POST /users
{
  "name": "John Doe",
  "email": "john@example.com",
  "password": "securepassword"
}

잘못된 요청 예제 (비밀번호가 너무 짧음):

POST /users
{
  "name": "John Doe",
  "email": "john@example.com",
  "password": "123"
}

응답:

{
  "statusCode": 400,
  "message": ["password must be longer than 6 characters"],
  "error": "Bad Request"
}

💡 DTO와 클래스 유효성 검사를 활용하면, API 요청을 보다 안전하게 관리할 수 있습니다.


6. 데이터 타입 설정 시 고려할 사항

유효성 검사 강화: class-validator를 활용하여 데이터 입력값 검증
Prisma 타입 활용: prisma generate를 통해 자동 생성된 타입을 활용
DTO 사용: 데이터 전송 객체를 정의하여 API의 일관성을 유지
데이터베이스 스키마와 일치하도록 타입 정의


🎯 마무리하며

이번 챕터에서는 NestJS + Prisma 환경에서 데이터 타입을 설정하는 방법을 살펴보았습니다.
다음 단계에서는 3.4. 인증 및 보안을 다루겠습니다. 🚀