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

Rails で graphql-ruby を使い倒して

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →
Avatar for yubrot yubrot
December 15, 2025

Rails で graphql-ruby を使い倒して

What would you do? 2025
https://storesinc.tech/conf/2025

Avatar for yubrot

yubrot

December 15, 2025

Other Decks in Programming

Transcript

  1. STORES と GraphQL
 • STORES は色々なところで GraphQL を活用してきた
 • 我々は

    Ruby on Rails と共に、 graphql-ruby gem を特に多用してきた
 
 この振り返り
 
 
 Disclaimer
 • REST API という言葉を Roy Fielding 氏の提唱するそれより広義に使います
 • クライアント側触れる時間が...

  2. STORES と GraphQL
 いつから: 
 2020年ごろ (サーバとレジアプリ間) 〜 
 


    どこで:
 複数のRails apps / 一部 Go, Node apps
 
 どの用途で: 
 ◯for Mobile ◯for Web Apps ◎システム間の連携  ✕APIの外部公開
 
 → 「1つのSTORES」のためのデファクトとしての採用という側面 があった
 開発の型、システム間の契約

  3. (デファクトとして) GraphQL?
 言語もシステムも異なるものを繋げる → できるだけ素朴なやり方にしたい
 GraphQL は...? → 素朴に over

    HTTP である (※エンドポイントは1つ)
 
 よくいわれる利点: 
 • on-demand, リソースを多段に取得できる querying
 • Type-safe schemas
 
 よくいわれる疑問点: 
 • 素朴か?
 • その表現力が求められるのか?
 • 「便利」ではあるが、 too much ではないか?
 • 実装コストは?
 • 学習コストは?
 • クライアント側は?

  4. 意思決定を減らす
 • API スキーマどうしよう
 ◦ OpenAPI yaml 直接書く? TypeSpec? …


    • API エンドポイントどうしよう
 ◦ /items ? /somewhere/items ?
 • データをどう表現しよう
 • このAPIでどこまで情報を返そう
 ◦ /items vs. /items/[id] ◦ ?fields=id,name,amount ?
 • ?page=1 ? ?after=id ?
 
 また、これらは API 全体で統一されているか?

  5. 意思決定を減らす:GraphQL
 • API スキーマどうしよう
 ◦ OpenAPI yaml 直接書く? TypeSpec? …

    → GraphQL Schema
 • API エンドポイントどうしよう
 ◦ /items ? /somewhere/items ? → グラフ (閉路を持てる)
 • データをどう表現しよう → GraphQL enum, union, interface, type
 • このAPIでどこまで情報を返そう
 ◦ /items vs. /items/[id] ◦ ?fields=id,name,amount ? → on-demand querying
 • ?page=1 ? ?after=id ? → Connection Type
 

  6. Batteries included: more!
 • Complexity limit
 • 命名規約
 • Global

    Object Identification (for caching)
 • バリデーション
 
 Rails の Convention over Configuration に近しいものがある

  7. 使い倒す → よく知る
 • GraphQLをよく知る
 • graphql-rubyをよく知る
 
 学習コストが高いようで、その多くは実践的に必要なものたち 


    →
 
 • APIとして統一され、実装方法が規定されたものが
 • あらかじめ揃っている
 
 素朴にRESTで、をやりきれるか? 独自方言を作ったり、車輪の再発明・再開発をしていないか? 

  8. 最大の難所:データロード
 “performantな” データロードは明らかに困難 
 
 on-demand なクエリができるということは、 on-demand なクエリを適切に処理できる必要がある!
 


    いくつか試した中では Shopify/graphql-batch の使い勝手が良かった
 https://github.com/Shopify/graphql-batch
 
 割り切るのも選択肢ではないか ?
 クライアントは信頼できる社内の別システムであることを踏まえて…
 • 実践的に使われるクエリに応じた relation.includes をしてしまう
 • N+1 query を実際のパフォーマンス課題に応じて潰す

  9. エラー (2): “ベストエフォート” で有意な HTTP ステータスコードを返す
 GraphQL over HTTP では、

    • application/json, 常に 200 と規定されていた • application/graphql-response+json という比較的新しい Content-type では、アプリケーションドメインのエラーに沿った HTTP ス テータスコードを返すことが認められている 社内ではそんなに取り組んでいない →
  10. 監視運用:とはいえ大変…
 
 
 
 REST APIで得られるこの辺の前提が崩れる: • 標準的なHTTPツールでモニタできる • 標準的なWAFルールで保護できる

    • 標準的なHTTPクライアントライブラリで通信できる ※ • … ※ GraphQL も over HTTP ではあるが、 curl で一発というほど querying が簡単ではない
  11. API設計への造詣は GraphQL 「でも」重要
 • API スキーマ をシステム間通信の契約の根幹とする • そのために、APIスキーマを共有する仕組みを整える •

    どう表現するか? どのような変更が破壊的なのか? 等を理解する …これらは REST API でも重要 GraphQL「だから」発生している課題ではない
  12. (再) GraphQL? を問い直してみる
 素朴に over HTTP である (※エンドポイントは1つ)
 
 よくいわれる利点:

    
 • on-demand, リソースを多段に取得できる querying
 • Type-safe schemas
 
 よくいわれる疑問点: 
 • 素朴に REST で良いのではないか?
 • その表現力が求められるのか?
 • 「便利」ではあるが、 too much ではないか?
 • 実装コストは?
 • 学習コストは?
 • クライアント側は?
 ←問い直す
  13. REST API でやること、GraphQL でやること、どちらでもやること
 • GraphQL で最も課題になるのは運用だろう ◦ 標準的な HTTP

    から外れてる部分を意識する • GraphQL はクライアントからの利用の視点以外でも 開発フロー全体を下支えする • GraphQL でも REST API でもAPI設計と向き合う ◦ REST API は GraphQL と比較して規定されている部分は狭い ◦ 全体のデザインにも気を払う