스키마 타입 디렉티브 처리하기
Gato GraphQL은 code-first 서버입니다. 즉, 코드를 사용하여 스키마를 개발합니다. (이에 대한 대안으로는 SDL-first 방식이 있으며, 이는 Schema Definition Language를 사용하여 먼저 스키마를 생성한 후 서비스를 개발합니다.)
SDL이 없는 code-first 서버는 스키마 타입 디렉티브를 자연스럽게 지원할 수 없습니다. 이 제한을 극복하기 위해 Gato GraphQL은 다음과 같은 메커니즘을 개발했습니다:
- 쿼리를 요청된 형태에서 실행 가능한 형태로 변환하기
- 실행 가능한 쿼리에 IFTTT 규칙 적용하기
이를 통해 GraphQL 서버에서 스키마 타입 디렉티브를 완전히 지원할 수 있게 됩니다.
왜 동작하는가?
@deprecated는 스키마 타입 디렉티브이므로 스키마에 적용되어야 합니다. 그런데 잠시 이것이 쿼리 타입 디렉티브라고 가정하고, 쿼리 내의 특정 필드에 직접 @deprecated를 추가하면 어떻게 될까요?
예를 들어, 다음 쿼리를 실행할 때:
query {
posts {
id
title
content @deprecated(reason: "Use newContent instead")
}
}사실 이것도 동작합니다! 결국 디렉티브는 필드에 대해 실행되는 기능에 불과하기 때문입니다. 그 기능을 스키마를 통해 선언하든, 쿼리 내에서 직접 선언하든 기능의 동작 방식은 달라지지 않습니다.
물론 동작한다고 해서 의미가 있는 것은 아닙니다. 클라이언트에게 쿼리에 @deprecated를 추가하도록 강제할 수는 없습니다. 이는 클라이언트 측이 아니라 서버 측 애플리케이션이 결정하는 기능입니다.
그러나 기능 자체는 여전히 동작합니다. 따라서 디렉티브를 스키마에 추가하든 쿼리에 추가하든 기능적인 관점에서는 차이가 없습니다. 더욱이 모든 디렉티브는 결국 쿼리 내에 존재하게 됩니다. 쿼리야말로 디렉티브가 실행되는 곳이기 때문입니다.
따라서 서버에 SDL이 없더라도 런타임 시에 디렉티브를 쿼리에 포함시킬 수 있습니다.