[Nest js] basic - DTO

giyeon·2022년 3월 12일
1

nest js - basic

목록 보기
5/8

이 포스팅은 Youtube 'John Ahn'의 '따라하면서 배우는 NestJS'를 참고했습니다.

⚙️ DTO?

DTO (Data Transfer Object)란 계층간 데이터 교환을 위한 객체를 말해요.
예시로 데이터베이스에서 데이터를 얻어 Service나 Controller 등으로 보낼 때 사용하는 객체를 말합니다.

달리말하면, DTO는 데이터가 네트워크를 통해 전송되는 방법을 정의하는 객체이며 nest js에서 interface나 class를 이용해서 정의합니다.
(NextJs는 class로 정의하는 것을 추천해요.)

DTO는 왜 쓰나요 ?

  1. 데이터 유효성을 체크하는 데 효율적입니다.
  2. 더 안정적인 코드로 만들어 줍니다.
    (typescript의 type으로도 사용돼요.)

더 쉽게 예를 하나 들어볼게요
이전 포스팅에서 board라는 게시물을 하나 생성하려면 클라이언트는 title과 description을 body에 담아 server로 보내주게 돼요.
server는 이 값을 활용해서 board를 생성합니다.

클라이언트에서 보내준 title과 decription 같은 것을 Property 라고 해요.

예시에서는 title과 description 두 가지 Property만 넘겨주고 board를 새로 생성했지만, board를 생성하기 위해 100가지 Property를 받아야 한다고 가정해볼게요.

이 Property들을 controller에 받아서 service에 넘겨주고, service는 이 Property를 이용해서 요청을 처리하게 되는데

여기서 갑자기 변경사항이 생긴다면..

수정해줘야 할 부분들이 아주 많을 거에요.

한곳에서 Property 이름을 바꿔줘야한다면 다른 곳에서 똑같이 쓰인 모든 곳의 Property도 똑같이 바꿔줘야하는 노가다를 해야하는 경우가 생겨요.

이렇게 된다면 유지보수하기 정말 힘들어질 수가 있어요.
이런 경우를 대비해서 DTO로 쉽게 관리할 수 있습니다.


📕 DTO 사용법

가장먼저 해당하는 폴더에 dto 라는 폴더를 하나 만들어줘요.
아래 예시는 board 라는 게시물을 생성할 때 필요한 dto 파일입니다.

파일 생성 후 class를 정의해줘요.
board를 생성할 때 client에서 title과 description값을 받아 생성하도록 아래처럼 정의 했습니다.

create-board.dto.ts

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

이제 생성한 dto를 controller와 service에서 사용해야 합니다.
먼저 controller부분을 볼게요.

boards.controller.ts

import { CreateBoardDto } from './dto/create-board.dto';
...

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

Post요청이 들어오면 controller는 클라이언트가 보내준 Body값을 찾아 service로 보내주게 되는데, 정의한 dto 형식대로 보내주게 돼요.

다음은 service 부분이에요.

boards.controller.ts

import { CreateBoardDto } from './dto/create-board.dto';
...

  createBoard(createBoardDto: CreateBoardDto): Board {
    const { title, desc } = createBoardDto;

    const board: Board = {
      id: uuid,
      title,
      desc,
      status: BoardStatus.PUBLIC,
    };
    this.boards.push(board);
    return board;
  }
...

controller에서 보내준 Body값을 dto 형식으로 꺼내오게 됩니다.

profile
Web , App developer 🧑🏻‍💻

0개의 댓글