[Golang/React]~MovieApp-GraphQL1:スキーマー駆動開発を取り入れよう!

こんにちは、KOUKIです。

GolangとReactでMovie Appの開発をしています。

今回は、GraphQLの導入を行います。GraphQLはスキーマーを定義して実装することから、スキーマー駆動開発手法を取り入れることができます。

現場ではGraphQLを触ったことはありませんが後々使っていきたいと考えているので、そのメリット・デメリットを探っていきたいですね。

尚、Udemyの「Working with React and Go (Golang)」を参考にしているので、よかったら受講してみてください。

前回

JWT Tokenのチェック処理を実装しました

事前準備

フォルダ/ファイル

モジュール

GraphQLの実装

GraphQLは、Facebookが開発しているWeb APIのための規格で、 クエリ言語とスキーマ言語からなります。

REST APIだと、欲しい情報の数だけエンドポイント(URL)が必要になりますが、GraphQLではエンドポイントは一つだけで済みます。

例えば、以下のqueryをGraphQLサーバーに送信したとします。

データ送信後、次のような形式で、データを取得できます。

REST APIに比べると以下のメリットがあるようです。

GraphQLのメリット
・ エンドポイントを増やさずに欲しい情報を取得できる
・ 不必要な情報は取ってこない
・ フロントエンド・サーバーサイドの作業を完全に分業化できる
・ アプリケーションに縛られない自由なデータ取得サーバー(GraphQLサーバー)を立てられる

早速実装していきましょう!

ルートの追加

API側で、GraphQLへのルートを追加します。

GraphQL SchemaとField設定

GraphQLのSchemaとFieldを設定します。

ちょっと複雑ですよね。詳しくは、GraphQLのLearnを見てください。

ハンドラーの実装

次にハンドラーを実装します。

GrphQLAPIへリクエストを送る

今度は、React側でGraphQL APIへリクエストを送信する処理を実装します。

GraphQLコンポーネント

リクエストを送信するために、GraphQLコンポーネントを実装します。内容はこれまで実装してきたものとほぼ同じなので、サクッといきます。

ルートの追加

GraphQLコンポーネントへのルートを追加します。

検証

「docker-compose up」でコンテナを立ち上げ、「http://localhost:3000」にアクセスしましょう。

リスト内に「GraphQL」が表示されるはずなので、クリックします。

ChromeのデベロッパーツールからConsoleを確認するとデータが取得できているので、成功ですね!

Movieリストの表示

Movieリストを表示しましょう。

OKですね。

GraphQLのメリット

現在、Reactに設定しているクエリは以下です。

そして、取得データは下記のようになっています。

次に、このクエリにdescriptionを足してみましょう。

descriptionが追加されました!

欲しいデータをクエリに指定するだけで取得できるのでとても便利です。
また、APIの作り(エンドポイント)に依存しないのでフレキシブルですし、必要最低限のデータを取得するようにリクエストを遅れるので、フロントエンド <—>サーバ間の通信量を節約できますね。

GraphQLのデメリット

データ取得に関してはとても便利でしたが、API側できちっとしたスキーマーを定義しないといけないところがちょっとめんどくさそうですね。

今回はリクエスト先のテーブルが一つだけだったのでそこまで複雑なスキーマーにならなかったのですが、データベース間のリレーションとかあった場合はどんな感じになるんだろうと思いました。

慣れればとっつきやすくなるんですかね?

次回

次回は、GraphQLでSearch機能を実装しましょう

記事まとめ

参考書籍

ソースコード

graphql.go

routes.go

Admin.tsx

EditMovie.tsx

Home.tsx

Home.css

Login.tsx

tokens.ts

App.tsx

GraphQL.tsx

コメントを残す