
기능:
스키마의 커스텀 기능
스키마의 커스텀 기능
GraphQL 사양에 제안된 여러 기능이 이미 Gato GraphQL에 구현되어 있으므로, 기다릴 필요가 없습니다.
스키마 네임스페이싱
WooCommerce와 Easy Digital Downloads 플러그인이 모두 GraphQL API용 Product 타입을 구현한 경우, 두 타입이 충돌하므로 두 플러그인을 동시에 설치할 수 없습니다.
스키마 네임스페이싱을 사용하면 모든 타입 이름에 네임스페이스를 부여하여 스키마 내의 충돌을 방지할 수 있습니다. 이를 통해 타입 Product는 각각 Woo_Product와 EDD_Product가 되며, 이 타입들을 동일한 스키마에 추가할 수 있게 됩니다.
이 이미지는 이름 충돌을 방지하기 위해 타입 Event와 Location에 접두사 EM_이 추가된 네임스페이스 스키마를 보여줍니다.

글로벌 필드
글로벌 필드는 GraphQL 스키마의 모든 타입에서 접근할 수 있는 필드입니다(단 한 번만 정의됩니다).
GraphQL 스키마는 Post, User, Comment 등의 타입과 Post.title, User.name, Comment.responses 등 각 타입에서 사용 가능한 필드를 노출합니다. 이러한 필드는 엔티티에서 특정 데이터를 가져온다는 의미에서 「데이터」를 다룹니다.
Gato GraphQL은 추가로, 데이터가 아닌 「기능」을 제공하는 또 다른 종류의 필드도 제공합니다.
글로벌 필드의 예시는 다음과 같습니다.
_not_if_equals_isEmpty_echo_sprintf_arrayItem_arrayAddItem_arrayUnique- 그 외 다수
기능 필드는 WordPress 외부에 저장된 데이터를 가져오거나, 가져온 데이터를 조작하는 데 유용합니다. 필드 값을 필요한 방식으로 변환할 수 있으며, 강력한 데이터 가져오기/내보내기 기능을 제공합니다.
기능 필드는 Post나 User 같은 특정 타입이 아닌, 스키마의 모든 타입에 속합니다. 그래서 Gato GraphQL에서는 이를 「글로벌 필드」라는 이름으로 독자적인 방식으로 취급합니다.
Field to input
동일한 쿼리 내에서 필드의 값을 가져오고, 조작하여, 다른 필드의 입력으로 전달할 수 있습니다.
query {
posts {
excerpt
# Referencing previous field with name "excerpt"
isEmptyExcerpt: _isEmpty(value: $__excerpt)
# Referencing previous field with alias "isEmptyExcerpt"
isNotEmptyExcerpt: _not(value: $__isEmptyExcerpt)
}
}컴포저블 디렉티브
디렉티브의 입력이 필드의 출력과 다를 경우, 해당 디렉티브를 필드에 적용할 수 없는 경우가 종종 있습니다. 예를 들어, 디렉티브 @strUpperCase는 문자열을 입력으로 받기 때문에 문자열 배열을 반환하는 User.capabilities 필드에는 적용할 수 없습니다.
컴포저블 디렉티브를 사용하면, 하나의 디렉티브가 다른 디렉티브를 확장하여 동작을 변경하거나 부족한 부분을 보완할 수 있습니다. 이를 통해 입력이나 반환 타입을 바꾸기 위해 필드나 디렉티브를 중복 생성할 필요가 없어져 불필요한 비대화를 방지할 수 있습니다.
이 쿼리에서 디렉티브 @underEachArrayItem은 문자열 배열을 순회하며, 중첩된 디렉티브 @strUpperCase를 각 요소에 적용하여 타입 불일치를 해소합니다.
query {
users {
capabilities
@underEachArrayItem
@strUpperCase
}
}멀티 필드 디렉티브
성능 향상과 활용 범위 확대를 위해 디렉티브를 (하나가 아닌) 여러 필드에 적용할 수 있습니다.
활성화하면 모든 디렉티브에 인수 affectAdditionalFieldsUnderPos가 추가되어, 디렉티브를 적용할 추가 필드의 상대적 위치를 지정할 수 있습니다.
예를 들어, 다음 쿼리에서 디렉티브 @strTranslate는 필드 content에만 적용됩니다.
query {
posts {
excerpt
content @strTranslate
}
}필드 excerpt에도 디렉티브 @strTranslate를 적용하려면, 디렉티브 인수 affectAdditionalFieldsUnderPos에 값 [1]을 추가합니다(1은 디렉티브 @strTranslate로부터 필드 excerpt의 상대적 위치입니다).
query {
posts {
excerpt
content
@strTranslate(
affectAdditionalFieldsUnderPos: [1]
)
}
}필드 및 디렉티브 단위 버전 관리
스키마와 독립적으로 필드와 디렉티브를 개별적으로 버전 관리할 수 있습니다.
스키마 전체를 변경하는(변경된 필드나 디렉티브의 이름을 수정해야 하는) 대신, 다음과 같은 작업이 가능합니다.
- 동일한 필드 또는 디렉티브 이름으로 서로 다른 구현을 유지
- 시맨틱 버전 관리를 사용하여 레거시 구현을 태그 아래에 노출
- 필드/디렉티브 인수
versionConstraint로 특정 버전에 접근
능동적 피드백
최상위 항목 extensions를 사용하여 쿼리 응답에서 더 이상 사용되지 않는 기능 및 경고와 관련된 데이터를 전송할 수 있습니다.
- 더 이상 사용되지 않는 기능: 더 이상 사용되지 않는 기능은 인트로스펙션 시뿐만 아니라, 해당 필드가 포함된 쿼리를 실행할 때도 반환됩니다.
- 경고: 경고는 비차단적인 문제로 간주될 수 있습니다. 즉, 쿼리를 중단시키지 않으면서 개선의 여지가 있음을 나타냅니다.
예를 들어, 다음 쿼리에서는 두 개의 필드가 동일한 동적 변수 이름 "prop"으로 내보내지며, 경고가 생성됩니다.
query {
posts {
excerpt @export(as: "prop")
content @export(as: "prop")
}
}응답에는 warnings 섹션(extensions 내)과 해당 메시지가 포함됩니다.
{
"extensions": {
"warnings": [
{
"message": "Dynamic variable with name 'props' had already been set, had its value overridden",
"locations": [
{
"line": 4,
"column": 25
}
]
}
]
},
"data": {
"posts": {
"excerpt": "Hello world!",
"Content": "<p>Hello world!</p>"
}
}
}