「初めてのGraphQL」の原書を読んだ

2018年に出版された「初めてのGraphQL」の原書である「Learning GraphQL」を読みました。

なぜ、読んだのか

新卒研修で一度読了したのですが、社内のエンジニアから日本語訳が出版される前に読書会を開かないかと誘われました。プロダクトコードで、もっとクライアントにわかりやすいSchemaに改善したい思い二つ返事で承諾しました。

実装した後で読む返すと思った以上に学ぶことが多く既にGraphQLを触っている人にもお勧めできる書籍です。

初めてのGraphQL ―Webサービスを作って学ぶ新世代API

初めてのGraphQL ―Webサービスを作って学ぶ新世代API

  • 作者: Eve Porcello,Alex Banks,尾崎沙耶,あんどうやすし
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2019/11/13
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

目次

  • 第1章 Welcome to GraphQL

  • 第2章 Graph Theory

  • 第3章 The GraphQL Query Language

  • 第4章 Designing a Schema

  • 第5章 Creating a GraphQL APIfield

  • 第6章 GraphQL Clients

  • 第7章 GraphQL in the Real World

各章で気になったことをメモとして残します。

Welcome to GraphQL

  • GraphQLは、HTTPに依存しない
  • クエリは、必要なデータのみを取得する
  • GraphQLは、クライアント視点で考えられ生まれた
  • GraphQLは単なる仕様である

1章では、GraphQLがどのような思想で生まれたかが語られています。また、RESTの比較があります。RESTは、GraphQLに変わるものと単純に考えてはいけません。GraphQLが不得意な部分はREST APIで補う必要があり、管理コストを最小限にしながら両方の恩恵を受ける構成を考える必要があると思いました。

Graph Theory

2章では、GraphQLの基礎となるグラフ理論について解説がありました。オイラーが、ケーニヒスベルクの橋をグラフ図にし問題を単純化しているのが天才なのだなと思いました。

GraphQLでは、複雑なクエリを単純化するようにスキーマを定義しなけれらばならないと述べられています。

The GraphQL Query Language

Fragmentsは、冗長なクエリをまとめるために利用できます。しかし、実際のプロダクトではフロントのコンポーネントによって取得したいデータが微妙に異なるため、上手くまとめることが難しいのではないかと思いました。意味のまとまりに対して命名を与えるためにFragmentsを利用すると便利ではないかという思っています。

Union型では、inline fragmentsを利用することでよりシンプルなクエリとなります。

クエリ変数の$など、GraphQL-SpecのPunctuatorsで規格化されている表現を抑えておく必要があると思いました。

Designing a Schema

  • 良いスキーマにするには、ドメイン知識を非エンジニアも含め共有しユビキタス言語を持つ必要がある
  • 1対多の関係は、ルートタイプにあることが多い
  • 可能な限り無向グラフにする(双方向の関係)
  • 多対多の関係は、through typeと呼ばれるスキーマをドメインに基づいて命名するとよい
  • interfaceは、共通するfieldを全て含めて定義する
  • fieldが大きく異なるならUnion、一つや二つならばinterfaceにする
  • mutationは動詞であるべきだ
  • 技術的に、queryとmutationは同義

4章は、GraphQLを利用したことがある人にとって最も学びの多い章だと思います。 この章を読むためだけでも購入する価値があります。

Creating a GraphQL API & GraphQL Clients

5と6章は、実務でGraphQLを利用しているため飛ばすことにしました。

コードはGitHubに公開されています。7章のコードをcloneするとApollo Engineを登録する必要があるため、chapter-06がよいでしょう。

GitHubから必要なフォルダーのみをcloneする手順は以下の通りです。

$ git init
$ git config core.sparsecheckout true
$ git remote add origin https://github.com/MoonHighway/learning-graphql.git
$ echo learning-graphql/chapter-06 > .git/info/sparse-checkout
$ git pull origin master

DB_HOSTを設定するためにMongoDBをMacにinstallします。

以下の手順でMongoDBのデータベースを作成し、.envDB_HOST=mongodb://localhost:27017/graphql-learning-photo-share-apiと設定します。

$ brew tap mongodb/brew
$ brew install mongodb/brew/mongodb-community@4.0

==> Installing mongodb-community@4.0 from mongodb/brew
~~~~
If you need to have mongodb-community@4.0 first in your PATH run:
  echo 'export PATH="/usr/local/opt/mongodb-community@4.0/bin:$PATH"' >> ~/.bash_profile
  ~~~
  brew services start mongodb/brew/mongodb-community@4.0
  ~~~
==> Summary
 /usr/local/Cellar/mongodb-community@4.0/4.0.13: 21 files, 221.8MB, built in 11 seconds

$ export PATH="$PATH:/usr/local/Cellar/mongodb-community@4.0/4.0.13/bin"
$ mongo
> use graphql-learning-photo-share-api

あとは、書籍の指示に従って以下を取得すると動かすことができます。

CLIENT_ID=<YOUR_GITHUB_CLIENT_ID>
CLIENT_SECRET=<YOUR_GITHUB_CLIENT_SECRET>

GraphQL in the Real World

7章では、ファイルのアップロードやSubscriptionsの実装を行います。実務では、まだ利用機会がないので必要に応じて読み返したい章でした。

RESTからGraphQLにどう切り替えていくのかという痒い所に手が届く解説が印象深かったです。

  • コンポーネント単位で徐々に
  • RESTのエンドポイントを新規開発しない
  • RESTをメンテナンスしない

などでした。スキーマを作り直したいので、同じような手法で不必要なfieldをdeprecatedにしてから徐々に移行していくのが良いのではないかと考えました。

まとめ

GraphQLを実装した人や、また単に気になる人にもオススメの書籍です。 日本語版では、GraphQLで有名な人が巻末付録を書いているようなのでチェックしたいです。

初めてのGraphQL ―Webサービスを作って学ぶ新世代API

初めてのGraphQL ―Webサービスを作って学ぶ新世代API

  • 作者: Eve Porcello,Alex Banks,尾崎沙耶,あんどうやすし
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2019/11/13
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る