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