[typescript] 타입스크립트의 제네릭을 활용한 GraphQL 타입 정의하기

GraphQL은 API를 위한 쿼리 언어이자 런타임 환경입니다. 타입스크립트(TypeScript)를 사용하여 GraphQL 스키마와 타입을 정의하는 것은 매우 효과적일 수 있습니다. 이러한 경우에 타입스크립트의 제네릭을 활용할 수 있습니다.

제네릭(Generic) 개념 소개

제네릭은 타입 안전성을 유지하기 위해 사용됩니다. 이를 통해 함수, 클래스, 인터페이스 등을 여러 데이터 타입으로 동작하도록 만들 수 있습니다. 제네릭은 다음과 같이 정의됩니다.

function identity<T>(arg: T): T {
    return arg;
}

위 예제에서 T는 제네릭 타입 매개변수로, 이 함수는 어떠한 타입이라도 받을 수 있습니다.

GraphQL 스키마에 제네릭 적용하기

GraphQL 스키마에 제네릭을 적용하면 다음과 같이 타입을 동적으로 처리할 수 있습니다.

type Resolver<Result, Args> = (
  parent: any,
  args: Args,
  context: any,
  info: any
) => Promise<Result> | Result;

위 코드에서 ResolverResultArgs로 제네릭 타입을 받아들입니다. 따라서 이를 활용하면 다양한 타입의 Resolver 함수를 정의할 수 있습니다.

예제

아래 예제는 타입스크립트 제네릭과 GraphQL을 함께 활용하여 간단한 스키마를 정의하는 방법을 보여줍니다.

interface Book {
  title: string;
  author: string;
}

interface QueryResult<T> {
  data: T;
  error: string | null;
}

const getBook: Resolver<QueryResult<Book>, { id: number }> = async (parent, args, context, info) => {
  // 책 데이터 가져오기
  return { data: { title: 'Sample Book', author: 'John Doe' }, error: null };
};

위 예제에서 getBookQueryResult<Book> 타입을 반환하는데, 제네릭을 사용하여 일반화된 타입으로 동적으로 처리할 수 있습니다.

타입스크립트의 제네릭을 활용하면 GraphQL 스키마를 보다 유연하게 정의할 수 있으며, 재사용 가능한 코드를 작성하는 데 도움이 됩니다.


참고 자료: