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

STORES で GraphQL について考えた話

ta-chibana
August 27, 2020

STORES で GraphQL について考えた話

hey × Da Vinci Studio
〜プロダクトの成長を支えている裏側(技術と組織)〜
https://hey.connpass.com/event/181259/

ta-chibana

August 27, 2020
Tweet

More Decks by ta-chibana

Other Decks in Technology

Transcript

  1. GraphQL とは? • Facebook によって開発された API のためのクエリ言語 • スキーマを定義することで API

    の構造を型付けできる • データの取得・操作をクエリによって行う
  2. GraphQL とは? # クエリ query { items { id name

    categories { id name } } users { id email name } } ネストしたデータや 異なるデータを1度のリクエストで 取得することが可能 # レスポンス { "data": { "items": [ { "id": 1, "name": "Nice Book", "categories": [ { "id": 1, "name": "Book" } ] } ], "users": [ { "id": 1, "email": "[email protected]", "name": "山田太郎" } ] } }
  3. GraphiQL 等のクライアントアプリが便利 • GraphiQL … GraphQL API 用の API クライアントアプリ

    • ドキュメントの表示やクエリの実行が可能なツール • クエリの補完が効く • 動作確認に便利!
  4. GraphQL だと 一覧 query { items { id name status

    images(first: 1) { url } } } 詳細 query { item(id: “123”) { id name status desription price images { url } } }
  5. GraphQL だと 一覧 query { items { id name status

    images(first: 1) { url } } } 詳細 query { item(id: “123”) { id name status desription price images { url } } } 詳細では画像は 全件取得 一覧では 画像は1件のみ
  6. GraphQL だと 一覧 query { items { id name status

    images(first: 1) { url } } } 詳細 query { item(id: “123”) { id name status desription price images { url } } } 説明と価格は 詳細でのみ必要 説明と価格は 一覧では不要
  7. エンドポイントに関する悩みが減る REST GET /items GET /items/123 POST /items PUT /items/123

    DELETE /items/123 GraphQL POST /graphql 取得するリソースは クエリで指定する
  8. GET /item_info/123 GET /item_edit/123 GET /item_edit_info/123 GET /items/123/edit エンドポイントに関する悩みが減る REST

    # ステータス変更は? PUT /items/123 PATCH /items/123 PUT /items/123/status # アイテム詳細は? GET /items/123 # 必要なデータが増えてきた GET /item_detail/123
  9. GET /item_info/123 GET /item_edit/123 GET /item_edit_info/123 GET /items/123/edit # アイテムの検索は?

    GET /items GET /items/search GET /search_items POST /items/search エンドポイントに関する悩みが減る REST # ステータス変更は? PUT /items/123 PATCH /items/123 PUT /items/123/status # アイテム詳細は? GET /items/123 # 必要なデータが増えてきた GET /item_detail/123
  10. GET /item_info/123 GET /item_edit/123 GET /item_edit_info/123 GET /items/123/edit # アイテムの検索は?

    GET /items GET /items/search GET /search_items POST /items/search # バージョン管理は? # する?しない? # 本当に必要? # バージョン上げるタイミングは? # v1, v2 の並行運用... エンドポイントに関する悩みが減る REST # ステータス変更は? PUT /items/123 PATCH /items/123 PUT /items/123/status # アイテム詳細は? GET /items/123 # 必要なデータが増えてきた GET /item_detail/123
  11. GET /item_info/123 GET /item_edit/123 GET /item_edit_info/123 GET /items/123/edit # アイテムの検索は?

    GET /items GET /items/search GET /search_items POST /items/search # バージョン管理は? # する?しない? # 本当に必要? # バージョン上げるタイミングは? # v1, v2 の並行運用... エンドポイントに関する悩みが減る REST # ステータス変更は? PUT /items/123 PATCH /items/123 PUT /items/123/status # アイテム詳細は? GET /items/123 # 必要なデータが増えてきた GET /item_detail/123 現実は難しい
  12. エンドポイントに関する悩みが減る • GraphQL の場合は `POST /graphql` だけなので HTTP メソッド・ URL

    の設計は不要に • 多数のエンドポイントを管理しなくて良くなる • フィールドへの命名は必要だが、 取得するデータはクライアントで指定できるので 比較的シンプルな命名で済む
  13. 現状どう対応している? • エラーコードを返し、エラーの説明をスキーマに含めている ◦ errors.extensions に code を含めて返す ◦ フィールドやオブジェクトの定義に

    description を 設定できるので、そこにエラーの説明を書く • 気になる点 ◦ スキーマ管理されないので型の恩恵にあずかれない ◦ 人は書かなくても良いものは忘れてしまう
  14. OpenAPI と比較 OpenAPI 1. スキーマを決める 2. バックエンド・フロントエンド それぞれで並行して実装 3. 結合

    GraphQL(graphql-ruby) 1. バックエンド実装 2. スキーマを生成する 3. フロントエンド実装
  15. OpenAPI と比較 OpenAPI • 事前にスキーマを決めるので フロントエンドと並行して 開発できる • スキーマ定義と実装が 分かれてしまう

    GraphQL(graphql-ruby) • スキーマは実装から生成するので 実装と定義のズレがなく、 定義に従って実装する必要もない • スキーマを得るには実装する 必要があるため、並行して 作業できない