Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
15分で分かった気になるGraphQL
Search
s-ichikawa
March 29, 2019
3
3.1k
15分で分かった気になるGraphQL
Presented at PHPer Kaigi 2019
s-ichikawa
March 29, 2019
Tweet
Share
More Decks by s-ichikawa
See All by s-ichikawa
GraphQL入門
ichikawa
3
1.1k
ReactPHPとの戯れ
ichikawa
0
510
商品監視を支える技術.key.pdf
ichikawa
0
87
SendGridで人生変わった
ichikawa
2
2.2k
Laravel with SendGrid
ichikawa
0
2.8k
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Making the Leap to Tech Lead
cromwellryan
133
9k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.2k
Rails Girls Zürich Keynote
gr2m
94
13k
How to Think Like a Performance Engineer
csswizardry
22
1.2k
GraphQLとの向き合い方2022年版
quramy
44
13k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
BBQ
matthewcrist
85
9.4k
A better future with KSS
kneath
238
17k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
The Language of Interfaces
destraynor
154
24k
Transcript
15分で分かった気になる GraphQL PHPer Kaigi 2019
Profile Twitter: @ichikawa_0829 株式会社メルカリ Backendエンジニア
GraphQLとは
https://developer.github.com/v4/explorer/
RESTの問題を解決するために作られた APIの為のクエリ言語
RESTの問題を解決するために作られた APIの為のクエリ言語
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/
Overfetching Clientのあるページで user情報の - name - image_uri だけ必要
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”, ... } }
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”, ... } } 必要なのはここだけ
Underfetching Clientのあるページで 指定したuserの友達一覧を出したい usersのfriends全員の - name - image_uri が必要
Underfetching /user/1234 Response { “user” { “id”: 1234, … “friends”:
[ 2345, 3456, 4567, 5678 ] } }
Underfetching /user/2345 Response { “user” { “id”: 2345, “name”: “ichikawa_2”,
“image_uri”: “https://xxx/img/2345”, … } }
Underfetching /user/2345 /user/3456 /user/4567 ・ ・ ・
Underfetching /user/2345 /user/3456 /user/4567 ・ ・ ・ Too many round
trip
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”}, ] } }
似たようなエンドポイントの乱立 /user/{id} /user_for_X/{id} /user_for_Y/{id} /user_for_Z/{id} /user_for_admin/{id} …
GraphQLはどう課題解決するか - Appで必要なデータとResponseのデータ構造の乖離 - GraphQLではクエリとレスポンスの構造が似ているため、クエリを見ればレス ポンスの構造を推測しやすい
GraphQLはどう課題解決するか /graphql
GraphQLはどう課題解決するか Request query GetUser { user(id: “1234:) { name img
friends { name img } } news { title link } } /graphql
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
Pros & Cons
GraphQLの強み - データ構造が理解しやすい - 複雑なデータが必要になってもRound Tripが抑えられる - エンドポイント管理が楽 - クライアントとサーバ間で型安全なコミュニケーションが可能
- 豊富な開発ツール類
GraphQLの弱み - いくつかの操作はRESTより面倒になる場合がある - ファイルアップロード - エラーハンドリング - モニタリング -
Cache - パフォーマンス問題 - one-to-many、many-to-manyなデータを取得するような場合、サーバ側の 実装によってはN+1問題が発生する可能性がある
GraphQL Workflow
3つのOperation - Query - 情報を取得するために使用される - SQLでいうSELECT - Mutation -
情報を更新するために使用される - SQLでいうINSERT,UPDATE,DELETE - Subscription - 情報の変化をリアルタイムに取得するために使用される
クエリ言語とスキーマ - スキーマ - GraphQL APIの仕様を定義するためのもの - どのような処理ができてどのようなレスポンスが返るかを 決める -
スキーマが決まるとDocsの自動生成や、Mockの作成が 可能になる - クエリ言語 - クライアントがGraphQL APIにリクエストするための言語 - PHPからDBを操作する際のSQLのようなイメージ
開発の流れ Schema Design Implements Monitoring Schema Client API Product Workflow
Output
with Laravel & Lighthouse https://lighthouse-php.com/
Schema Design - レスポンスとして得たい型を定義する - 型名 - フィールド - 定義した型を得る為のオペレーションを定義する
- 必要に応じてENUMやリクエストパラメータとして送信するた めの型(input型)なども定義できる
Schema Design - with laravel & lighthouse • routes/graphql/schema.graphqlにScheme定義を書く どのクラスがItem型を解決するか
紐付ける
Implements - Client - Client側で必要なデータだけを指定してクエリを作成する - クエリをAPI Serverにリクエストする処理を書く - ResponseをページViewに反映させる処理等を書く
Implements - Client with laravel & lighthouse - 今回は横着して時間がないのでPlaygroundで代用 -
https://github.com/prisma/graphql-playground
Implements - API - API側は採用する言語やライブラリに寄って実装方法は様々 - GraphQL処理系の実装は難易度が高いので、基本的には何かしらライブラリ を導入することになる - PHPではwebonyx/graphql-phpや
- Laravelでやりたいならnuwave/lighthouse辺りが良さそう - オペレーションや型を解決する処理をResolverと呼び、ビジネ スロジックやデータアクセス処理を行う - Resolverの集合がGraphQL APIとも言える
Implements - API with laravel & lighthouse - Schemaで紐付けたResolverクラスを書く
None
Monitoring - GraphQLのモニタリングはRESTの方式をそのまま使えない - エラートラッキング - これまで400系や500系を返していたエラーが発生しても200を返す - そういったエラーをそれぞれどう扱うかを決めて、エラー発生のイベントをトラッ キング
- パフォーマンス - 単一エンドポイントのためクエリ単位で計測する - クエリ単位だけではなくResolver単位のパフォーマンス測定も必要
Conclusion
GraphQLとは - REST APIの問題を解決する為に開発されたクエリ言語 - 仕様は大きく分けてクエリとスキーマで構成される - 3種類のオペレーションがある - Query
- Mutation - Subscription - 型付けされるため、クライアントとAPI間で型安全なやり取りが 可能になる - RESTを選択する方が適切なケースもある
Subscription Directive Architecture SchemaStitching PHPでどう始めるのか Cache Monitoring Authorization Custom Scalar
今日話せなかったこと 様々な開発Tool
Thank You! Enjoy GraphQL!