Upgrade to Pro — share decks privately, control downloads, hide ads and more …

in-process GraphQL のすすめ #ginzajs

in-process GraphQL のすすめ #ginzajs

Avatar for izumin5210

izumin5210

August 17, 2026

More Decks by izumin5210

Other Decks in Programming

Transcript

  1. whoami @izumin5210 LayerX バクラク事業部 (2022-09 -) Platform Engineering 部 Enabling

    チーム / Dev Infrastructure チーム Staff Software Engineer バックエンドや Web フロントエンドが専門 ISUCON14 4位 好きなリポジトリは vercel-labs/wterm © LayerX Inc.
  2. 前提 | GraphQL サーバの構成要素 GraphQL サーバの構成要素 NestJS Pothos GraphQL, GraphQL

    Nexus, TypeGraphQL, graphql-js SDL (*.graphql) Schema Definition @graphql-codegen/ typescript-resolvers Resolver Execution Engine Apollo Server Envelop Execution Middleware graphql-http, GraphQL Yoga Transport Adapter Hono, Express, Fastify, Next.js, … Transport ※ @izumin5210 による独自の分類です © LayerX Inc. https://speakerdeck.com/izumin5210/graphql-server-technology-selection 5
  3. GraphQL を Next.js に乗せる API が引くのは サーバ・クライアントの論理的な境界線 GraphQL がもたらすのは、view と

    presentation logic の間の契約 それは物理的に異なるサーバである必要はない 同一プロセスに置いても、境界線はそのまま引ける 開発チームが小さい場合など、 初期はデプロイメントを1つにまとめると運用負荷が抑えられる © LayerX Inc. 7
  4. GraphQL を Next.js に乗せる GraphQL Yoga を Next.js に乗せる GraphQL

    Yoga: The Guild 製の GraphQL サーバライブラリ 層でいうと Transport Adapter Envelop(Execution Middleware)も同梱 スキーマの作り方にも、下の HTTP サーバにも依存しない 実体は Request を受けて Response を返す関数 ひとつ yoga.fetch(request) © LayerX Inc. で実行できる スキーマ + resolver graphql-js GraphQL Yoga HTTP サーバ Schema Definition Resolver Execution Engine Execution Middleware Transport Adapter Transport 8
  5. GraphQL を Next.js に乗せる Route Handler にそのまま乗る Yoga の interface

    は Fetch API の / Next.js の Route Handler もまったく同じ interface Request © LayerX Inc. Response 9
  6. GraphQL を Next.js に乗せる Transport が Next.js になっただけ スキーマ +

    resolver graphql-js GraphQL Yoga Next.js Route Handler Schema Definition Resolver Execution Engine Execution Middleware Transport Adapter Transport 差し替わったのは一番外側の層だけ。中身はどのデプロイ形態でも同じ © LayerX Inc. 10
  7. RSC / SSR から GraphQL を直接呼ぶ Transport を飛ばして直接実行する スキーマ +

    resolver execute({ schema, document, … }) yoga.fetch(request) → → graphql-js GraphQL Yoga Next.js Route Handler 必要な層だけ着けて、その層を直接呼べばよい © LayerX Inc. Schema Definition Resolver Execution Engine Execution Middleware Transport Adapter Transport 13
  8. RSC / SSR から GraphQL を直接呼ぶ RSC — yoga.fetch yoga.fetch

    Request を直接呼ぶ はグローバルの fetch ではなく、Yoga インスタンスのメソッド を渡すとその場で GraphQL が走り、 Response が返る Server Component は async 関数なので、これを await するだけ © LayerX Inc. 14
  9. RSC / SSR から GraphQL を直接呼ぶ SSR — Apollo Client

    の YogaLink Apollo Client の API はそのまま。差し替わるのは link だけ Client Component と同じ書き味のまま、サーバ側でも実行できる © LayerX Inc. 15
  10. メール・Slack から呼ぶ Web frontend の方法論をそのまま持ち込む ① component 指向で view を組む

    jsx-slack — Slack Block Kit react-email — メール HTML vercel/chat — チャット UI fragment colocation もそのまま ② presentation logic は API の裏に隠蔽されている 表示のためのロジックは、Web frontend 向けの resolver にすでにある 「この view に何が必要か」の宣言 (query + DataLoader)ごと再利用できる GraphQL が in-process で呼べればオーバーヘッドを最小にしつつ再利用できる © LayerX Inc. 18
  11. まとめ in-process GraphQL のすすめ GraphQL サーバは層に分解できて、Transport は一番外側の層でしかない API が引くのは論理的な境界線。物理的に分けなくても成立する Next.js

    に相乗りさせれば、デプロイメントを増やさずに始められる 必要な層だけ着けて、その層を直接呼べる RSC / SSR、そしてメール・Slack のような push 型 view からも 結果として「view のためのデータ取得と presentation logic」を、 Web frontend の外へほぼコストゼロで持ち出せる © LayerX Inc. 22