[nodejs] GraphQL 쿼리 언어 디렉티브 활용

GraphQL은 API를 위한 쿼리 언어이자 런타임 시스템을 위한 런타임 타입 시스템으로 사용되는 강력한 도구입니다. 이러한 강력함은 디렉티브를 이용하여 더욱 향상시킬 수 있습니다.

디렉티브란?

디렉티브는 GraphQL 쿼리 언어에서 쿼리, 뮤테이션, 혹은 스키마에서 사용자 정의 타입을 위한 요소에 추가 정보를 제공합니다. 디렉티브는 필드를 선택하거나 거부하고, 결과를 가공하는 방법을 지시합니다.

예를 들어, @include 디렉티브를 사용하여 특정 조건에 따라 필드를 선택하거나 거부할 수 있습니다.

query($shouldIncludeField: Boolean!) {
  product {
    name
    price @include(if: $shouldIncludeField)
  }
}

위의 예제에서 @include 디렉티브는 price 필드를 선택하거나 거부하도록 합니다.

어떻게 디렉티브를 활용할까?

디렉티브를 활용하기 위해서는 다음과 같은 단계를 따릅니다.

  1. 스키마 정의: 디렉티브를 사용하기 위해 스키마 정의에 디렉티브를 추가합니다.
  2. 디렉티브 적용: 요청한 필드 혹은 유형에 디렉티브를 적용하여 원하는 동작을 수행합니다.
  3. 디렉티브 구현: 적용한 디렉티브에 대한 동작을 구현합니다.

예제

다음은 Node.js와 Apollo Server를 사용하여 GraphQL 디렉티브를 구현한 예제 코드입니다.

const { gql, ApolloServer, SchemaDirectiveVisitor } = require('apollo-server');
const { defaultFieldResolver } = require('graphql');

// 디렉티브 정의
const typeDefs = gql`
  directive @upper on FIELD_DEFINITION
  type Query {
    hello: String @upper
  }
`;

// 디렉티브 구현
class UpperCaseDirective extends SchemaDirectiveVisitor {
  visitFieldDefinition(field) {
    const { resolve = defaultFieldResolver } = field;
    field.resolve = async function (...args) {
      const result = await resolve.apply(this, args);
      if (typeof result === 'string') {
        return result.toUpperCase();
      }
      return result;
    };
  }
}

// 서버 설정
const server = new ApolloServer({
  typeDefs,
  schemaDirectives: {
    upper: UpperCaseDirective,
  },
  resolvers: {
    Query: {
      hello: () => 'world',
    },
  },
});

결론

GraphQL 디렉티브는 쿼리 언어의 강력한 기능 중 하나입니다. 이를 활용하여 쿼리와 뮤테이션을 보다 유연하게 처리할 수 있습니다.

디렉티브를 사용하여 API를 완전히 제어할 수 있으며, 이를 통해 클라이언트 측에서 요청하는 데이터를 유연하게 처리하는데 도움이 됩니다.


참고 문헌: