728x90

Mutation 만들기

restaurants.resolver.ts 파일에 다음과 같이 Mutation을 만듭니다.

import { Resolver, Query, Args, Mutation } from '@nestjs/graphql';
import { CreateRestaurantDto } from './dtos/create-restaurant.dto';
import { Restaurant } from './entities/restaurant.entity';

@Resolver((of) => Restaurant)
export class RestaurantResolver {
  @Mutation((returns) => Boolean)
  createRestaurant(
    @Args('name') name: string,
    @Args('isVegan') isVegan: boolean,
    @Args('address') address: string,
    @Args('ownerName') ownerName: string,
  ): boolean {
    console.log(createRestaurantInput);
    return true;
  }
}

Argument 를 여러개 만들어 줘요 사실 이렇게 Args 를 선언해도 상관 없지만 더 멋진방법으로는 data transfer object 폴더를 만들어 Args 의 object class 를 만들어 class 를 참조하는 방법으로 코드를 변경해볼게요.

위의 폴더 구조처럼 dtos 라는 폴더를 만들고 create-resaurant.dto.ts 파일을 만듭니다.

// data transfer object
// inputType - 그저 하나의 object 입니다. argument 로써 graphql에 전달하기 위한 용도
// ArgsType - 분리된 값들을 GraphQL argument로 전달해 줄 수 있도록 해줌


import { InputType, Field, ArgsType } from '@nestjs/graphql';

@InputType()
export class CreateRestaurantDto {
  // @Args('name') name: string,
  // @Args('isVegan') isVegan: boolean,
  // @Args('address') address: string,
  // @Args('ownerName') ownerName: string,
  @Field((type) => String)
  name: string;
  @Field((type) => Boolean)
  isVegan: boolean;
  @Field((type) => String)
  address: string;
  @Field((type) => String)
  ownerName: string;
}

@Args 를 다음과 같이 변경한 모습입니다. InputType 으로 먼저 테스트 할게요

import { CreateRestaurantDto } from './dtos/create-restaurant.dto'

...

@Mutation((returns) => Boolean)
  createRestaurant(
    // @Args('name') name: string,
    // @Args('isVegan') isVegan: boolean,
    // @Args('address') address: string,
    // @Args('ownerName') ownerName: string,
    @Args('createRestaurantInput') createRestaurantInput: CreateRestaurantDto,
  ): boolean {
    console.log(createRestaurantInput);
    return true;
  }

inputType - 그저 하나의 object 입니다. argument 로써 graphql에 전달하기 위한 용도

이렇게 하면 잘작동합니다.

또 다른 방법으로는 ArgumentType 을 이용하면 @Args('') 사이를 비워줄수가 있는데요

import { InputType, Field, ArgsType } from '@nestjs/graphql';

@ArgsType()
export class CreateRestaurantDto {
  // @Args('name') name: string,
  // @Args('isVegan') isVegan: boolean,
  // @Args('address') address: string,
  // @Args('ownerName') ownerName: string,
  @Field((type) => String)
  name: string;
  @Field((type) => Boolean)
  isVegan: boolean;
  @Field((type) => String)
  address: string;
  @Field((type) => String)
  ownerName: string;
}

데코레이터를 ArgsType으로 변경한뒤

@Mutation((returns) => Boolean)
  createRestaurant(
    // @Args('name') name: string,
    // @Args('isVegan') isVegan: boolean,
    // @Args('address') address: string,
    // @Args('ownerName') ownerName: string,
    @Args() createRestaurantInput: CreateRestaurantDto,
  ): boolean {
    console.log(createRestaurantInput);
    return true;
  }

위의 코드 처럼 변경합니다.

앞으로 저는 ArgsType 을 주로 쓸거 같네요
github 참고

728x90

'Side > uber-eats' 카테고리의 다른 글

TypeORM setup 과 Nestjs Config  (0) 2021.05.23
NestJs Validating ArgsTypes  (0) 2021.05.23
NestJs - Arguments  (0) 2021.05.22
Nestjs - ObjectType  (0) 2021.05.22
Nestjs + react Day1  (0) 2021.05.19