티스토리 뷰

728x90

controller의 create post api이다.

  @Post()
  @CreateBoardDecorator()
  @UsePipes(ValidationPipe)
  async createBoard(
    @Body() data: CreateBoardDto,
  ): Promise<ResponseDto<CreateBoardResponseDto>> {
    const board = await this.boardsService.createBoard(data);
    const value = responseFormat(board, '게시글 생성 성공', HttpStatus.OK);
    return value;
  }

 

- CreateboardDecorator(): swagger 전용 데코레이터
- UsePipes(ValidationPipe): 핸들러 레벨의 validation, 모든 파라메터에 적용한다.
- createBoardDto: body로 들어온 값 타입 체크
- 기존에 만든 ResponseDto에 CreateBoard의 data 전체를 타입으로 만들어 넘겨주기(아래 자세한 설명)
- responseFormat() service나 repository에 넘어온 데이터를 전달하여 포맷 만들기

ResponseDto를 만든 이유는 api의 응답값은 http status만 있는 것이 아니라 팀 규격에 맞는 응답 객체 구조가 있습니다.
모든 API 응답값에는 아래 값들이 있어야 합니다.

import { ApiProperty } from '@nestjs/swagger';

export class ResponseDto<T> {
  @ApiProperty({ example: true, description: '성공 여부' })
  result: boolean;

  @ApiProperty({ example: 200, description: 'http status code' })
  status: number;

  @ApiProperty({ example: '성공', description: '메세지' })
  message: string;

  @ApiProperty({ description: '실제 사용하는 데이터 전문' })
  data: T;
}

 

export class CreateBoardResponseDto {
  @ApiProperty({ description: '제목', required: true, default: '제목입니다.' })
  title: string;

  @ApiProperty({ description: '내용', required: true, default: '내용입니다.' })
  description: string;
}

위의 title과 description이 ResponseDto의 data가 됩니다.