My Favorite Life

Go there and write simply with golang. Such a person I want to be.

【本メモ】『初めてのGraphQL ―Webサービスを作って学ぶ新世代API』

『初めてのGraphQL ―Webサービスを作って学ぶ新世代API』を読んだので、本メモを公開。

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

読んでみたが、やはり動かしてみないと全体像をイメージして理解できるようにはならないし、 Tips集を読んでいるような印象を受けた。 実装して手を動かしながら、時おり迷った際などに参照しつつ進めるのが良いかもしれない。 ただ書く言語ごとによってまた事情が異なるはずだし、テストなどについても本書には記載があまりないので、 新技術かつ事例もまだ少なく、試行錯誤しながらになると思われる。

type Query {
......
      allUsers(first: Int=50 start: Int=0): [User!]!
}

上の例では first と start のオプショナルな引数を追加しています。また、クライ アントがクエリにこれらの引数を指定しなかった場合はデフォルトの値が使用されるよ うになっています。

ここまでRESTの課題に関して議論してきましたが、多くの組織ではGraphQLと REST を併用していることについても言及しましょう。GraphQL のエンドポイントを 作成し、GraphQL サーバーから REST のエンドポイントへリクエストするというやり 方は、GraphQL の使い方として何ひとつ間違っていません。皆さんの組織に漸進的に GraphQL を導入するための最適な方法です。

可能であれば、GraphQL のサービスは無向グラフにしておくことが望ましいです。

「3章 GraphQLの問い合わせ言語」でGraphQLのイントロスペクション機能について 紹介しました。GraphQL は利用できるクエリに関する情報を提供できます。GraphQL のスキーマを作成するとき、それぞれのフィールドにスキーマの型やフィールドに対す る説明を付加できます。説明を付加することで開発チームメンバーや自分自身、あるい は API のユーザーが API を理解する助けになります。


モックはそれぞれのスキーマ型に対するデフォルト値を出力します。フィールドが文 字列に解決されることが想定される場所では常にデータとして"Hello World"が与えら れます。

お気づきかもしれませんが、クエリとミューテーションの引数の数が多くなってきま した。多数の引数をうまく扱うために入力型を使ってみましょう。入力型は GraphQL のオブジェクト型と似ていますが、引数に対して使用されるものです。

2015 年の 7 月、このチームは最初の GraphQL の仕様を公開し、JavaScript による参 照実装である graphql.js を公開しました。2016 年の 9 月には、GraphQL はテクニカルプ レビュー版を脱しました。つまり、GraphQL は正式に実戦投入できる状態になりまし た。もっとも、Facebook ではこの時点ですでに、数年間 GraphQL を実際に利用してい ました。今日では、GraphQL は Facebook のほぼすべてのデータ取得に利用されてい て、IBM、Intuit、Airbnb ほか多くの企業で実戦投入されています。

一般論としては、含まれている複数の型がまったく異なるものであれば ユニオン型を利用するのがよいでしょう。同様に、複数の型に共通のフィールドがある 場合はインターフェースを利用するほうがよいでしょう。

すでにお気づきかもしれませんが、tags 配列があるのに対して Tag という GraphQL 型はありません。GraphQL ではデータモデルがスキーマの型と正確に一致している必 要はありません。私たちのクライアントは User 型または Photo 型について問い合わせ ることで、あらゆる写真の中でタグ付けされたユーザーと、あらゆるユーザーがタグ付 けされている写真を見つけることができます。Tag 型をクエリする必要はありません。 クライアントがデータを簡単に照会できるようにするために、タグ付けされたユーザー や写真を見つけるリゾルバを実装したのです。

入力型を使用すると、ミューテーションに渡す引数の再利用性が高まり、エラーが起 こりにくくなります。入力型と列挙型を組み合わせる場合、特定のフィールドに指定で きる入力型をより具体的に指定できます。入力型と列挙型は非常に価値があり、一緒 に使用するとさらに向上します。

GraphQLプロジェクトの肝はスキーマをうまく設計することです。よくできた GraphQL のスキーマはフロントエンドとバックエンドチームの間のロードマップと契約 として機能し、ビルドされた製品が常にスキーマに対応することを保証します。