TypeGraphQL에서 Enum 사용하기

신연우·2021년 4월 16일
0

알 수 없는 에러 발생!

(node:21084) UnhandledPromiseRejectionWarning: Error: Cannot determine GraphQL output type for 'type' of 'Log' class. Is the value, that is used as its TS type or explicit type, decorated with a proper decorator or is it a proper output value?

무슨 일인지는 모르겠지만 갑작스레 서버가 켜지지 않는 버그가 발생했다. 갑자기 잘 켜지다가 왜 이러는 거야 ㅠㅠ

서버가 켜지지 않으면 백엔드 테스트가 불가능하기 때문에 빠르게 복구하고자 해당 문제를 분석했다.

우선, Log class라는 문구를 통해 Log entity를 정의한 파일에서 문제가 생긴 것이라 짐작할 수 있었다. 해당 파일에 가서 보니 딱 봐도 의심스러워 보이는 녀석이 있었다.

용의자가 너밖에 없단다

@ObjectType()
export class Log {
  @Field(type => ID)
  readonly id!: number;

  @Field()
  date!: Date;

  @Field(type => LogType)
  type!: LogType;

  @Field(type => User)
  user!: User;
}

위 코드가 바로 문제가 생긴 Log class인데, 아무리 생각해도 type 필드가 가장 수상하다. 필드의 type으로 지정한 타입이 바로 직접 enum이기 때문이다. 실제로 타입 중에 enum을 사용하는 필드는 이 type 필드 하나 뿐이니 말이다.

해답은 언제나 공식문서에 있다.

새로 배우는 기술에서 생기는 에러는 대부분 그 기술에 대한 지식이 부족해 생기는 에러가 대부분이고, 그런 에러는 모두 공식 문서에서 대부분 해답을 찾을 수 있다.

이번 에러도 같은 부류인데, enum 공식 문서를 읽으면 다음과 같은 코드가 있다.

import { registerEnumType } from "type-graphql";

registerEnumType(Direction, {
  name: "Direction", // this one is mandatory
  description: "The basic directions", // this one is optional
});

TypeGraphQL에서 Union 타입을 사용할 때도 createUnionType 함수를 통해 사용했었다. 아무래도 특정 타입을 커스텀해서 사용할 때는 반드시 특정 함수를 거쳐야 시스템이 인식할 수 있는 것으로 추측된다.

enum 또한 registerEnumType으로 등록을 해야 사용할 수 있는 것 같다. 실제로 해당 함수를 적용시키고 나니 바로 서버가 정상적으로 동작하는 것을 확인할 수 있었다.

profile
남들과 함께하기 위해서는 혼자 나아갈 수 있는 힘이 있어야 한다.

0개의 댓글