[nest.js] DTO 만들기

개발정리·2022년 5월 17일
1
post-thumbnail

intro

저도 nest.js를 배우고있는 단계입니다.
이 글을 통해서 지식을 습득하려고하지마시고
이사람은 이렇게 했구나 정도로만 생각해주시면
감사하겠습니다.

$ nest new laern-nest
$ nset g res //crud로 만들었습니다

DTO만들기

crud.createDTO.ts

import { IsNumber, IsOptional, IsString } from 'class-validator';

export class CreateCrudDto {
  @IsString()
  Writer: string;

  @IsString()
  title: string;

  @IsString()
  dsec: string;

  @IsString()
  password: string;

  @IsOptional()
  id: number;
}

controller에서 이렇게 받습니다.

@Post()
  create(@Body() createCrudDto: CreateCrudDto) {
    return this.crudService.create(createCrudDto);
  }

DTO를 만들어야하는이유

dto는 Data Transfer Object의 약자로 데이터를 우리가 사용할수있게 오브젝트로 바꿔주는겁니다.
어떤 값이 들어와야하고 그 값은 어떤 타입이어야하는지요
하지만 이것보다 중요한게 DTO를 사용함으로써 우리를 더 안전하게해줍니다

DTO를 사용해서 안전하게만들어주기

npm i -S class-transformer class-validator

지금 설치하는걸 pipe라고 합니다.

pipe란

express로 치면 미들웨어라고 생각하시면됩니다.

app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true,
    }),
  );

main.ts에 추가해줍니다.

  • whilelist : DTO에 없는 값은 거르고 에러메세지 출력

  • forbidNonWhitleist : DTO에 존재하지않는 값이 들어오면 에러메세지출력

  • transform: 넘어오는값은 무조건 String이라 하나하나 원하는 타입으로 바꿔줘야하는데 이런 불편함을 없애줌

transform true로 해줌으로써

@Get(':id')
  findOne(@Param('id') id: number) {
    return this.crudService.findOne(id);
  }

이런식으로 사용할수있게되었습니다.

entity

어디선 entity 어디선 model이라고하는데

DTO가 우리가 쓸수있게 변환하고 타입을 부여하는거라면 이것은 스키마처럼

어떤 data를 넣을지 따로 명시하는거같습니다. typeorm을 쓰는 강의를 보면

entity라고 하지만 이렇게 메모리에 대충 저장할때는 model이라고 하더라구요

export class Crud {
  Writer: string;
  title: string;
  dsec: string;
  password: string;
  id: number;
}

service

이제 모든걸 추가해줍니다.

import { Injectable, NotFoundException } from '@nestjs/common';
import { CreateCrudDto } from './dto/create-crud.dto';
import { UpdateCrudDto } from './dto/update-crud.dto';
import { Crud } from './entities/crud.entity';

@Injectable()
export class CrudService {
  private db: Crud[] = [
    {
      Writer: 'Egoing',
      title: 'nestjs is....',
      dsec: 'nestjs is regarding express',
      password: '1234',
      id: 0,
    },
    {
      Writer: 'Hello',
      title: 'hehe',
      dsec: 'nestasdfasdfjs is regarding express',
      password: '1234',
      id: 1,
    },
  ];

  FindIndex(id: number): number {
    return this.db.findIndex((post) => post.id == id);
  }
  create(body: CreateCrudDto): void {
    this.db.push({
      ...body,
      id: this.db.length,
    });
  }

  findAll(): Crud[] {
    return this.db;
  }

  findOne(id: number): Crud {
    const post = this.db.find((post) => post.id == id);
    if (!post) throw new NotFoundException(`post with ID ${id} not found`);
    return post;
  }

  update(id: number, updateCrudDto: UpdateCrudDto) {
    const beforeEdit = this.findOne(id);
    if (!beforeEdit)
      throw new NotFoundException(
        `cant Edit post because post with ID : ${id} not found`,
      );
    this.db[this.FindIndex(id)] = { ...beforeEdit, ...updateCrudDto };
  }

  remove(id: number) {
    const idx: number = this.FindIndex(id);
    if (idx == -1)
      throw new NotFoundException(
        `cant remove post because post with ID : ${id} not found`,
      );
    this.db.splice(idx, 1);
  }
}

controller

import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
} from '@nestjs/common';
import { CrudService } from './crud.service';
import { CreateCrudDto } from './dto/create-crud.dto';
import { UpdateCrudDto } from './dto/update-crud.dto';

@Controller('crud')
export class CrudController {
  constructor(private readonly crudService: CrudService) {}

  @Post()
  create(@Body() createCrudDto: CreateCrudDto) {
    console.log(createCrudDto);
    return this.crudService.create(createCrudDto);
  }

  @Get()
  findAll() {
    return this.crudService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: number) {
    return this.crudService.findOne(id);
  }

  @Patch(':id')
  update(@Param('id') id: number, @Body() updateCrudDto: UpdateCrudDto) {
    return this.crudService.update(id, updateCrudDto);
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.crudService.remove(+id);
  }
}

이렇게 대충 만들어주고

postman이나 curl로 테스트해보면 우리가 원하는 값만 들어옵니다.
무슨짓을해도 용서하지않습니다.
express에선 스키마 말고 이렇게
요청할떄부터 막는 이런걸 해본적이없는데 nestjs에선
시작할때부터 배우네요 정말 신기합니다

profile
배운거 정리해요

0개의 댓글