NestJS

DTO(Data Transfer Object)

dev-byul 2022. 3. 17. 05:47

DTO (Data Transfer Object) ?

  • 계층 간 데이터 교환을 위한 객체입니다.
  • DB에서 데이터를 얻어 Service나 Controller 등으로 보낼 때 사용하는 객체를 말합니다.
  • 데이터가 네트워크를 통해 전송되는 방법을 정의하는 객체입니다.
  • DTO는 하나의 디자인 패턴으로 데이터를 포맷(형식)화 하여 계층 간에 전송됩니다.
    • 만약 A 계층과 B계층이 데이터를 주고받는데, JSON 형식으로 만든 type C가 있다면, C는 DTO가 됩니다.

DTO를 사용하는 이유

  • 데이터 유효성을 체크하는데 효율적입니다.
  • 더 안정적인 코드로 만들어 줍니다.
    • 타입스크립트의 타입으로도 사용됩니다.
  • Service에 작성한 로직 중 하나의 프로퍼티를 제거하게 될 경우 이 Service를 사용하고 있는 Controller들의 프로퍼티를 제거해야 합니다. 이럴 경우 실수로 삭제하지 못한 프로퍼티가 있으면 에러가 발생합니다. 이를 방지하기 위해 DTO 객체를 만들어 사용할 경우 DTO 내에서만 변경을 하면 되기 때문에 사이드 이펙트를 줄일 수 있습니다.
    • 이 부분은 글만 봐서는 이해가 잘 안 될 수 있습니다. DTO를 생성 후 실습을 통해 확인하면 보다 이해하기 쉽습니다.

게시물 생성을 위한 DTO 생성하기

DTO 파일 생성

DTO 파일 작성

  • 클래스는 인터페이스와 다르게 런타임에서 작동하기 때문에 파이프 같은 기능을 이용할 때 더 유용합니다.
  • 그래서 클래스를 사용해서 DTO를 작성합니다.

./boards/dto/create-board.dto.ts

export class CreateBoardDto {
  title: string;
  description: string;
}
  • 파라미터로 받을 데이터인 title과 description을 DTO로 만들어 줍니다.

DTO 적용하기

./boards/boards.controller.ts

@Post()
createBoard(@Body() createBoardDto: CreateBoardDto): Board {
  return this.boardsService.createBoard(createBoardDto);
}
  • 주석 처리 부분을 제거하고 이제 우리가 생성한 DTO 데이터 포맷 형태로 바디 값을 받겠다고 정의합니다.
  • 이후 Service 로직인 createBoard에 우리가 바디에서 입력받은 createBoardDto를 전달합니다.

  • 이때 서비스 쪽에 전달하는 아규먼트 형태가 다르기 때문에 다음과 같이 빨간 밑줄로 에러가 표시됩니다.
    • 이는 Service 측에 파라미터를 createBoardDto 형태로 전달받겠다 작성하면 에러가 해결됩니다.

./boards/boards.service.ts

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

  this.boards.push(board);
  return board;
}
  • 주석 부분을 제거하고 파라미터를 우리가 생성한 DTO 형태로 받겠다고 정의합니다.
  • createBoardDto에 정의된 객체 속성을 구조 분해 할당으로 변수에 담습니다.

 

'NestJS' 카테고리의 다른 글

게시물 생성하기 (Controller 부분)  (0) 2022.03.17
게시물 생성하기 (Service 부분)  (0) 2022.03.17
Board Model 정의하기  (0) 2022.03.17
[실습] Board Module 로직 구현  (0) 2022.03.16
간단하게 알아보는 NestJS Service  (0) 2022.03.16