NestJS로 API 만들기 (2) Controller, DTO 작성

Jiwon Youn·2021년 1월 11일
1

NestJS로 API만들기

목록 보기
2/4

products.controller.ts

import { Body, Controller, Delete, Get, Param, Patch, Post, Query } from '@nestjs/common';
import { CreateProductDto } from './dto/create-product.dto';
import { ProductOutput, ProductsOutput } from './dto/output.dto';
import { UpdateProductDto } from './dto/update-product.dto';
import { ProductService } from './products.service';

@Controller('product')
export class ProductController {
  constructor(private readonly productService: ProductService) {}

  @Get()
  getAll(@Query() query: getProductsDto): Promise<ProductsOutput> {
    return this.productService.getAll(query.page, query.pageSize);
  }

  @Get('/:id')
  getOne(@Param('id') productId: number): Promise<ProductOutput> {
    return this.productService.getOne(productId);
  }

  @Post()
  create(@Body() productData: CreateProductDto) {
    return this.productService.create(productData);
  }

  @Delete('/:id')
  remove(@Param('id') productId: number) {
    return this.productService.deleteOne(productId);
  }

  @Patch('/:id')
  patch(@Param('id') productId: number, @Body() updateData: UpdateProductDto) {
    return this.productService.update(productId, updateData);
  }
}

객체를 CRUD 하는 컨트롤러 작성
@Controller('product') : localhost:3000/product 로 기본 베이스 매핑


GetAll, GetOne, Create, Update 시 Return 값의 필수 여부가 다르기 때문에 각각의 DTO 객체가 필요하다.

  • src/common/dto/output.dto.ts
import { Entity } from 'typeorm';

@Entity()
export class CoreOutput {
  ok: boolean;
  error?: string;
}

Error Handling과 Output DTO 객체들의 상속을 위한 부모 클래스 작성


  • src/products/dto/output.dto.ts
import { CoreOutput } from 'src/common/dto/output.dto';
import { Entity } from 'typeorm';
import { Product } from '../entities/products.entity';

@Entity()
export class ProductsOutput extends CoreOutput {
  data?: Product[];
}

@Entity()
export class ProductOutput extends CoreOutput {
  data?: Product;
}

GetAll 에 쓰일 ProductsOutput 과
GetOne 에 쓰일 Product Output 작성


  • src/products/dto/create-product.dto.ts
import { OmitType } from '@nestjs/mapped-types';
import { Product } from '../entities/products.entity';

export class CreateProductDto extends OmitType(Product, ['id']) {}

OmitType(Product, ['id']) : Product 객체에서 'id' 값을 제외한 나머지 값을 정의 (id는 PrimaryGeneratedColumn이므로 입력하지 않아도 됨)


  • src/products/dto/update-product.dto.ts
import { CreateProductDto } from './create-product.dto';
import { PartialType } from '@nestjs/mapped-types';

export class UpdateProductDto extends PartialType(CreateProductDto) {}

PartialType(CreateProductDto) : Product 객체에서 특정 타입들만의 값을 정의 (Update 시 특정 부분만 수정 가능)

OmitType, PartialType 설치 npm i @nestjs/mapped-types


  • src/products/dto/getProducts.dto.ts
import { IsNumber, IsOptional } from 'class-validator';

export class getProductsDto {
  @IsNumber()
  @IsOptional()
  page?: number;

  @IsNumber()
  @IsOptional()
  pageSize?: number;
}

page, pageSize를 반환할 객체 클래스
Controller의 getAll(@Query() query: getProductsDto) 에 사용

0개의 댓글