Upgrade to Pro — share decks privately, control downloads, hide ads and more …

代数的データ型を活用したGraphQLスキーマの設計

 代数的データ型を活用したGraphQLスキーマの設計

【3/24@オンライン開催】エイチーム×レバレジーズ フロントエンド勉強会
https://ateam.connpass.com/event/276968/

での発表資料

# 技術

GraphQL, TypeScript, ADT, 代数的データ型, Union type, Apollo Client, エラーハンドリング

More Decks by レバレジーズTechアカウント

Other Decks in Technology

Transcript

  1. 代数的データ型を活用した
    GraphQLスキーマの設計
    レバレジーズ株式会社 野中柊
    2023/03/21

    View Slide

  2. GraphQLのエラーハンドリングでつらいところ

    View Slide

  3. HTTPステータスコードが200 OKで返される

    View Slide

  4. エラーがすべてerrors内に格納される

    View Slide

  5. Requiredなフィールドでもエラーとなると
    nullで渡ってくる

    View Slide

  6. クライアントライブラリによって挙動が違う

    View Slide

  7. ApolloClient
    - ApolloErrorにラップされる
    - クエリに含まれるフィールドの一部がエラーを
    起こすとクエリ全体が失敗する
    - errorPolicyで変更可能
    https://www.apollographql.com/docs/react/data/error-handling/#graphql-error-policies

    View Slide

  8. Relay
    エラーにアクセスできない!
    公式がエラーにアクセスしたかったらフィールドの結
    果にエラーを含めろと言及している
    https://relay.dev/docs/guided-tour/rendering/error-states/#accessing-errors-in-graphql-responses

    View Slide

  9. urql
    - CombinedErrorにラップされる
    - ApolloErrorと同じような構造
    - クエリに含まれるフィールドの一部がエラーを
    起こしてもそれ以外のフィールドは値にアクセ
    スできる
    https://formidable.com/open-source/urql/docs/basics/errors/

    View Slide

  10. スキーマからどんなエラーが
    返されるのかが読み取れない

    View Slide

  11. スキーマからどんなエラーが返されるのかが読み取れない
    - このスキーマで返されうるエラーは?

    View Slide

  12. スキーマからどんなエラーが返されるのかが読み取れない
    - このスキーマで返されうるエラーは?
    - ValidationFailed
    - EmailDuplicated
    - PasswordNotConfirmed

    View Slide

  13. スキーマからどんなエラーが返されるのかが読み取れない
    - このスキーマで返されうるエラーは?
    - ValidationFailed
    - EmailDuplicated
    - PasswordNotConfirmed
    返されそうなだけで本当に返されるかは分からない
    (重複OKなシステムかもしれない)

    View Slide

  14. 実装を自分の目で確かめるしかない

    View Slide

  15. それ以外にも...

    View Slide

  16. DatabaseConnectionClosed
    ConnectionTimeout
    SQLError
    OutOfMemory

    View Slide

  17. じゃあどうするか?

    View Slide

  18. 代数的データ型を活用して
    スキーマの表現力を強化しよう!

    View Slide

  19. 代数的データ型とは?

    View Slide

  20. 代数的データ型とは?
    - データ型の一種で、既存のデータ型を組み合わせて新しいデータ型を定義する
    ための機能
    - 大きく分けて直和型(sum type)と直積型(product type)からなる

    View Slide

  21. View Slide

  22. View Slide

  23. View Slide

  24. DatabaseConnectionClosed
    ConnectionTimeout
    SQLError
    OutOfMemory

    View Slide

  25. ハンドリングすべきアプリケーションエラーとシス
    テムエラーを区別する

    View Slide

  26. - このスキーマで返されうるエラーは?
    - ValidationFailed
    - EmailDuplicated
    - PasswordNotConfirmed
    ハンドリングすべきエラーを区別する
    → アプリケーションエラー。
    ハンドリングしてユーザーに適切な
    アクションをとってもらうべき

    View Slide

  27. DatabaseConnectionClosed
    ConnectionTimeout
    SQLError
    OutOfMemory
    →システムエラー。ユーザーにはどうしようもない

    View Slide

  28. ハンドリングすべきアプリケーションエラーを
    スキーマで表現する

    View Slide

  29. View Slide

  30. 型生成ライブラリを使うと__typenameを
    タグとしたタグ付きユニオン型が生成されるので
    網羅性チェックがしやすくなる
    →実行時エラーを減らせる

    View Slide

  31. View Slide

  32. __typenameはGraphQL specificationで
    定義された標準のメタフィールドなので
    依存しても問題無い

    View Slide

  33. 是非快適なスキーマ設計を!

    View Slide

  34. 参考文献
    - Production Ready GraphQL
    - https://book.productionreadygraphql.com/
    - GraphQL Specification
    - https://spec.graphql.org/June2018/
    - GraphQLスキーマ設計の勘所
    - https://speakerdeck.com/yukukotani/graphql-schema-design-practice

    View Slide