#1. GraphQLとは?
GraphQLは、クライアントが必要とするデータだけを指定して取得することができるAPI仕様です。REST APIとは異なり、クライアントが複数のエンドポイントを叩いてデータを取得するのではなく、1つのエンドポイントからすべてのデータを取得できます。
GraphQLの主な特徴:
- 必要なデータだけを取得: クライアントが必要とするデータのフィールドを指定できます。
- 1つのエンドポイント: 複数のエンドポイントを使わず、単一のGraphQLエンドポイントでデータを取得します。
- 型システム: GraphQLではスキーマ(型)が定義されており、どのフィールドを取得できるかが事前に決まっています。
#2. RailsにGraphQLを導入する準備
RailsにGraphQLを導入するために必要な準備は以下の通りです。
2.1 Gemのインストール
まず、graphql
と graphql-Ruby
というGemをインストールします。このGemは、RailsでGraphQLを使うために必要です。
# Gemfile gem 'graphql'
次に、bundle install
コマンドでインストールします。
bundle install
2.2 GraphQLを初期化する
次に、GraphQLを使うための初期設定を行います。Railsのジェネレーターを使ってGraphQLのスキーマやクエリ用のコードを生成します。
rails generate graphql:install
これで、app/graphql
フォルダ内に必要なファイル(types
フォルダ、schema.rb
など)が作成されます。
#3. GraphQLスキーマの作成
RailsでGraphQLを使用する際は、まずスキーマを定義します。スキーマは、どのクエリができるか、どのフィールドが利用できるかなど、APIの仕様を定義するものです。
3.1 Typeの定義
GraphQLでは、クエリを処理するために「Type」を定義する必要があります。例えば、ユーザー情報を取得するためのUserType
を定義します。
# app/graphql/types/user_type.rb module Types class UserType < Types::BaseObject field :id, ID, null: false field :name, String, null: false field :email, String, null: false end end
上記のコードでは、UserType
という型を定義しており、id
, name
, email
の3つのフィールドを持っています。
3.2 Queryの定義
次に、クライアントがGraphQLクエリを通じて取得できる情報を定義します。例えば、users
クエリを定義して、全ユーザーの情報を取得できるようにします。
# app/graphql/types/query_type.rb module Types class QueryType < Types::BaseObject field :users, [Types::UserType], null: false def users User.all end end end
このクエリは、users
というフィールドを通じて、User
モデルから全てのユーザーを取得します。
3.3 スキーマの定義
最後に、作成したクエリをスキーマに統合します。スキーマは、GraphQLサーバーがどのクエリを処理できるかを管理します。
# app/graphql/schema.rb class MyAppSchema < GraphQL::Schema query(Types::QueryType) end
このコードで、MyAppSchema
というスキーマを作成し、QueryType
をクエリとして設定しています。
#4. GraphQLクエリをテストする
GraphQLのエンドポイントは、デフォルトで/graphql
にセットアップされます。このエンドポイントに対してクエリを送信することで、データを取得できます。
4.1 GraphiQLを使用
RailsにGraphQLをセットアップすると、/graphql
エンドポイントでGraphiQL(GraphQLのインタラクティブなIDE)を使用できるようになります。これを使って、クエリをインタラクティブに実行できます。
ブラウザで http://localhost:3000/graphql
にアクセスし、次のようなクエリを実行してみます。
{ users { id name email } }
このクエリは、users
フィールドを使って、ユーザーのid
, name
, email
を取得します。
#5. ミューテーションの追加
GraphQLでは、データを変更するために「ミューテーション」を使用します。例えば、ユーザーの情報を更新するためのミューテーションを追加します。
5.1 ミューテーションの定義
# app/graphql/mutations/update_user.rb module Mutations class UpdateUser < BaseMutation argument :id, ID, required: true argument :name, String, required: true field :user, Types::UserType, null: false def resolve(id:, name:) user = User.find(id) user.update!(name: name) { user: user } end end end
このミューテーションは、ユーザーの名前を更新するものです。
5.2 ミューテーションをスキーマに追加
# app/graphql/types/mutation_type.rb module Types class MutationType < Types::BaseObject field :update_user, mutation: Mutations::UpdateUser end end
5.3 ミューテーションの実行
GraphiQLで次のようなミューテーションを実行して、ユーザーの名前を更新できます。
mutation { updateUser(id: 1, name: "New Name") { user { id name email } } }
#6. まとめ
RailsにGraphQLを導入することで、クライアントが必要とするデータだけを効率よく取得できる柔軟なAPIを提供できます。GraphQLの導入は、以下の利点をもたらします:
- 必要なデータだけを取得: クライアントは自分が必要とするデータだけをリクエストできます。
- 一貫性のあるAPI設計: 複数のエンドポイントを必要とせず、1つのGraphQLエンドポイントでデータを取得。
- 簡単にスキーマ管理: クエリやミューテーションがスキーマで一元管理され、可読性と保守性が向上します。
GraphQLの導入は、特に複雑なデータのやりとりを行うWebアプリケーションにおいて、効率的で柔軟なAPI設計を実現します。RailsでのGraphQLの実装は非常に簡単で、わずかな設定で強力なAPIを提供することができます。