GraphQLに入門してみた

作成日:2024/05/13

概要

自身のソフトウェア設計への関心から GraphQL に入門してみた。その結果、作成したソフトウェアのモデルから実装をそのまま流用できている感があるところが良いと考えた。
ただし、REST API の頃対処していた問題について、GraphQL なりに解決するためのアプローチが異なっているので、運用しながらキャッチしていく必要があると感じた。

はじめに

最近ソフトウェアのモデル設計に関心があり、その経緯からよりモデル設計が密接に関わるイメージを勝手に持っていた GraphQL に入門してみた。

GraphQL の特徴(所感)

リクエストの柔軟性

GraphQL はアプリケーションに対して、クエリよる柔軟なデータ取得を可能にする。これによって、オーバーフェッチやアンダーフェッチを防ぎ、必要なデータのみを取得することができる。

グラフ理論に基づいたモデルにより、データの関連性がわかりやすい

GraphQL はデータの関連性をグラフ理論に基づいて表現する。そのため、設計したソフトウェアのモデルをそのまま GraphQL のスキーマに流用できるので、設計している感があって良い(個人の感想)。

GraphQL の大まかな概念

GraphQL のオペレーション

GraphQL はソフトウェアのリソースに対して、下記の概念で操作を行う。

  • クエリ:データの取得
  • ミューテーション:データの変更
  • サブスクリプション:長時間に渡るデータの取得(今回は使っていないので記述は省略)

基本的にデータ取得はクエリ、データ変更はミューテーションで行えば良い。

GraphQL のスキーマ

GraphQL はスキーマによってデータの入出力の形式を定義する。スキーマは下記のような形式で定義する。

# Storeモデル
type Store {
  id: ID!
  name: String
}

# クエリ
type Query {
  getStore(id: ID!): Store
}

# ミューテーション
type Mutation {
  createStore(name: String!): Store
}

こうして定義したスキーマを graphql-js に読み込ませるなり、graphql-code-generator で各言語の型定義ファイルを出力するなりして使用することができる。

GraphQL のリゾルバ

GraphQL では、クエリやミューテーションで定義したフィールド(≒ メソッド)からデータやコンテキスト(実行ユーザーやセッション情報など)を受け取って処理するための関数をリゾルバと呼ぶ。

感想

個人的には作成したモデルがそのまま流用できている感があるところがとても良い。例えば各モデルの関連性やモデルに対するロジックをそのまま GraphQL のスキーマに落とし込んでいける感じが好みである。
REST API では HTTP メソッドによる制約がありモデルとロジックの設計をそのまま流用することが難しかったので、この点は GraphQL の良い点であると感じた。
その代わり、キャッシュやクエリの深さ制限、N+1 問題など REST API とは異なったアプローチで解決しなければいけない課題が有りそうなので、もう少し運用しながらキャッチしていきたい。