Chapter 01

はじめに

さき(H.Saki)
さき(H.Saki)
2023.03.07に更新

この本について

ウェブAPIのアーキテクチャとしてメジャーなものはREST APIかと思いますが、近年はGraphQLの形式で自社サービスAPIを公開する例が増えてきています。

リクエストーレスポンスが1:1対応されており取得可能情報が固定されていたREST APIとは異なり、開発者が欲しい情報のみを柔軟に取り出してくることができるGraphQLはクライアント目線からはとても便利なものであり、今後も採用事例が増えていくのではないかと思います。
しかしサーバーサイドの目線に立つと、1つのリクエストパターン(メソッド・パス)に対して決まったハンドラを1つ用意すればよかったRESTに対して、無数のパターンが存在するリクエストクエリに対してどのようにレスポンスを作っていけばいいのかというGraphQLサーバー側のロジックは、知識がないと想像しにくいのではないでしょうか。

そこでこの本では、Goのgqlgenというライブラリを使いGraphQLサーバーを実装する過程を紹介しながら、サーバーサイドGraphQLの一般的な知識も解説していきたいと思います。

本の構成

2章: GraphQLサーバーを動かしてみる

ここではgqlgenに用意されているサンプルアプリを稼働させる様子を紹介します。
また、その過程の中でgqlgenで自動生成させるコードの解説も行います。

3章: 自作のスキーマを使ってGraphQLサーバーを作ろう

前章のような既存のサンプルアプリではなく、自作のGraphQLスキーマからサーバーコードを生成させる過程を紹介します。

4章: リゾルバの実装 - 基本編

この章ではgqlgenにて自動生成されたコードを元に、GraphQLサーバーのコアとなるリゾルバの実装を行います。

5章: カスタムスカラ型の導入

この章ではGraphQLのスキーマ中に定義されたカスタムスカラ型を、どのGoのデータ型に紐付けするかの設定方法を解説します。

6章: リゾルバの実装 - 応用編

この章では、リゾルバを分割することによって、GraphQLの肝となっている「リクエストされたデータのみ取得する」という性質をサーバーサイド側の視点で紐解いていきたいと思います。

7章: N+1問題の回避 - dataloaderの導入

サーバーサイドGraphQLには、リクエストクエリが複雑になり取得するべきオブジェクトの数が増えると、その分だけDBに対して発行するSQL文も増えていくN+1問題という課題がよく知られています。
ここではそれを回避するためにDataloaderというものを導入する様子をお見せします。

8章: クエリ複雑度の制限

GraphQLサーバーでは、サーバーに負荷をかけるようなあまりに複雑なクエリはそもそも実行させないようにする制限をかける場合があります。
この章では、そのクエリ複雑度の計算方法と、それによるクエリ実行制限のかけ方を解説します。

9章: GraphQL特有のミドルウェア

GraphQLサーバーがリクエストを受け取ってレスポンスを返すまでの間の処理には、ミドルウェアによる前後処理を挟める箇所が4箇所存在します。
ここではそのGraphQL特有の4つのミドルウェアについて紹介します。

10章: ディレクティブを利用した認証機構の追加

この章では、ディレクティブというカスタムデコレータを使用しながら、認証機構をGraphQLサーバーに追加する方法を説明します。

11章: GraphQLサーバーから返却されるエラーメッセージ

この章では、GraphQLサーバーからユーザーにレスポンスとして渡せるエラーの構造について解説します。

12章: GraphQLサーバーのテストTips

この章では、サービス層やリゾルバをテストするために便利なモックの作り方と、ゴールデンテストと呼ばれるテスト手法を紹介します。

使用する環境・バージョン

  • OS: macOS Catalina 10.15.7

  • go version go1.19.3 darwin/amd64

  • gqlgen v0.17.22

  • SQLBoiler v4.14.0

  • sqlite3 3.28.0

読者に要求する前提知識

  • Goの基本的な文法の読み書きができること
  • GraphQLのスキーマファイルの読み書きができること
  • GraphQLにリクエストを送るクエリの読み書きができること
  • GitHubに関する基本的な知識を持っていること

サンプルコード

本書で開発・使用するサンプルGraphQLサーバーコードは以下のレポジトリに格納されています。
https://github.com/saki-engineering/graphql-sample