Gato GraphQL vs WPGraphQL
Gato GraphQL과 WPGraphQL 비교


헤드리스 WordPress 사이트를 구축하여 정적으로 배포하기만 한다면, 현재 WPGraphQL을 사용하고 있어도 Gato GraphQL로 전환해도 큰 차이가 없습니다.
그 외의 경우, Gato GraphQL로 전환하면 많은 이점이 있습니다. 다음은 Gato GraphQL+전체 확장 기능이 제공하는 기능으로, WPGraphQL에서는 사용할 수 없는 것들입니다.
비교표
| 기능 | Gato GraphQL | WPGraphQL |
|---|---|---|
| N+1 쿼리 문제 | 아키텍처 설계로 인해 문제가 발생하지 않음 | 적절히 처리하지 않으면 문제가 될 수 있으며, 개발자의 주의가 필요 |
| 보안: 엔드포인트 비활성화 | persisted queries로 단일 엔드포인트를 완전히 비활성화 가능 (PRO) | 미제공 |
| 접근 제어 | UI를 통한 역할/capability/IP 기반 필드별 유효성 검사 (PRO) | 필드 수준이 아니며, 세분화 수준이 낮음 |
| 캐시 제어 | 쿼리의 max-age 자동 계산 (PRO) | 자동 캐시 제어 없음 |
| 커스텀 엔드포인트 | 비밀번호 보호/커스터마이징 가능한 복수 엔드포인트, 엔드포인트 계층 지원 (PRO) | 단일 엔드포인트, 커스터마이징 제한 |
| 일괄 업데이트 및 찾기/바꾸기 | GraphQL을 통한 일괄 삭제, 태그 지정, 바꾸기 (regex 지원) (PRO) | 미제공 |
| 커스텀/실험적 GraphQL 기능 | 중첩 mutation, 스키마 네임스페이싱, oneOf input object | 거의 표준 GraphQL 사양에 준함 |
| Multiple Query Execution (컴포저빌리티) | 하나의 문서에서 복수 쿼리 실행, @export로 상태 공유 | 쿼리 배치 처리 (1 요청에 복수), 단 상태 공유 불가 |
| 내부/프라이빗 엔드포인트 | 백엔드/PHP 전용 프라이빗 엔드포인트, 사용자에게 비공개 (PRO) | 사용 불가 |
| 풍부한 데이터 mutation | 하나의 문서에서 데이터 조회·수정·저장 가능 (PRO) | 미지원 |
| 콘텐츠 동기화 및 배포 | GraphQL, RSS, CSV, REST API를 통한 가져오기/내보내기 (PRO) | 미제공 |
| 웹 서비스 연동 | 아웃바운드/인바운드 API 호출 및 webhook (PRO) | 미지원 |
| 자동화 (훅/워크플로) | GraphQL을 워크플로 자동화로 활용 (PRO/UI 편집기) | 사용 불가 |
| 사용 편의성 (UI 통합) | GraphQL 쿼리 구축·관리를 위한 풍부한 UI 기능 | 보다 기본적인 관리 UI |
| 배치 처리/컴포저빌리티 | 필드/디렉티브 합성, 재사용 가능한 리졸버 로직 (PRO) | 미지원 |
| Multiple Query Execution | 지원, 상태 공유 및 의존 관계 있음 | 지원, 상태 공유 없음 |
| 표준 헤드리스/정적 활용 | 두 가지 모두 동등한 기능 | 두 가지 모두 동등한 기능 |
레이블:
- (PRO): Gato GraphQL의 유료/프로 버전/확장 기능이 필요한 기능을 나타냅니다.
주요 사항 요약:
- Gato GraphQL은 고급 개발, 자동화, 보안을 위한 중요한 추가 기능을 제공합니다
- 두 플러그인 모두 기본적인 정적/헤드리스 WordPress 설치에 있어 동등합니다
- Gato GraphQL의 고급 기능은 다음에 초점을 맞추고 있습니다:
- 세분화된 제어
- 워크플로 자동화
- 풍부한 통합 기능
- 최신 GraphQL 실험적 기능
개발 편의성
개발자는 "n+1" 쿼리 문제를 걱정할 필요가 없습니다. GraphQL 서버의 아키텍처 설계상, 애초에 문제가 발생하지 않습니다.
보안
persisted queries를 사용해 미리 정의된 데이터를 공개하는 경우, GraphQL 단일 엔드포인트를 완전히 비활성화하여 인증된 사용자도 접근할 수 없도록 설정할 수 있습니다.

접근 제어
로그인한 사용자, 특정 역할이나 capability를 가진 사용자, 또는 특정 IP 범위에서 방문하는 사용자만이 데이터에 접근할 수 있도록 필드별로 유효성 검사를 설정할 수 있습니다 (PRO).

캐시 제어
표준 HTTP 캐싱을 사용하여 GraphQL 응답을 캐시할 때, GraphQL 쿼리에 포함된 모든 필드를 기반으로 max-age 헤더가 자동으로 계산됩니다 (PRO).

엔드포인트 커스터마이징 및 관리
특정 고객이나 애플리케이션에 맞게 커스터마이징한 복수의 커스텀 엔드포인트를 제공하고, 비밀번호로 보호할 수 있습니다.
또한 커스텀 카테고리를 추가하거나, 계층 구조를 부여할 수도 있습니다 (예: /graphql/customers/some-customer나 /graphql/customers/another-customer).

일괄 업데이트
업데이트를 일괄로 실행할 수 있습니다. 예를 들어, 사이트의 모든 댓글을 삭제하거나, 모든 게시물에 태그나 카테고리를 지정할 수 있습니다.
또한 수백 개의 게시물에 걸쳐 문자열을 검색·치환하는 것도 가능합니다. 예를 들어, 이전 도메인을 새 도메인으로 바꾸거나, regex를 사용한 치환도 수행할 수 있습니다 (PRO).
커스텀 GraphQL 기능
사양으로 제안되었지만 아직 릴리스되지 않은 새로운 GraphQL 기능에 액세스할 수 있습니다. 중첩 mutation, 스키마 네임스페이싱, 'oneOf' Input Object가 포함됩니다.

Multiple Query Execution
WPGraphQL은 쿼리 배치 처리를 허용하며, 하나의 HTTP 요청 내에서 복수의 GraphQL 쿼리를 처리할 수 있습니다.
Gato GraphQL은 Multiple Query Execution을 제공하며, 하나의 GraphQL 문서에서 복수의 오퍼레이션을 실행할 수 있습니다.
Multiple Query Execution은 쿼리 배치 처리의 개선판으로, @export 디렉티브를 통해 오퍼레이션 간에 상태를 공유할 수 있습니다.
예를 들어, 게시물을 복제하려면 query 오퍼레이션으로 게시물 데이터를 가져온 다음, 그 데이터를 mutation 오퍼레이션에 전달하여 새 게시물을 생성합니다:
query GetPostAndExportData($postId: ID!)
{
post(by: { id: $postId }, status: any) {
author {
id @export(as: "authorID")
}
categories {
id @export(as: "categoryIDs", type: LIST)
}
rawContent @export(as: "rawContent")
rawExcerpt @export(as: "excerpt")
featuredImage {
id @export(as: "featuredImageID")
}
tags {
id @export(as: "tagIDs", type: LIST)
}
rawTitle @export(as: "title")
}
}
mutation DuplicatePost
@depends(on: "GetPostAndExportData")
{
createPost(input: {
status: draft,
authorBy: {
id: $authorID
},
categoriesBy: {
ids: $categoryIDs
},
contentAs: {
html: $rawContent
},
excerpt: $excerpt
featuredImageBy: {
id: $featuredImageID
},
tagsBy: {
ids: $tagIDs
},
title: $title
}) {
postID
}
}컴포저빌리티
필드를 합성하는 기능을 사용할 수 있습니다. 한 필드의 값을 같은 쿼리 내의 다른 필드에 대한 입력으로 제공할 수 있어, 기본적인 필드 리졸버 집합으로 무한한 유스케이스에 대응할 수 있습니다 (PRO).
예를 들어, Post.hasExcerpt 필드를 새로 생성하는 대신, Post.excerpt에 _notEmpty 필드를 적용하여 동일한 값을 생성할 수 있습니다:
query {
post(by: { id: 1 }) {
excerpt
hasExcerpt: _notEmpty(value: $__excerpt)
}
}마찬가지로, 디렉티브를 합성하는 것도 가능하며, 디렉티브를 필드 값의 내부 프로퍼티에 적용할 수 있습니다.
예를 들어, 다음 쿼리는 게시물의 카테고리 이름을 다른 언어로 번역합니다:
query {
post(by: { id: 1 }) {
title
categoryNames
frenchCategoryNames: categoryNames
@underEachArrayItem
@strTranslate(
from: "en",
to: "fr"
)
}
}GraphQL 서버 가용성
Gutenberg 블록을 구동하기 위한 프라이빗 엔드포인트를 노출할 수 있습니다. 또한 공개 엔드포인트를 전혀 노출하지 않고, PHP 코드를 사용해 애플리케이션 데이터를 가져오기 위한 프라이빗 GraphQL 서버에 액세스할 수 있습니다 (PRO).
데이터 mutation의 다용도성
GraphQL을 사용하여 사이트 콘텐츠를 조회·수정·재저장하는 모든 작업을 하나의 GraphQL 문서 내에서 실행할 수 있습니다 (PRO).
예를 들어, 게시물 내의 모든 Gutenberg 블록을 가져와 속성을 추출하고, Google Translate API로 해당 문자열을 번역한 다음, 문자열을 블록에 다시 삽입하고 게시물을 재저장할 수 있습니다.
콘텐츠 동기화 및 배포
GraphQL을 사용하여 다른 WordPress 사이트에서 게시물을 가져오거나, RSS 피드에서 가져오거나, CSV에서 가져오거나, REST API나 GraphQL API에서 가져올 수 있습니다 (PRO).
다른 WordPress 사이트로 콘텐츠를 내보내고, JSON 및 CSV로 저장할 수도 있습니다 (PRO).
웹 서비스 연동
HTTP 클라이언트를 사용하여 외부 서비스의 API를 호출할 수 있습니다 (PRO). 예를 들어, WordPress 사용자를 Mailchimp 이메일 목록에 구독 등록할 수 있습니다.
또한 전용 webhook을 통해 모든 서비스에서 수신 데이터를 받아 처리할 수도 있습니다 (PRO). 예를 들어, InstaWP 샌드박스 사이트에 등록된 뉴스레터 이메일 주소를 수집하여 자동으로 Mailchimp에 전송할 수 있습니다.
자동화
GraphQL을 사용하여 태스크 및 콘텐츠 워크플로를 자동화할 수 있습니다 (PRO).
예를 들어, 새 게시물이 생성될 때 (훅 draft_post의 이벤트 경유) 게시물에 썸네일이 없는지 확인하는 persisted query를 실행하고, 없는 경우 Stable Diffusion API를 호출하여 이미지를 생성하고, TinyPng으로 압축한 다음, 최종적으로 그 이미지를 게시물의 대표 이미지로 설정할 수 있습니다.

사용 편의성
이러한 모든 추가 유스케이스는 PHP 코드를 배포하지 않고도, 사용자 인터페이스를 통해 GraphQL 쿼리를 입력하는 방식으로 wp-admin 내에서 직접 실현할 수 있습니다.
