[nodejs] GraphQL 쿼리 언어 디렉티브 활용
GraphQL은 API를 위한 쿼리 언어이자 런타임 시스템을 위한 런타임 타입 시스템으로 사용되는 강력한 도구입니다. 이러한 강력함은 디렉티브를 이용하여 더욱 향상시킬 수 있습니다.
디렉티브란?
디렉티브는 GraphQL 쿼리 언어에서 쿼리, 뮤테이션, 혹은 스키마에서 사용자 정의 타입을 위한 요소에 추가 정보를 제공합니다. 디렉티브는 필드를 선택하거나 거부하고, 결과를 가공하는 방법을 지시합니다.
예를 들어, @include
디렉티브를 사용하여 특정 조건에 따라 필드를 선택하거나 거부할 수 있습니다.
query($shouldIncludeField: Boolean!) {
product {
name
price @include(if: $shouldIncludeField)
}
}
위의 예제에서 @include
디렉티브는 price
필드를 선택하거나 거부하도록 합니다.
어떻게 디렉티브를 활용할까?
디렉티브를 활용하기 위해서는 다음과 같은 단계를 따릅니다.
- 스키마 정의: 디렉티브를 사용하기 위해 스키마 정의에 디렉티브를 추가합니다.
- 디렉티브 적용: 요청한 필드 혹은 유형에 디렉티브를 적용하여 원하는 동작을 수행합니다.
- 디렉티브 구현: 적용한 디렉티브에 대한 동작을 구현합니다.
예제
다음은 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를 완전히 제어할 수 있으며, 이를 통해 클라이언트 측에서 요청하는 데이터를 유연하게 처리하는데 도움이 됩니다.
참고 문헌: