なんて美しい夕陽だ🌇

プログラミング、日常、忘れないように書いていきます

GraphQL入門の定番書 -「初めてのGraphQL」を読んだ

数少ない日本語のGraphQL入門書である「初めてのGraphQL」を読んだ!

業務でGraphQLは扱っているものの、体系的に勉強したことはなく知識の抜け漏れがあると感じたので読んでみることにした。情報が古くハンズオンを動かすのは大変そうだったため、前半の概念に関する説明は厚く読んで後半は流し読みした。

読んでみて、GraphQLが生まれた歴史的経緯から、基礎的な概念、実践で利用する上で気をつけるなど網羅的に学ぶことができた。網羅的に学ぶことができるため、自分がわかっている部分とわかっていない部分が明確になった。別のサイトや書籍でハンズオンを終えたあと、改めて概念を学ぶために読むと良さそうだと感じた!

目次

  • 1章 GraphQLへようこそ
    • 1.1 GraphQLとは
      • 1.1.1 GraphQLの言語仕様
      • 1.1.2 GraphQLの設計原則
    • 1.2 GraphQLの誕生
    • 1.3 データ通信の歴史
      • 1.3.1 RPC
      • 1.3.2 SOAP
      • 1.3.3 REST
    • 1.4 RESTの課題
      • 1.4.1 過剰な取得
      • 1.4.2 過小な取得
      • 1.4.3 RESTのエンドポイント管理
    • 1.5 GraphQLの実情
      • 1.5.1 GraphQLのクライアント
  • 2章 グラフ理論
  • 3章 GraphQLの問い合わせ言語
    • 3.1 GraphQL APIの便利なツール
      • 3.1.1 GraphiQL
      • 3.1.2 GraphQL Playground
      • 3.1.3 公開GraphQL API
    • 3.2 GraphQLのクエリ
      • 3.2.1 エッジと接続
      • 3.2.2 フラグメント
    • 3.3 ミューテーション
      • 3.3.1 クエリ変数
    • 3.4 サブスクリプション
    • 3.5 イントロスペクション
    • 3.6 抽象構文木
  • 4章 スキーマの設計
    • 4.1 型定義
    • 4.2 コネクションとリスト
      • 4.2.1 一対一の接続
      • 4.2.2 一対多の接続
      • 4.2.3 多対多の接続
      • 4.2.4 異なる型のリスト
    • 4.3 引数
      • 4.3.1 データのフィルタリング
    • 4.4 ミューテーション
    • 4.5 入力型
    • 4.6 返却型
    • 4.7 サブスクリプション
    • 4.8 スキーマのドキュメント化
  • 5章 GraphQLサーバーの実装
    • 5.1 プロジェクトのセットアップ
    • 5.2 リゾル
      • 5.2.1 ルートリゾル
      • 5.2.2 型リゾル
      • 5.2.3 InputとEnumの使用
      • 5.2.4 エッジと接続
      • 5.2.5 カスタムスカラー型
    • 5.3 apollo-server-express
    • 5.4 コンテキスト
      • 5.4.1 MongoDBのインストール
      • 5.4.2 コンテキストへのデータベースの追加
    • 5.5 GitHub認可
      • 5.5.1 GitHub OAuthのセットアップ
      • 5.5.2 認可プロセス
      • 5.5.3 githubAuthミューテーション
      • 5.5.4 ユーザーの認証
    • 5.6 まとめ
  • 6章 GraphQLクライアントの実装
    • 6.1 GraphQL APIの利用
      • 6.1.1 フェッチリクエス
      • 6.1.2 graphql-request
    • 6.2 Apollo Client
    • 6.3 Apollo ClientとReact
    • 6.4 認可
      • 6.4.1 ユーザー認可
      • 6.4.2 ユーザー識別
    • 6.5 キャッシュ
      • 6.5.1 フェッチポリシー
      • 6.5.2 キャッシュの永続化
      • 6.5.3 キャッシュの更新
  • 7章 GraphQLの実戦投入にあたって
  • 付録A Relay各仕様解説
    • A.1 Global Object Identification
    • A.2 Cursor Connections
    • A.3 Input Object Mutations
    • A.4 Mutations updater

GraphQLの誕生について

GraphQLがFacebookによって作られたことは有名な話だと思うが、どのような課題があって作られたかまでを知っている人は多くはないのではないか(自分は知らなかった)。 当時のFacebookのモバイルアプリはRESTfulなAPIサーバーで構成されていたが、パフォーマンスに課題があり度々クラッシュしていた。そのような性能上の課題とデータ構造の要件を満たす解決策としてGraphQLが生まれた。また、いいね数をリアルタイムで取得するためにsubscription機能が生まれた。
このように技術が生まれた背景を知ることは、思想を知る上でも重要かもしれないと感じた。

GraphQLに関する基本的な説明

GraphQLに関する基本的な説明が網羅されていた。クエリに関する説明では「大学向けのスケジュール管理アプリケーション」など具体的な例が示されておりわかりやすかった。読んでみて、union型やinterfaceを上手く扱えていないと感じ、今後の課題として積んだ。

実践投入にあたって

ここまではGraphQLの良い部分が中心に語られてきたが、実践における課題や気を付けるべきことも記載されていた。 課題の1つとして、GraphQLが柔軟であるがゆえにクライアントが自由にデータを取得できてしまい、それが脆弱性に繋がったり大量のデータをリクエストすることでサーバーリソースを圧迫することが挙げられていた。それに対する解決方法として、リクエスタイムアウトの設定、レスポンスデータ量の制限、クエリの深さを制限、クエリの複雑さ制限などいくつかの方法が提案されていた。

最後に

今回は「初めてのGraphQL」を読んだ。賛否両論ある本書だが、自身の不足している知識を把握する上でも大いに役立った。引き続きGraphQLに関するキャッチアップは続けていこうと思う。