nestJS 설치는 이전 게시물을 참고.
Prisma 기본 설정
prisma 설치
npm install prisma --save-dev
npx prisma init
- prisma를 install하고 init하면 폴더에 /prisma/schema.prisma가 생성된다.
schema.prisma 파일 수정
// schema.prisma
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
- mysql을 사용할 것이기 때문에 schema.prisma 파일에서 db를 mysql로 바꿔준다.
.env 파일 수정
# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema
# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings
DATABASE_URL="mysql://root:비밀번호@localhost:포트번호/nestjs"
- env 설정 파일에서 본인의 mysql 계정과, 비밀번호, 포트번호, DB에 만들 스키마를 작성한다.
schema.prisma 파일 스키마 정의
// scheam.prisma
...
model User {
id Int @id @default(autoincrement())
email String @unique
password String
school String?
board Board[]
coment Coment[]
}
model Board {
id Int @id @default(autoincrement())
title String
content String @db.Text
createAt DateTime @default(now()) @map("create_at")
updateAt DateTime? @map("updata_at")
user User @relation(fields: [userId], references: [id])
userId Int
coment Coment[]
}
model Coment {
id Int @id @default(autoincrement())
content String @db.Text
createAt DateTime @default(now()) @map("create_at")
updateAt DateTime? @map("updata_at")
user User @relation(fields: [userId], references: [id])
userId Int
board Board @relation(fields: [boardId], references: [id])
boardId Int
}
- mysql로 설정했던 scheam.prisma 파일에서 스키마를 정의한다.
- user, board, comment 테이블 총 3개를 만든다.
- DB에서는 카멜케이스 대신 _를 사용해야 하기 때문에 @map을 통해 _로 정의한다.
쿼리에 대한 정보는 prisma docs model 를 참고.
prisma db 연결
npx prisma db push
- 스키마를 정의하였으니 db에 push한다.
- nestjs 데이터베이스에 board, comment, user 테이블이 생성되었다.
mvc 패턴 생성
nest g resource user
nest g resource board
nest g resource comment
- controller, service, module, dto, entites를 한번에 생성하고 CRUD에 필요한 템플릿을 만드는 resource를 이용해 패턴을 생성한다.
유효성 검사
- 데코레이터를 통해 주로 DTO 내부에 있는 프로퍼티들의 유효성을 검사하기 위해 Class vaildator를 설치한다.
npm i --save class-validator
prisma CRUD 설치
npm install @prisma/client
npx prisma generate // 생성된 prisma client 업데이트
- 데이터베이스에 대한 CRUD 작업을 수행하기 위해 Prisma Client를 설치해야 한다.
Prisma Module과 Service 생성
// /src/prisma.module.ts
import { Module } from "@nestjs/common";
import { PrismaService } from "./prisma.service";
@Module({
providers: [PrismaService],
exports: [PrismaService],
})
export class PrismaModule {}
// /src/prisma.service.ts
import { Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
async onModuleInit() {
await this.$connect();
}
}
- 데이터베이스와 효율적으로 상호작용을 하기 위해 service와 module를 생성한다.
- prisma client를 사용하여 데이터베이스에 대한 쿼리를 실행하고, 서비스 로직에 따른 데이터 처리나 데이터 유효성 검사 등의 추가적인 로직을 추가할 수 있다.
User
DTO
- DTO는 주로 서로 다른 계층 간 데이터를 전송하기 위해 사용된다.
- DTO는 데이터의 유효성을 검사하거나 변환하는 로직을 포함할 수 있다.
// /dto/create-user.dto.ts
import { IsNotEmpty, IsString, MaxLength } from "class-validator";
export class CreateUserDto {
@IsString()
@IsNotEmpty()
email: string;
@IsString()
@IsNotEmpty()
@MaxLength(12)
password: string;
@IsString()
school: string;
}
// /dto/update-user.dto.ts
import { PartialType } from '@nestjs/mapped-types';
import { CreateUserDto } from './create-user.dto';
import { IsNotEmpty, IsNumber, IsString } from 'class-validator';
export class UpdateUserDto extends PartialType(CreateUserDto) {
@IsNumber()
@IsNotEmpty()
id: number;
@IsString()
@IsNotEmpty()
email: string;
}
- dto는 생성할 때 이용할 create와, 업데이트 할 때 이용할 update로 나누어져 있다.
- IsNumber, IsString은 각각 숫자와 문자만 받는다는 의미이다.
- IsNotEmpty는 빈 값, 즉 null이 들어갈 수 없고, MaxLength는 최대 길이를 지정한다.
repository
import { Injectable } from "@nestjs/common";
import { CreateUserDto } from "../dto/create-user.dto";
import { PrismaService } from "src/prisma.service";
import { UpdateUserDto } from "../dto/update-user.dto";
@Injectable()
export class UserRepository{
constructor(private prisma: PrismaService) {}
async create(createUserDto: CreateUserDto) {
const { email, password, school } = createUserDto;
return await this.prisma.user.create({
data: {
email,
password,
school,
},
});
}
async findEmail(email: string) {
return await this.prisma.user.findUnique({
where: {
email,
},
});
}
async findOne(id: number) {
return await this.prisma.user.findUnique({
where: {
id,
},
});
}
async update(updateUserDto: UpdateUserDto) {
const { id, email } = updateUserDto;
return await this.prisma.user.update({
where: {
id,
},
data: {
email,
},
});
}
}
- 데이터베이스와 상호작용을 담당한다.
- prisma 생성자를 통해 데이터베이스에서 데이터를 생성하거나, 조회하거나 업데이트, 삭제한다.
- create함수는 데이터를 생성 findUnique함수 특정 조건을 만족하는 하나의 레코드를 검색, update는 데이터를 업데이트 한다.
service
import { HttpException, Injectable } from '@nestjs/common';
import { UserRepository } from './repository/user.repository';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
@Injectable()
export class UserService {
constructor(private userRepositroy: UserRepository) {}
async create(createUserDto: CreateUserDto) {
const emailFound = await this.userRepositroy.findEmail(createUserDto.email);
if(emailFound) throw new HttpException(`${createUserDto.email}`, 400);
else return await this.userRepositroy.create(createUserDto);
}
async findOne(id: number) {
const found = await this.userRepositroy.findOne(id);
if(!found) throw new HttpException(`${id}`, 400);
const { id: userId, password, ...result } = found;
return found;
}
async update(updateUserDto: UpdateUserDto) {
const idFound = await this.userRepositroy.findOne(updateUserDto.id);
if(!idFound) throw new HttpException(`${updateUserDto.id}`, 400);
const emailFound = await this.userRepositroy.findEmail(updateUserDto.email);
if(!emailFound) throw new HttpException(`${updateUserDto.email}`, 400);
return await this.userRepositroy.update(updateUserDto);
}
}
- repository 생성자를 통해 데이터베이스의 데이터에 대한 유효성, 연산, 변환을 처리한다.
- 서비스는 repositroy가 데이터베이스에 접근하면 그 데이터를 가져와 가공한다.
- HttpException을 통해 status 코드를 관리한다.
controller
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) {}
@Post()
create(@Body() createUserDto: CreateUserDto) {
return this.userService.create(createUserDto);
}
@Post("get")
findOne(@Body() id: string) {
return this.userService.findOne(+id);
}
@Post("update")
update(@Body() updateUserDto: UpdateUserDto) {
return this.userService.update(updateUserDto);
}
}
- service 생성자를 통해 service에서 가공한 데이터를 처리한다.
- 라우팅 기능과 요청, 응답 기능을 한다.
728x90
반응형
'Programming > Nest' 카테고리의 다른 글
[NestJS] #1 미니프로젝트 쇼핑몰 개발 (초기 설정, Prisma 및 github 연결) (0) | 2025.01.14 |
---|---|
[NestJS] NestJS와 Prisma (1) | 2024.12.20 |
NestJS 설치 및 기본 구성 (0) | 2024.06.22 |