동적 변수
아래의 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 사양의 일부가 아니지만, 다음에서 요청되고 있습니다: