💯

Production Ready GraphQLはGraphQLを採用するなら必ず読んでおきたい良書

2022/03/02に公開

https://book.productionreadygraphql.com/

タイトルのとおりです。この本を読まずにGraphQLについての記事を書いたりしツイートしてたのが恥ずかしいくらいに良質なプラクティスが記載されています。GraphQLを採用して悩むことのほとんどはこの本に書いてあるくらいな印象で、この本を読むと効率よくGraphQLを使った開発の品質を向上できると思います。

どんな人が書いた本なのか

著者はMarc-André Girouxという方で、GitHubとShopifyに勤務しGraphQL APIを開発する仕事をしていたと書籍に書いてあります。GraphQLをやってる人ならこの時点でもう刺さったかもしれませんが、どちらの企業もGraphQLを採用していることで有名です。GraphQLスキーマを設計する上でGitHubやShopifyのスキーマや記事を参考にする方も多いのではないでしょうか。その両方で働いてたという時点で納得の説得力です。GraphQLに関する動画や記事を見たことある方もいるかもしれません。
https://www.youtube.com/watch?v=pJamhW2xPYw

どんな人向けの本なのか

GraphQLの入門書ではありません。初めの方にさらっとGraphQL入門の章はありますが、それ目当ての方は別の書籍などのほうが良いと思います。GraphQLへの入門が一通り済んでプロダクションに採用するくらいのフェーズに読むのが良いと思います。少ないとは思いますがGraphQLを使った開発を何年もやっていて設計や運用に特に迷いもないという上級者的な方には向かないかもしれません。

どんな本なのか

著者のGitHubとShopifyでの経験から導き出されたベストプラクティスがぎゅうぎゅうに詰まっている本です。サイトにメールアドレスを入力するとフリーチャプターがダウンロードできますが、載っているのはGraphQL入門の章の一部でこの本の魅力である経験豊富な著者が書くプラクティスは残念ながら載っていません。

目次の抜粋

サイトにも載っている目次から一部を抜き出して多少肉付けした日本語で並べてみます。おそらくGraphQLやった人はとても刺さるリストになると思います。

https://book.productionreadygraphql.com/toc.html

スキーマ設計

  • よいAPIとはどんなものか?
  • クライアントファーストに設計する
  • 命名
  • スキーマの表現力を活用する
  • 汎用的なほうがいいのか、ユースケースに特化したほうがいいのか
  • Relay Specにどこまで追従すべきか
  • Typeを再利用することのメリットとデメリット
  • Nullableにすべき場合とNon Nullにすべき場合
  • InterfaceとUnion typeの使い分け
  • Mutationの設計
  • オペレーションの粒度
  • エラー設計
    • エラーを分類する
    • エラーをスキーマに落とし込む
  • 非同期的な振る舞い
  • データドリブンなスキーマ、ユースケースドリブンなスキーマ

GraphQLサーバーの実装

  • コードファーストか、スキーマファーストか
  • Resolverの設計、どこにドメインロジックを書くべきか
  • スキーマのモジュール化
  • テスト

セキュリティ

  • 不正なリクエストを検出する: Complexity、実行時間、Query Depth
  • 認証、認可
  • Persisted Queries

パフォーマンスとモニタリング

  • RESTと異なるモニタリングをどう行うか
  • N+1問題とDataloader
  • キャッシュ: クライアントサイド、ゲートウェイ、Resolver/Objectレベル

分散アーキテクチャにおけるGraphQL

  • API GatewayとしてのGraphQL
  • BFFとしてのGraphQL
  • マイクロサービス間の通信

この他にも運用ワークフロー、バージョニング、ドキュメンテーション、他のAPIスタイルからの移行など実践的な情報がたくさん載っています。

まとめ

これまで自分なりに経験したり、ネット上から集めて構築したつもりのプラクティスがほとんど書いてあるような本でした😇
もしGraphQLを採用しているチームに所属したとしてこの本を全員、少なくともリードする人だけでも読んでるのとそうでないのではすごく差が出ると思います。超オススメです。

Discussion