17
なぜ minne で GraphQL を採用したか
GraphQL なら?
GitHub v4 GraphQL API
① 欲しいデータを受け取れるようにクエリを作成
①
Slide 18
Slide 18 text
18
なぜ minne で GraphQL を採用したか
GraphQL なら?
GitHub v4 GraphQL API
① 欲しいデータを受け取れるようにクエリを作成
② 望んだデータのレスポンスを受け取ることができる
① ②
Slide 19
Slide 19 text
19
なぜ minne で GraphQL を採用したか
GraphQL なら?
GitHub v4 GraphQL API
① 欲しいデータを受け取れるようにクエリを作成
② 望んだデータのレスポンスを受け取ることができる
余分なデータを取得しないことで、より高速にレスポンスを受け取れる可能性あり
① ②
Slide 20
Slide 20 text
20
なぜ minne で GraphQL を採用したか
先ほど取得した login, avatar_url, name に加えて
follower 数, following 数, gist 名も欲しい!
RESTの課題②:過小な取得
Slide 21
Slide 21 text
21
なぜ minne で GraphQL を採用したか
先ほど取得した login, avatar_url, name に加えて
followers 数、following 数、gist 名も欲しい!
RESTの課題②:過小な取得
GET https://api.github.com/user
GET https://api.github.com/users/mune0903/followers
GET https://api.github.com/users/mune0903/following
GET https://api.github.com/users/mune0903/gists
4回のリクエストが
必要になる
42
Apollo GraphQL client
モデルクラスが自動生成される
これでアプリからクエリを実行できる準備が整いました
🎉
Slide 43
Slide 43 text
43
Apollo GraphQL client
クエリを実行する
Slide 44
Slide 44 text
44
Apollo GraphQL client
① 生成されたモデルに必要な引数等を渡して ApolloApiClient を使ってクエリ実行する
クエリを実行する
①
Slide 45
Slide 45 text
45
Apollo GraphQL client
① 生成されたモデルに必要な引数等を渡して ApolloApiClient を使ってクエリ実行する
② レスポンスをハンドリングしてあげる
• GraphQL はエラーであっても 200 を返すので、ステータスコードで
ハンドリングできないので注意
クエリを実行する
①
②
Slide 46
Slide 46 text
46
Apollo GraphQL client
Apollo の依存を外部に漏らさない
UseCase, ViewModel に Apollo の依存関係が漏れるのは良くないので
アプリ独自の Entity にmap してあげています
Slide 47
Slide 47 text
47
4. GraphQL を採用して
良かったこと
Slide 48
Slide 48 text
48
GraphQL を採用して良かったこと
• GraphQL API の便利ツール GraphiQL が便利すぎる
• GitHub の GraphiQL
• https://docs.github.com/ja/graphql/overview/explorer
• GraphQL のイントロスペクション機能によって GraphiQL 自体がドキュメント
• あらゆる GraphQL API が API スキーマの詳細を返してくれる
開発体験が良い
51
GraphQL を採用して良かったこと
• minne web は Ruby on Rails 製のアプリケーション
• ※ Web フロント刷新中
• Web は2011年に rails new され爆誕
• iOS は2012年に爆誕
• Android は2013年に爆誕
※ Initial commit された年であってリリース年と異なる可能性があります
minne の歴史(ざっくり)
Slide 52
Slide 52 text
52
GraphQL を採用して良かったこと
• minne web は Ruby on Rails 製のアプリケーション
• ※ Web フロント刷新中
• Web は2011年に rails new され爆誕
• iOS は2012年に爆誕
• Android は2013年に爆誕
※ Initial commit された年であってリリース年と異なる可能性があります
Web API の開発はサーバーサイド(Web)のエンジニアがほとんど担当
クライアントサイドのエンジニアが一から Web API の開発に参画する機会・体制は
あまりなかった
minne の歴史(ざっくり)
Slide 53
Slide 53 text
53
GraphQL を採用して良かったこと
以前の Web API 開発スタイル
Web API 開発者 Web API 利用者
設計
実装
実装
検証
完成 完成
Web API の実装が
完了していないと利用者
は実装を始められない
• API の実装がある程度進まない
とクラアントの実装に着手しづら
い
• 設計を開発者に委ねている 作り
直しも起こり得る
• 単方向的な関わり方
❌
⭕
WEB+DB PRESS Vol.108 第1章 スキーマ駆動開発とは何か より
Slide 54
Slide 54 text
54
GraphQL を採用して良かったこと
• 各プラットフォームから1名ずつ代表者決めて
「GraphQL会」発足
• サーバーサイド、iOS、Android、Webフロント
• 今後の Web API 開発について
• 新規開発は基本的に GraphQL API を使う
• 大まかな開発フロー
• GraphQL スキーマを実装する人はサーバサイドのエンジニアに限定しない
• スキーマレビューのルール
エラーハンドリング、ページネーション、命名規則などなど
…
GraphQL 導入するにあたって
56
GraphQL を採用して良かったこと
現在の Web API の開発スタイル
Web API 開発者 Web API 利用者
スキーマ設計
実装 実装
検証
設計 設計
⭕
❌
Web API 開発者 Web API 利用者
設計
実装
実装
検証
完成 完成
Web API の実装が完了
していないと利用者は実
装を始められない
❌
⭕
Web API の実装を
待たずに利用者も 実
装を始められる
WEB+DB PRESS Vol.108 第1章 スキーマ駆動開発とは何か より