먼저 **Object Type
**의 스키마를 선언하기 위해서는 @ObjectType
, @Field
데코레이터를 사용한다.
Ex) Restaurant 객체 타입 : restaurant.entity.ts
import { Field, ObjectType } from "@nestjs/graphql";
@ObjectType()
export class Restaurant{
@Field(() => String)
name: string
@Field(() => Boolean)
isGood: Boolean
}
@ObjectType
데코레이터를 적용시킨다.@Field
데코레이터를 적용시키면 된다.
만약 특정 필드를 Nullable로 만들기 위해서는 아래와 같이 데코레이터 내에 객체 값을 전달해주면 된다.
import { Field, ObjectType } from "@nestjs/graphql";
@ObjectType()
export class Restaurant{
@Field(() => String)
name: string
@Field(() => Boolean, {nullable: true})
isGood?: Boolean
}
nullable 적용 결과
TS
쪽에서도 **?
**를 통해 Nullable 하다는 것을 동시에 표현해줘야 한다.Query 타입의 Resolver에게 전달되는 **Argument
**를 선언하기 위해서는 @Args
데코레이터를 이용할 수 있다.
import { Args, Query, Resolver } from "@nestjs/graphql";
import { Restaurant } from "./entities/restaurant.entity";
@Resolver()
export class RestaurantResolver{
@Query(() => [Restaurant])
restaurants(@Args('veganOnly') veganOnly: boolean): Restaurant[]{
return [];
}
}
@Args 데코레이터 사용 결과
@Args
**를 통해 정의하면 위의 사진과 같이 우리가 원하는대로 정의할 수 있다.<aside> 👀
@Args
데코레이터는 @Query, @Field 데코레이터와 달리 TS, GQL 타입을 따로 지정할 필요없이 TS
타입으로 GQL 타입을 한번에 선언⭐️할 수 있다.
</aside>
<aside> 👀
@Query, @Field 데코레이터는 보면 특이하게 Resolver 함수의 반환값을 이미 TS 문법대로 지정했음에도 불구하고 해당 데코레이터 내에 또 다시 타입을 정의하고 있다. 이는 TS의 타입 정의는 컴파일 시점에만 이용되고 사라지기 때문⭐️이다. 따라서 런타임에 타입을 알아야 하는 GQL을 사용하기 위해서는 노트에 기록을 해놓듯 데코레이터에 타입을 기록을 해놔야 하는 것이다.
</aside>
Mutation
타입을 정의하는 방법과 **DTO
**를 정의하는 방법에 대해 알아보도록 하자.