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
GraphQL スキーマ設計基本方針の案 その1
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
daichitakahashi
September 12, 2023
Technology
0
130
GraphQL スキーマ設計基本方針の案 その1
どこかでつかったGraphQLスキーマ設計資料
daichitakahashi
September 12, 2023
Tweet
Share
More Decks by daichitakahashi
See All by daichitakahashi
GraphQL スキーマ設計基本方針の案 その2
daichitakahashi
0
300
GraphQL スキーマ設計基本方針の案 その3
daichitakahashi
0
160
Other Decks in Technology
See All in Technology
量子クラウドサービスの裏側 〜Deep Dive into OQTOPUS〜
oqtopus
0
150
SREのプラクティスを用いた3領域同時 マネジメントへの挑戦 〜SRE・情シス・セキュリティを統合した チーム運営術〜
coconala_engineer
2
780
Amazon Bedrock Knowledge Basesチャンキング解説!
aoinoguchi
0
160
旅先で iPad + Neovim で iOS 開発・執筆した話
zozotech
PRO
0
100
SREチームをどう作り、どう育てるか ― Findy横断SREのマネジメント
rvirus0817
0
350
Claude_CodeでSEOを最適化する_AI_Ops_Community_Vol.2__マーケティングx_AIはここまで進化した.pdf
riku_423
2
610
GitHub Issue Templates + Coding Agentで簡単みんなでIaC/Easy IaC for Everyone with GitHub Issue Templates + Coding Agent
aeonpeople
1
260
Cosmos World Foundation Model Platform for Physical AI
takmin
0
980
22nd ACRi Webinar - ChipTip Technology Eric-san's slide
nao_sumikawa
0
100
私たち準委任PdEは2つのプロダクトに挑戦する ~ソフトウェア、開発支援という”二重”のプロダクトエンジニアリングの実践~ / 20260212 Naoki Takahashi
shift_evolve
PRO
2
210
コンテナセキュリティの最新事情 ~ 2026年版 ~
kyohmizu
6
2.3k
AzureでのIaC - Bicep? Terraform? それ早く言ってよ会議
torumakabe
1
610
Featured
See All Featured
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
53
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.3k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
350
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
58
50k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Agile that works and the tools we love
rasmusluckow
331
21k
Test your architecture with Archunit
thirion
1
2.2k
How Software Deployment tools have changed in the past 20 years
geshan
0
32k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
150
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
61
52k
Transcript
GraphQL "スキーマ設計基本方針"の案 その1
IDは型を超えてユニークなもの とする
リクエストユーザーのユーザー情報を取得するクエリがあると する。
レスポンス IDに型名と主キーの情報を入れることで、オブジェクトと1:1対 応するIDを作ることができる。 IDをURLの形にしている例があったので参考に Base64エンコードしているものもよくある
Node interface, Query.node を実装する
Node interface ユニークなIDが取れる id フィールドをもつインターフェース を Node インターフェースとする。
Query.node ユニークなIDから、対応するオブジェクト(ノード)を取得す る。
先ほど取得したユーザーのIDを使って、ユーザー情報を取得す る。
レスポンス IDに紐づいたデータの型が User と一致したので、 ... on User でセレクトしたフィールドが取れる。
IDやnodeクエリをどのように 活用するか?
ユーザーが自分のユーザー情報を取得する OK
管理者がユーザー一覧を取得する
None
一覧から選択したユーザーの情報を取得する "任意のユーザー情報を取得するクエリ"が不要になる
さらにユーザーに紐づいた情報を辿る ユーザーに紐づいているメールアカウント(複数可)を取得す る
None
None
さらにMailAccountの詳細を取得する
None
1 2 3 5 4 6
ユニークなIDとnodeクエリがあると 何がうれしいか?
GraphQLでは、オブジェクト同士が関連づけられたネットワー ク(グラフ)を表現し、その関連付けを辿ることでデータにア クセスする。
ユーザー一覧を取得 ユーザーを選択してその詳細情報を確認 さらにそのユーザーが使うメールアカウントの詳細情報 を確認... 前回のクエリで取得したIDとnodeクエリによって グラフの探索を再開する。
1 2 3 5 4 6
グラフを上手に探索していくためには、オブジェクトのフィー ルドから関連するオブジェクトにアクセスできるのでなければ ならない ↓ User.mailAccounts: [MailAccount] ↓ オブジェクト同士の関連付けを型レベルで記述する強制力とな る
その1
None
その2
いずれも、UserとMailAccountの関連付けが型で表現されて いない 1つ目については2回のリクエストが必要、REST APIと変わ らない
None
ルートフィールドでは、テナン トやサービス全体に関わる情報 を取れるようにする
ルートとなる型 = Query , Mutation , Subscription ここで言うルートフィールド = node
, viewer , ...
先ほどの例… Query.node とinline fragmentsを使用することで、 Query.user のようなクエリを実装しなくても任意のユーザ ー情報が取れるようになっていた。 では、Queryにはほかにどのようなフィールドを生やすことに なるのか。
テナントやサービス全体に関わる情報 たとえば、たぶん、こんな感じになる…?
エラー発生時のレスポンスに注 意する
GraphQLでのエラーレスポンスは以下のような形になる。
エラーが発生したフィールドの値は null になっている それまでに解決できた値(username)は取得できている extentions に任意の情報を持たせることができる(エラ ーコード)
どんなフィールドを Non-Nullにするか
先ほどの例では、ユーザーに紐づいた2つのメールアカウント のデータ取得に失敗し、 "mailAccounts": [null, null] が返っていた。 もし User.mailAccounts の型が [MailAccount!]
で、2 つのうち1つのメールアカウント取得に失敗するとどうなる か…?
こうなる
仕様書に書いてある。 https://spec.graphql.org/June2018/#sec-Errors-and- Non-Nullability https://spec.graphql.org/June2018/#sec-Combining- List-and-Non-Null Since Non-Null type fields cannot
be null, field errors are propagated to be handled by the parent field. If the parent field may be null then it resolves to null, otherwise if it is a Non-Null type, the field error is further propagated to it’s parent field.
Non-Null型のフィールドはnullになることができないため、 フィールドエラーは親フィールドで処理されるように伝播し ます。親フィールドがnullである可能性がある場合、nullに 解決されます。それ以外の場合、Non-Null型である場合、 フィールドエラーはさらにその親フィールドに伝播されま す。
値の解決でエラーが発生する可能性があるフィールドは、 Nullableにしておきましょう。 そうすることで、取得できた値はそのまま使えます(F/Eがそ れを使うかどうかは別の話)。
エラーコードはenumで定義する
スキーマで定義することで、F/EとB/Eの認識の相違を防ぐこ とができる サーバーにしかわからない補足情報がある場合、それもスキ ーマで型定義しておくと良さそう(もしあれば)
None
GraphQL "スキーマ設計基本方針"の案 その2 enumはUPPER_SNAKE_CASEにする MutationのInput, Payloadは input や type としてまと
める complexityを計算して、APIサーバーを保護する 保護しやすいスキーマ設計 本番環境ではintrospection, GraphiQLを無効化する