게시물의 Id는 유니크해야함. 현재(데이터베이스를 안쓰는) 임의로 유니크한 값을 주기 위해 uuid모듈을 사용할것
npm i uuid --save
import {v1 as uuid} from "uuid";
클라이언트에서 보내온 값을 핸들러에서 가져오는 방법!?
Express 에서는 bodyParser 모듈을 이용해서 req.body 이런 식으로 클라이언트에서 보내온 값을 받아왔음.
NestJS 에서는 @Body body
를 이용해서 가져옴!!
@Body body : req 에서 보내온 모든 값을 가져옴
@Body("title") title 이런 식으로 지정해 줘야 하나씩 가져올 수 있음.
Data Transfer Object
게층간 데이터 교환을 위한 객체
DB에서 데이터를 얻어 Service나 Controller등으로 보낼 때 사용하는 객체를 말합니다.
DTO는 데이터가 네트워크를 통해 전송되는 방법을 정의하는 객체입니다.
interface나 class를 이용해서 정의될 수 있으며, NestJS에서는 class를 이용하는 것을 추천합니다.
많은 프로퍼티를 여러군데에서 사용하고 있는데 한 곳에서 프로퍼티의 이름을 바꿔줘야한다면 다른 곳에 똑같이 쓰인 것도 바꿔줘야합니다.
이렇게 된다면 유지보수하기 굉장히 힘들어지는데, 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;
둘은 같은 코드!! 효율적 코드 작성 필요~! 알지만 사용을 잘 안하더라...!
getBoardById(id: string): Board {
return this.boards.find((board) => board.id === id);
}
@Get('/:id')
getBoardById(@Param('id') id: string): Board {
return this.boardsService.getBoardById(id);
}
지금처럼 param 하나만 들고올때는 저런식으로 사용,
만약 여러개를 사용하는데 모두 들고 오고싶을때는
@Param() params: string[]
으로 사용!!
return할 필요가 없어서 void!
deleteBoardById(id: string): void {
this.boards = this.boards.filter((board) => board.id !== id);
}
@Delete('/:id')
deleteBoardById(@Param('id') id: string): void {
this.boardsService.deleteBoardById(id);
}
updateBoardStatus(id: string, status: BoardStatus): Board {
const board = this.getBoardById(id);
board.status = status;
return board;
}
@Put(':/id/status')
updateBoardStatus(
@Param('id') id: string,
@Body('status') status: BoardStatus,
): Board {
return this.boardsService.updateBoardStatus(id, status);
}