Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Rails で graphql-ruby を使い倒して
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
yubrot
December 15, 2025
Programming
32
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rails で graphql-ruby を使い倒して
What would you do? 2025
https://storesinc.tech/conf/2025
yubrot
December 15, 2025
Other Decks in Programming
See All in Programming
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
Next.js: The final boss of Web Performance
guaca
0
260
AmebaブログはKMPから卒業します
kmars0605
0
190
golang-bob.pdf
iwatsukayura
0
130
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
1k
Jetpack Compose Mechanisms
skydoves
3
820
ActionController meets Protocol Buffers
sorah
0
520
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
110
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
280
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
2
560
ジョジョの世界をXRで再現する
mofurune
0
160
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
150
Featured
See All Featured
Context Engineering - Making Every Token Count
addyosmani
9
1.2k
Optimizing for Happiness
mojombo
378
71k
Accessibility Awareness
sabderemane
1
250
So, you think you're a good person
axbom
PRO
2
2.2k
Claude Code のすすめ
schroneko
67
230k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
600
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
300
How Software Deployment tools have changed in the past 20 years
geshan
2
35k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
300
Become a Pro
speakerdeck
PRO
31
6.3k
Transcript
Rails で graphql-ruby を使い倒して (振り返り、未来へ、 RESTと比較して ) yubrot
Speaker https://yubrot.github.io/ • HN: yubrot (ゆーぶろ) • Web • エンジニアリングマネージャ
private: JITでマクロが動く自作言語処理系とか
GraphQL? graphql-ruby?
STORES と GraphQL • STORES は色々なところで GraphQL を活用してきた • 我々は
Ruby on Rails と共に、 graphql-ruby gem を特に多用してきた この振り返り Disclaimer • REST API という言葉を Roy Fielding 氏の提唱するそれより広義に使います • クライアント側触れる時間が...
STORES と GraphQL いつから: 2020年ごろ (サーバとレジアプリ間) 〜
どこで: 複数のRails apps / 一部 Go, Node apps どの用途で: ◯for Mobile ◯for Web Apps ◎システム間の連携 ✕APIの外部公開 → 「1つのSTORES」のためのデファクトとしての採用という側面 があった 開発の型、システム間の契約
(デファクトとして) GraphQL? 言語もシステムも異なるものを繋げる → できるだけ素朴なやり方にしたい GraphQL は...? → 素朴に over
HTTP である (※エンドポイントは1つ) よくいわれる利点: • on-demand, リソースを多段に取得できる querying • Type-safe schemas よくいわれる疑問点: • 素朴か? • その表現力が求められるのか? • 「便利」ではあるが、 too much ではないか? • 実装コストは? • 学習コストは? • クライアント側は?
GraphQL, graphql-rubyを 使い倒す 開発体験
意思決定を減らす • API スキーマどうしよう ◦ OpenAPI yaml 直接書く? TypeSpec? …
• API エンドポイントどうしよう ◦ /items ? /somewhere/items ? • データをどう表現しよう • このAPIでどこまで情報を返そう ◦ /items vs. /items/[id] ◦ ?fields=id,name,amount ? • ?page=1 ? ?after=id ? また、これらは API 全体で統一されているか?
意思決定を減らす: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
graphql-ruby は「意思決定の少なさ」を実装まで広げる
graphql-ruby は「意思決定の少なさ」を実装まで広げる
Batteries included: Pagination
Batteries included: Pagination def activities = object.activities
Batteries included: deprecation field :user, Types::User, null: true, deprecation_reason:
“Use reactedUser instead”
Batteries included: more! • Complexity limit • 命名規約 • Global
Object Identification (for caching) • バリデーション Rails の Convention over Configuration に近しいものがある
使い倒す → よく知る • GraphQLをよく知る • graphql-rubyをよく知る 学習コストが高いようで、その多くは実践的に必要なものたち
→ • APIとして統一され、実装方法が規定されたものが • あらかじめ揃っている 素朴にRESTで、をやりきれるか? 独自方言を作ったり、車輪の再発明・再開発をしていないか?
NEXT:実践的な課題と向き合う ここまで:道具を知り型に則る話 ここから:実践的な課題
NEXT:実践的な課題と向き合う • 利便性と引き換えに、実装コストが大きいのでは? • クライアントが面倒では? REST API でも考慮する…:
• エラーは? • 認可は? • 運用観点は? • 新規に開発メンバーを迎えるには?
我々のやり方で GraphQL を実践 する
最大の難所:データロード “performantな” データロードは明らかに困難 on-demand なクエリができるということは、 on-demand なクエリを適切に処理できる必要がある!
いくつか試した中では Shopify/graphql-batch の使い勝手が良かった https://github.com/Shopify/graphql-batch 割り切るのも選択肢ではないか ? クライアントは信頼できる社内の別システムであることを踏まえて… • 実践的に使われるクエリに応じた relation.includes をしてしまう • N+1 query を実際のパフォーマンス課題に応じて潰す
エラー (1):アプリケーションドメインのエラーは GraphQL unionを使った表現で → graphql-ruby エラーの設計と実装
エラー (2): “ベストエフォート” で有意な HTTP ステータスコードを返す GraphQL over HTTP では、
• application/json, 常に 200 と規定されていた • application/graphql-response+json という比較的新しい Content-type では、アプリケーションドメインのエラーに沿った HTTP ス テータスコードを返すことが認められている 社内ではそんなに取り組んでいない →
監視運用:「できる」「サボらない」 operationName や、フィールド上のエラーをトラックする
監視運用:とはいえ大変… REST APIで得られるこの辺の前提が崩れる: • 標準的なHTTPツールでモニタできる • 標準的なWAFルールで保護できる
• 標準的なHTTPクライアントライブラリで通信できる ※ • … ※ GraphQL も over HTTP ではあるが、 curl で一発というほど querying が簡単ではない
開発の足並みを揃えていく • Code-first だが、コード生成結果をリポジトリにコミットする ◦ コード生成結果のdiffがないことをCIで検証する • main に入ったスキーマ変更を、 CIでセントラルなスキーマリポジトリに自動的にpushする
• repository dispatch (GitHub Actions) を使い、セントラルなスキーマ リポジトリに入ったスキーマ変更を、各リポジトリにbroadcastする
開発者の足並みを揃えていく GraphQL スキーマを通して、API設計や変更への理解度を高める • interface? union? enum? type? 決定チャート •
どんな変更が破壊的か? doc
API設計への造詣は GraphQL 「でも」重要 • API スキーマ をシステム間通信の契約の根幹とする • そのために、APIスキーマを共有する仕組みを整える •
どう表現するか? どのような変更が破壊的なのか? 等を理解する …これらは REST API でも重要 GraphQL「だから」発生している課題ではない
まとめ:素朴なやり方を原則とする、デメリットを捉える 固有の課題を捉える • データロードは、難しい • 標準的な HTTP に基づいて動作するツールとはギャップがある ◦ ギャップを埋める振る舞いをしたり、ひと手間をかける必要がある
→ できるだけ素朴に解決する API 設計の悩みから開放されるわけではない、引き続き向き合う課題だが GraphQLではスキーマが共通の言語としてよく機能する
これから どうしていく
本当の「実践」とのギャップ 「素朴に」としつつ、社内でもまだ実践しきれていない 「ひとつのSTORES」を目指している中で、それはそのまま開発の足並みを 揃えられていないという課題がある 社内で問いかけをし、社内での見解を出していく、というのをやりきれていなかった 一方で、全てを揃えるわけでもない どこに、どこまで足並みを揃えたいか?
(再) GraphQL? を問い直してみる 素朴に over HTTP である (※エンドポイントは1つ) よくいわれる利点:
• on-demand, リソースを多段に取得できる querying • Type-safe schemas よくいわれる疑問点: • 素朴に REST で良いのではないか? • その表現力が求められるのか? • 「便利」ではあるが、 too much ではないか? • 実装コストは? • 学習コストは? • クライアント側は? ←問い直す
REST API でやること、GraphQL でやること、どちらでもやること • GraphQL で最も課題になるのは運用だろう ◦ 標準的な HTTP
から外れてる部分を意識する • GraphQL はクライアントからの利用の視点以外でも 開発フロー全体を下支えする • GraphQL でも REST API でもAPI設計と向き合う ◦ REST API は GraphQL と比較して規定されている部分は狭い ◦ 全体のデザインにも気を払う