계층 간 데이터를 교환하는 객체인 DTO(Data Transfer Object)를 배우다.
1. DTO?
DTO는 계층 간 데이터 교환을 위한 객체이다. DB에서 데이터를 얻어 Service나 Controller 등으로 데이터를 보낼 때 사용하는 객체이다. DTO는 데이터가 네트워크를 통해 전송되는 방법을 정의하는 객체이다. interface나 class를 이용해서 정의할 수 있다. NestJS에서는 class를 사용하는 것을 추천하고 있다. class는 interface와는 다르게 런타임에서 작동하기 때문에 파이프 같은 기능을 이용할 때 더 유용하다.
2. DTO를 사용하는 이유
DTO를 사용하면 데이터 유효성을 체크하는데 효율적이고 더 안정적인 코드를 만들 수 있으며 타입스크립트의 타입으로도 사용한다. 지금 우리는 사용하는 프로퍼티가 많지 않아서 컨트롤러, 서비스 같이 여러 곳에서 사용하고 있는데, 사용하는 프로퍼티가 많아질 경우 오류가 날 수 있다. 특정 한 곳에서 프로퍼티의 이름을 바꿔야 하는 상황이 생기면 모든 곳에서 변경해 줘야하한다. 이럴 경우에 애플리케이션의 유지보수에 문제가 생기므로 DTO를 사용해서 문제를 해결해야 한다.
3. DTO 폴더, 파일 생성
일단 dto 폴더를 생성한다. 나는 게시물을 생성하는 것에 대해 만들 것이기 때문에 create-board.dto.ts 파일을 생성했다. dto 파일을 class 형식으로 작성할 것이다.
// create-board.dto.ts
export class CreateBoardDto {
title: string;
description: string;
}
이렇게 작성한 dto를 service와 controller에 적용시키면 된다.
// boards.controller.ts의 createBoard 부분
@Post()
createBoard(@Body() createBoardDto: CreateBoardDto): Board {
// 게시물 1개니까 [] 없음
return this.boardsService.createBoard(createBoardDto);
}
CreateBoardDto를 import로 불러오는 건 기본.
기존의 title과 description을 따로 가져오던 것을 지우고 1개로 createBoardDto로 가져와서 사용한다. createBoardDto에는 title과 description 2개의 프로퍼티만 있고, 그 2개만 인자로 필요로 하기 때문에 그대로 넣어도 된다.
// boards.service.ts의 createBoard 부분
createBoard(createBoardDto: CreateBoardDto) {
const { title, description } = createBoardDto;
const board: Board = {
id: uuid(),
title, // title: title 자바스크립트에서는 key와 value가 똑같으면 한 번만 적어도 됨
description,
status: BoardStatus.PUBLIC,
};
this.boards.push(board);
return board;
}
마찬가지로 서비스 파일에서도 같은 작업을 해야 완성된다. createBoard 함수는 title과 description 2개의 인자를 필요로 하기 때문에 그대로 넣어주고 기존의 title과 description은 새로운 변수 title과 description을 만들어서 createBoardDto의 title과 description값을 넣어주면 된다. 어차피 둘 다 createBoardDto 객체안에 들어있으니까 비구조화 할당으로 하면 한줄로 끝.
'Back-End > NestJS' 카테고리의 다른 글
[NestJS] Pipe란 / Pipe 적용하기 (0) | 2024.01.15 |
---|---|
[NestJS] Param을 활용한 ID기준 게시물 찾기 (0) | 2024.01.11 |
[NestJS] 게시물 생성하는 Service, Controller 생성 (Request, Response) (0) | 2024.01.08 |
[NestJS] model 생성하기 (게시물) (0) | 2024.01.07 |
[NestJS] Service 생성 (0) | 2024.01.05 |