代数的データ型を活用したGraphQLスキーマの設計
by
Tech Leverages
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
代数的データ型を活用した GraphQLスキーマの設計 レバレジーズ株式会社 野中柊 2023/03/21
Slide 2
Slide 2 text
GraphQLのエラーハンドリングでつらいところ
Slide 3
Slide 3 text
HTTPステータスコードが200 OKで返される
Slide 4
Slide 4 text
エラーがすべてerrors内に格納される
Slide 5
Slide 5 text
Requiredなフィールドでもエラーとなると nullで渡ってくる
Slide 6
Slide 6 text
クライアントライブラリによって挙動が違う
Slide 7
Slide 7 text
ApolloClient - ApolloErrorにラップされる - クエリに含まれるフィールドの一部がエラーを 起こすとクエリ全体が失敗する - errorPolicyで変更可能 https://www.apollographql.com/docs/react/data/error-handling/#graphql-error-policies
Slide 8
Slide 8 text
Relay エラーにアクセスできない! 公式がエラーにアクセスしたかったらフィールドの結 果にエラーを含めろと言及している https://relay.dev/docs/guided-tour/rendering/error-states/#accessing-errors-in-graphql-responses
Slide 9
Slide 9 text
urql - CombinedErrorにラップされる - ApolloErrorと同じような構造 - クエリに含まれるフィールドの一部がエラーを 起こしてもそれ以外のフィールドは値にアクセ スできる https://formidable.com/open-source/urql/docs/basics/errors/
Slide 10
Slide 10 text
スキーマからどんなエラーが 返されるのかが読み取れない
Slide 11
Slide 11 text
スキーマからどんなエラーが返されるのかが読み取れない - このスキーマで返されうるエラーは?
Slide 12
Slide 12 text
スキーマからどんなエラーが返されるのかが読み取れない - このスキーマで返されうるエラーは? - ValidationFailed - EmailDuplicated - PasswordNotConfirmed
Slide 13
Slide 13 text
スキーマからどんなエラーが返されるのかが読み取れない - このスキーマで返されうるエラーは? - ValidationFailed - EmailDuplicated - PasswordNotConfirmed 返されそうなだけで本当に返されるかは分からない (重複OKなシステムかもしれない)
Slide 14
Slide 14 text
実装を自分の目で確かめるしかない
Slide 15
Slide 15 text
それ以外にも...
Slide 16
Slide 16 text
DatabaseConnectionClosed ConnectionTimeout SQLError OutOfMemory
Slide 17
Slide 17 text
じゃあどうするか?
Slide 18
Slide 18 text
代数的データ型を活用して スキーマの表現力を強化しよう!
Slide 19
Slide 19 text
代数的データ型とは?
Slide 20
Slide 20 text
代数的データ型とは? - データ型の一種で、既存のデータ型を組み合わせて新しいデータ型を定義する ための機能 - 大きく分けて直和型(sum type)と直積型(product type)からなる
Slide 21
Slide 21 text
No content
Slide 22
Slide 22 text
No content
Slide 23
Slide 23 text
No content
Slide 24
Slide 24 text
DatabaseConnectionClosed ConnectionTimeout SQLError OutOfMemory
Slide 25
Slide 25 text
ハンドリングすべきアプリケーションエラーとシス テムエラーを区別する
Slide 26
Slide 26 text
- このスキーマで返されうるエラーは? - ValidationFailed - EmailDuplicated - PasswordNotConfirmed ハンドリングすべきエラーを区別する → アプリケーションエラー。 ハンドリングしてユーザーに適切な アクションをとってもらうべき
Slide 27
Slide 27 text
DatabaseConnectionClosed ConnectionTimeout SQLError OutOfMemory →システムエラー。ユーザーにはどうしようもない
Slide 28
Slide 28 text
ハンドリングすべきアプリケーションエラーを スキーマで表現する
Slide 29
Slide 29 text
No content
Slide 30
Slide 30 text
型生成ライブラリを使うと__typenameを タグとしたタグ付きユニオン型が生成されるので 網羅性チェックがしやすくなる →実行時エラーを減らせる
Slide 31
Slide 31 text
No content
Slide 32
Slide 32 text
__typenameはGraphQL specificationで 定義された標準のメタフィールドなので 依存しても問題無い
Slide 33
Slide 33 text
是非快適なスキーマ設計を!
Slide 34
Slide 34 text
参考文献 - Production Ready GraphQL - https://book.productionreadygraphql.com/ - GraphQL Specification - https://spec.graphql.org/June2018/ - GraphQLスキーマ設計の勘所 - https://speakerdeck.com/yukukotani/graphql-schema-design-practice