[typescript] 타입스크립트에서의 GraphQL 스키마 커스터마이징

GraphQL은 데이터를 쿼리하고 미묘한 데이터 변경을 포함한 여러 종류의 동작을 수행하기 위한 강력한 도구입니다. GraphQL 쿼리 및 뮤테이션 작성을 위해 스키마를 정의하는 것은 일반적인 작업입니다. 코드 기반의 스키마 정의로 인해 일부 특정 기능이나 유연성이 부족할 수 있습니다. 이러한 경우, 타입스크립트에서 GraphQL 스키마를 커스터마이즈하여 빠르게 반응하고 보다 효율적으로 개발할 수 있습니다.

1. 스키마 인터페이스 확장

기본 스키마를 정의한 후, 해당 스키마를 확장하는 방법이 있습니다. 타입스크립트 확장을 사용하여 새로운 필드 또는 타입을 스키마에 추가할 수 있습니다.

import { gql } from 'apollo-server';
import { User } from './user';

const extendedSchema = gql`
  extend type User {
    email: String!
  }

  extend type Query {
    userByEmail(email: String!): User
  }
`;

위의 코드에서 User 타입에 email 필드를 추가하였고, Query 타입에 userByEmail 필드를 추가하였습니다. 이렇게 확장된 스키마를 기존 스키마에 병합하여 GraphQL 서버를 초기화할 수 있습니다.

2. 커스텀 스칼라 정의

기본 스칼라 타입에 맞지 않는 데이터를 다룰 때, 사용자 정의 스칼라를 통해 스키마를 커스터마이즈할 수 있습니다. TypeScript에서는 GraphQLScalarType을 사용하여 커스텀 스칼라를 정의할 수 있습니다.

import { GraphQLScalarType } from 'graphql';

const DateType = new GraphQLScalarType({
  name: 'Date',
  description: 'Custom Date Type',
  parseValue(value) {
    return new Date(value); // value from the client input variables
  },
  serialize(value) {
    return value.getTime(); // value sent to the client
  },
});

위의 코드에서 DateTypeDate 스칼라 타입을 정의하고, parseValueserialize 메서드를 구현하여 입력값을 해석하고 반환값을 직렬화합니다. 이후, 스키마에 새로운 스칼라 타입을 추가할 수 있습니다.

3. 리졸버 함수 정의

리졸버 함수를 통해 스키마의 필드를 실제 구현할 수 있습니다. 기본 타입의 필드를 확장하거나 사용자 정의 스칼라의 동작을 정의할 수 있습니다.

const resolvers = {
  Date: DateType,
  User: {
    email: (user) => {
      return getEmailById(user.id);
    },
  },
  Query: {
    userByEmail: (root, args) => {
      return getUserByEmail(args.email);
    },
  },
};

위의 코드에서 Date 스칼라를 DateType으로, User 타입의 email 필드를 이메일을 반환하는 함수로, Query 타입의 userByEmail 필드를 이메일을 통해 사용자를 반환하는 함수로 정의하였습니다.

스키마 커스터마이징은 타입스크립트를 사용하여 GraphQL을 효율적으로 개발하고 관리하는 데에 중요한 요소입니다. 이러한 방법을 통해 스키마를 더 유연하고 강력하게 만들 수 있습니다.

참고 : Apollo Server - Schema customization


위의 내용은 타입스크립트와 GraphQL을 사용하여 스키마를 커스터마이즈하는 방법에 대한 내용입니다. 각 예시에 대한 자세한 설명과 코드는 레퍼런스를 참고하시기 바랍니다.