15分で分かった気になるGraphQL

7b41309d419e0ac011d14774067b0be1?s=47 s-ichikawa
March 29, 2019
1.4k

 15分で分かった気になるGraphQL

Presented at PHPer Kaigi 2019

7b41309d419e0ac011d14774067b0be1?s=128

s-ichikawa

March 29, 2019
Tweet

Transcript

  1. 7.

    Appで必要なデータとResponseのデータ構造の乖離 “We were frustrated with the differences between the data

    we wanted to use in our apps and the server queries they required.” 9/14/2015 by Lee Byron https://graphql.org/blog/graphql-a-query-language/
  2. 9.

    Overfetching /user/1234 Response { “user” { “id”: 1234, “name”: “s-ichikawa”,

    “image_uri”: “https://xxx/img/1234”, “address”: “東京都A区XYZ”, “birthday”: “1986/08/29”, “gender”: “male”, ... } }
  3. 10.

    Overfetching /user/1234 Response { “user” { “id”: 1234, “name”: “s-ichikawa”,

    “image_uri”: “https://xxx/img/1234”, “address”: “東京都A区XYZ”, “birthday”: “1986/08/29”, “gender”: “male”, ... } } 必要なのはここだけ
  4. 16.

    Underfetching /user_for_X/1234 Response { “user” { “id”: 1234, … “friends”:

    [ {“id”:2345, “name”:”bさん”, “image_uri”: “https://xxx/img/2345”}, {“id”:3456, “name”:”cさん”, “image_uri”: “https://xxx/img/3456”}, ] } }
  5. 21.

    GraphQLはどう課題解決するか Response {“data”: { “user”: { “name”: “aさん”, “img”: “https://xxx/img/2345”,

    “friends”: [ { “name”:”bさん”, “img”: “https://xxx/img/2345” } ] }, “news”: { “title”: “awesome GraphQL”, “link”: “https://xxx/news/1” } }} /graphql
  6. 24.

    GraphQLの弱み - いくつかの操作はRESTより面倒になる場合がある - ファイルアップロード - エラーハンドリング - モニタリング -

    Cache - パフォーマンス問題 - one-to-many、many-to-manyなデータを取得するような場合、サーバ側の 実装によってはN+1問題が発生する可能性がある
  7. 26.

    3つのOperation - Query - 情報を取得するために使用される - SQLでいうSELECT - Mutation -

    情報を更新するために使用される - SQLでいうINSERT,UPDATE,DELETE - Subscription - 情報の変化をリアルタイムに取得するために使用される
  8. 27.

    クエリ言語とスキーマ - スキーマ - GraphQL APIの仕様を定義するためのもの - どのような処理ができてどのようなレスポンスが返るかを 決める -

    スキーマが決まるとDocsの自動生成や、Mockの作成が 可能になる - クエリ言語 - クライアントがGraphQL APIにリクエストするための言語 - PHPからDBを操作する際のSQLのようなイメージ
  9. 30.

    Schema Design - レスポンスとして得たい型を定義する - 型名 - フィールド - 定義した型を得る為のオペレーションを定義する

    - 必要に応じてENUMやリクエストパラメータとして送信するた めの型(input型)なども定義できる
  10. 34.

    Implements - API - API側は採用する言語やライブラリに寄って実装方法は様々 - GraphQL処理系の実装は難易度が高いので、基本的には何かしらライブラリ を導入することになる - PHPではwebonyx/graphql-phpや

    - Laravelでやりたいならnuwave/lighthouse辺りが良さそう - オペレーションや型を解決する処理をResolverと呼び、ビジネ スロジックやデータアクセス処理を行う - Resolverの集合がGraphQL APIとも言える
  11. 36.
  12. 39.

    GraphQLとは - REST APIの問題を解決する為に開発されたクエリ言語 - 仕様は大きく分けてクエリとスキーマで構成される - 3種類のオペレーションがある - Query

    - Mutation - Subscription - 型付けされるため、クライアントとAPI間で型安全なやり取りが 可能になる - RESTを選択する方が適切なケースもある