Node, Nest, Deno/🦁 Nest - Series

Nest + gql + typeORM(@nestjs/typeorm) (8) computed field (dynamic field)

DarrenKwonDev 2020. 12. 22. 02:56

computed field (dynamic field) : 실제로 DB에는 없지만 요청에 따라 computed 되는 필드들

 

1. @ResolveField

 

@ResolvedField를 통해 computed field를 사용할 수 있습니다.

entity 레벨에서 정의하는 것이 아니라 Resolver 레벨에서 정의됩니다.

@Resolver(() => Category)
export class CategoryResolver {
  constructor(private readonly restaurantService: RestaurantService) {}

  @ResolveField(() => Int)
  restaurantCount(): number {
    ... 중략
    return number;
  }
}

 

Resolver에 정의해뒀음에도 playground를 켜보면 restaurantCount가 있음을 확인할 수 있습니다.

 

2. @Parent

이제 실제로 restaurantCount가 작동하게 만들어 봅시다.

여기서 원하는 것은, 해당 카테고리에 속하는 레스토링이 몇 개 인지입니다.

 

적당한 Query Resolver를 작성하여 모든 카테고리를 가져오도록 코드를 짠 후 출력을 해보았더니 다음과 같은 결과가 나왔습니다.

{
  "data": {
    "allCategories": {
      "ok": true,
      "error": null,
      "categories": [
        {
          "id": 1,
          "name": "hamberger",
          "slug": "hamberger",
          "restaurantCount": 80
        },
		... 중략
      ]
    }
  }
}

 

이 경우에 parent인 category를 가져와서 해당 카테고리에 속하는 레스토랑을 count하면 될 것 같습니다.

 

docs.nestjs.com/graphql/resolvers#graphql-argument-decorators

Next는 지정된 decorators를 통해서 standard GraphQL resolver arguments를 사용할 수 있습니다.

@Resolver(() => Category)
export class CategoryResolver {
  ... 중략

  @ResolveField(() => Int)
  restaurantCount(@Parent() category: Category): Promise<number> {
    return this.restaurant.count({ category });
  }