WordPress용 GraphQL 서버

Gato GraphQL vs WPGraphQL

Gato GraphQL과 WPGraphQL 비교

Gato GraphQL vs WPGraphQL
plus image
Gato GraphQL vs WPGraphQL

헤드리스 WordPress 사이트를 구축하여 정적으로 배포하기만 한다면, 현재 WPGraphQL을 사용하고 있어도 Gato GraphQL로 전환해도 큰 차이가 없습니다.

그 외의 경우, Gato GraphQL로 전환하면 많은 이점이 있습니다. 다음은 Gato GraphQL+전체 확장 기능이 제공하는 기능으로, WPGraphQL에서는 사용할 수 없는 것들입니다.

비교표

기능Gato GraphQLWPGraphQL
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 단일 엔드포인트를 완전히 비활성화하여 인증된 사용자도 접근할 수 없도록 설정할 수 있습니다.

Persisted query 편집기
Persisted query 편집기

접근 제어

로그인한 사용자, 특정 역할이나 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 내에서 직접 실현할 수 있습니다.

뉴스레터 구독하기

Gato GraphQL의 모든 업데이트를 놓치지 마세요.