내배캠 93일차

·2023년 2월 14일
0

내일배움캠프

목록 보기
102/142
post-thumbnail

게시물 생성하기 API

service

게시물의 Id는 유니크해야함. 현재(데이터베이스를 안쓰는) 임의로 유니크한 값을 주기 위해 uuid모듈을 사용할것

npm i uuid --save

import {v1 as uuid} from "uuid";

createBoard uuid

controller

클라이언트에서 보내온 값을 핸들러에서 가져오는 방법!?

Express 에서는 bodyParser 모듈을 이용해서 req.body 이런 식으로 클라이언트에서 보내온 값을 받아왔음.
NestJS 에서는 @Body body를 이용해서 가져옴!!

  • @Body body : req 에서 보내온 모든 값을 가져옴
    @Body body

  • @Body("title") title 이런 식으로 지정해 줘야 하나씩 가져올 수 있음.
    @Body("title") title

DTO

Data Transfer Object

게층간 데이터 교환을 위한 객체

DB에서 데이터를 얻어 Service나 Controller등으로 보낼 때 사용하는 객체를 말합니다.

DTO는 데이터가 네트워크를 통해 전송되는 방법을 정의하는 객체입니다.

interface나 class를 이용해서 정의될 수 있으며, NestJS에서는 class를 이용하는 것을 추천합니다.

DTO를 쓰는 이유?

  • 데이터 유효성을 체크라는데 효율적
  • 더 안정적인 코드로 만들어줍니다. 타입스크립트의 타입으로도 사용됩니다.

많은 프로퍼티를 여러군데에서 사용하고 있는데 한 곳에서 프로퍼티의 이름을 바꿔줘야한다면 다른 곳에 똑같이 쓰인 것도 바꿔줘야합니다.
이렇게 된다면 유지보수하기 굉장히 힘들어지는데, DTO를 이용해서 문제를 해결할 수 있습니다.

DTO 생성

사용하고자하는 컨트롤러와 서비스가 있는 폴더 안에 dto폴더를 생성하고, dto파일을 생성한다.

export class CreateBoardDto {
  title: string;
  description: string;
}

그런 다음 dto를 사용할 컨트롤러와 서비스의 코드를 변경해준다.

boards.constroller.ts

@Post()
  createBoard(
    @Body('title') title: string,
    @Body('description') description: string,
  ): Board {
    return this.boardsService.createBoard(title, description);
  }

=>

@Post()
  createBoard(@Body() createBoardDto: CreateBoardDto): Board {
    return this.boardsService.createBoard(createBoardDto);
  }

boards.service.ts

createBoard(title: string, description: string) {
    const board: Board = {
      id: uuid(),
      title,
      description,
      status: BoardStatus.PUBLIC,
    };

    this.boards.push(board);
    return board;
  }

=>

createBoard(createBoardDto: CreateBoardDto) {
    // const title = createBoardDto.title;
    // const description = createBoardDto.description;
    const { title, description } = createBoardDto;
    const board: Board = {
      id: uuid(),
      title,
      description,
      status: BoardStatus.PUBLIC,
    };

    this.boards.push(board);
    return board;
  }

추가

const title = createBoardDto.title;
const description = createBoardDto.description;

const { title, description } = createBoardDto;

둘은 같은 코드!! 효율적 코드 작성 필요~! 알지만 사용을 잘 안하더라...!

게시물 상세 조회 API

service

getBoardById(id: string): Board {
    return this.boards.find((board) => board.id === id);
  }

controller

@Get('/:id')
  getBoardById(@Param('id') id: string): Board {
    return this.boardsService.getBoardById(id);
  }

지금처럼 param 하나만 들고올때는 저런식으로 사용,
만약 여러개를 사용하는데 모두 들고 오고싶을때는
@Param() params: string[] 으로 사용!!

특정 게시물 삭제 API

return할 필요가 없어서 void!

service

deleteBoardById(id: string): void {
    this.boards = this.boards.filter((board) => board.id !== id);
  }

controller

@Delete('/:id')
  deleteBoardById(@Param('id') id: string): void {
    this.boardsService.deleteBoardById(id);
  }

특정 게시물 상태 업데이트 API

service

updateBoardStatus(id: string, status: BoardStatus): Board {
    const board = this.getBoardById(id);
    board.status = status;
    return board;
  }

controller

@Put(':/id/status')
  updateBoardStatus(
    @Param('id') id: string,
    @Body('status') status: BoardStatus,
  ): Board {
    return this.boardsService.updateBoardStatus(id, status);
  }
profile
개발자 꿈나무

0개의 댓글