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.2k
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
540
商品監視を支える技術.key.pdf
ichikawa
0
90
SendGridで人生変わった
ichikawa
2
2.2k
Laravel with SendGrid
ichikawa
0
2.8k
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
172
14k
Navigating Team Friction
lara
183
15k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
46
2.3k
Fontdeck: Realign not Redesign
paulrobertlloyd
83
5.4k
Six Lessons from altMBA
skipperchong
27
3.6k
Building a Scalable Design System with Sketch
lauravandoore
461
33k
RailsConf 2023
tenderlove
29
1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
21
2.5k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
100
18k
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!