스키마 확장
스키마 확장동적 변수

동적 변수

아래의 GraphQL 쿼리는 변수 $limit을 받아 가져올 게시물 수를 결정하며, 변수의 타입인 Int는 오퍼레이션에서 선언해야 합니다:

query GetPosts($limit: Int) {
  posts(limit: $limit) {
    id
    title
  }
}

이것은 GraphQL에서 기대되는 동작으로, 동일한 문서 내의 JSON 딕셔너리에 변수 값을 제공합니다:

{
  "limit": 3
}

이것은 많은 언어에서 공통적인 "정적" 동작입니다. 예를 들어 PHP에서는 아래 코드와 같이 함수 인수에서 타입을 지정할 수 있으며, 입력 $number는 정수로 정의되어 있습니다:

function double(int $number): int
{
  return $number * 2;
}

이제 PHP 함수 본문 내에서 변수를 선언할 때는 타입을 지정할 필요가 없습니다. 변수의 타입은 해당 변수가 사용되는 컨텍스트에 의해 결정됩니다. 아래 코드에서 $double에 정수 값을 할당하면 이 변수가 정수가 됩니다:

function double(int $number): int
{
  // This var is an integer, but we don't need to declare it
  $double = $number * 2;
  return $double;
}

커스텀 디렉티브 덕분에, GraphQL 서버는 유사한 동작을 제공하고 동적 변수를 지원할 수 있습니다. 동적 변수는 클라이언트에서 값을 제공받는 대신, 서버에서 쿼리를 처리할 때 값이 결정됩니다.

Gato GraphQL의 Multiple Query Execution 익스텐션에는 커스텀 디렉티브 @export가 포함되어 있습니다. 이를 통해 필드의 값을 (동적) 변수로 내보내고, 다른 오퍼레이션의 필드 인수에서 해당 변수의 값을 읽을 수 있습니다:

query ExportLoggedInUserName {
  me {
    name @export(as: "userName")
  }
}
 
query GetPostsContainingString
  @depends(on: "ExportLoggedInUserName")
{
  posts(filter: { search: $userName }) {
    id
    title
  }
}

변수 $userName은 동적이며, 이를 사용하는 오퍼레이션(GetPostsContainingString)에서 타입(String)을 정의할 필요가 없습니다. GraphQL 서버가 이미 컨텍스트를 이해하고 있습니다.

아래 쿼리와 같이 타입이 일치하지 않는 변수 값을 사용하려고 하면(Int가 예상되지만 동적 변수가 String인 경우):

query ExportDynamicVariable {
  _echo(value: "Hello world!") @export(as: "stringVar") # Exported: String
}
 
query UseVariable
  @depends(on: "ExportDynamicVariable")
{
  posts(
    pagination: {
      limit: $stringVar # Expected: Int, received: String
    }
  ) {
    id
  }
}

...GraphQL 서버는 값의 타입 변환에 실패하고 오류를 반환합니다:

{
  "errors": [
    {
      "message": "Cannot cast value 'Hello world!' for type 'Int'",
      "locations": [
        {
          "line": 10,
          "column": 13
        }
      ],
      "extensions": {
        "path": [
          "{limit: $stringVar}",
          "(pagination: {limit: $stringVar})",
          "posts(pagination: {limit: $stringVar}) { ... }",
          "query UseVariable @depends(on: \"ExportDynamicVariable\") { ... }"
        ],
        "type": "QueryRoot",
        "field": "posts(pagination: {limit: $stringVar}) { ... }",
        "id": "root",
        "code": "gql@5.6.1[16]",
        "specifiedBy": "https:\/\/spec.graphql.org\/draft\/#sec-Values-of-Correct-Type"
      }
    }
  ]
}

GraphQL 사양

이 기능은 현재 GraphQL 사양의 일부가 아니지만, 다음에서 요청되고 있습니다: