아키텍처
아키텍처요청된 쿼리와 실행 가능한 쿼리의 분리

요청된 쿼리와 실행 가능한 쿼리의 분리

Gato GraphQL은 디렉티브 파이프라인을 사용합니다. 이는 서버의 엔진이 쿼리를 처리, 검증, 실행할 수 있도록 하는 아키텍처입니다. 엔진을 최대한 단순하게 유지하기 위해, 쿼리 처리에 관한 모든 작업은 디렉티브를 통해 파이프라인 내에서 이루어집니다.

디렉티브 파이프라인

필드를 검증하고 처리하기 위해 리졸버를 호출하고, 그 출력을 응답에 병합하는 작업은 두 가지 특수 디렉티브인 @validate@resolveValueAndMerge를 통해 이루어집니다. 이 디렉티브들은 특수한 유형에 속하며, 애플리케이션(쿼리 또는 스키마 어느 쪽)에 의해 추가되는 것이 아니라 엔진 자체에 의해 추가됩니다. 이 2개의 디렉티브는 암묵적으로 존재하며, 모든 쿼리의 모든 필드에 항상 추가됩니다.

이 방식을 통해, GraphQL 서버에서 쿼리를 실행할 때 실제로는 2개의 쿼리가 관여한다는 것을 알 수 있습니다:

  • 요청된 쿼리
  • 실행 가능한 쿼리

실행 가능한 쿼리는 최종적으로 서버가 처리하는 쿼리로, 요청된 쿼리에 변환을 적용하여 생성됩니다. 그 변환에는 모든 필드에 대한 @validate@resolveValueAndMerge 디렉티브 추가가 포함됩니다.

GraphQL 서버 내부 프로세스

예를 들어, 요청된 쿼리가 다음과 같다면:

{
  posts {
    url
    title @uppercase
    content @include(if: $addContent)
  }
}

실행 가능한 쿼리는 다음과 같이 됩니다:

{
  posts @validate @resolveValueAndMerge {
    url @validate @resolveValueAndMerge
    title @validate @resolveValueAndMerge @uppercase
    content @validate @include(if: $addContent) @resolveValueAndMerge
  }
}

사용되는 경우

Gato GraphQL은 다음과 같은 상황에서 실행 가능한 쿼리를 생성하기 위해 이 방식을 사용합니다:

  • @validate@resolveValueAndMerge와 같은 시스템 유형 디렉티브를 추가하는 경우
  • 디렉티브를 통한 IFTTT를 통해 임의의 디렉티브를 추가하는 경우
  • Multiple Query Execution에서 엄격한 필드 실행 순서를 정의하는 경우