【初心者向け】プログラミングの「GraphQL」vs「REST」

GraphQLとRESTの違いを初心者にもわかりやすく解説。API設計の基本から実際の使い分け方まで、具体例を交えて詳しく説明します

Learning Next 運営
18 分で読めます

みなさん、API設計で「GraphQL」と「REST」という言葉を聞いたことはありませんか?

Web開発を始めたばかりの方にとって、この2つの技術の違いはとても分かりにくいものです。 どちらもデータのやり取りを行うための仕組みですが、それぞれ異なる特徴と使い道があります。

この記事では、GraphQLとRESTの基本的な違いから実際の使い分け方まで、初心者の方にも分かりやすく解説します。 API設計で迷っている方は、ぜひ参考にしてみてください。

RESTとは?基本を理解しよう

RESTの基本概念

REST(Representational State Transfer)は、Web APIを設計するための考え方です。 簡単に言うと、「リソース」という概念を中心に、データのやり取りを行う仕組みですね。

RESTでは、以下の4つの基本操作を使ってデータを操作します。

  • GET: データを取得する
  • POST: データを新規作成する
  • PUT: データを更新する
  • DELETE: データを削除する

この4つの操作は、CRUDと呼ばれることもあります。

RESTの特徴

URLでリソースを表現

RESTでは、データをURLで表現します。

GET /users/123 # ユーザーID 123の情報を取得 GET /users/123/posts # ユーザーID 123の投稿一覧を取得 POST /posts # 新しい投稿を作成 PUT /posts/456 # 投稿ID 456を更新 DELETE /posts/456 # 投稿ID 456を削除

このように、URLを見るだけで何のデータを扱っているかが分かります。

ステートレス

RESTは「ステートレス」という特徴があります。 これは、サーバーがクライアントの状態を記憶しないということです。

例えば、ユーザー情報を取得するたびに、認証情報を毎回送る必要があります。 この特徴により、システムがシンプルになり、スケーラビリティが向上します。

RESTの実際の使用例

ブログシステムの例

ブログシステムをRESTで設計すると、以下のようなAPIになります。

GET /posts # 記事一覧を取得 GET /posts/123 # 記事ID 123の詳細を取得 POST /posts # 新しい記事を作成 PUT /posts/123 # 記事ID 123を更新 DELETE /posts/123 # 記事ID 123を削除 GET /posts/123/comments # 記事ID 123のコメント一覧 POST /posts/123/comments # 記事ID 123にコメントを投稿

直感的で分かりやすい構造になっていますね。

GraphQLとは?新しいAPI設計の考え方

GraphQLの基本概念

GraphQLは、Facebookが開発したAPI設計の考え方です。 RESTとは異なり、「必要なデータを必要な分だけ取得する」ことを重視しています。

GraphQLでは、クライアントが「何のデータが欲しいか」を詳細に指定できます。 これにより、無駄なデータ転送を避けることができるんです。

GraphQLの特徴

単一のエンドポイント

RESTでは複数のURLを使いますが、GraphQLでは基本的に1つのエンドポイントを使用します。

POST /graphql

この1つのエンドポイントに、どのデータが欲しいかを詳細に指定したクエリを送信します。

柔軟なデータ取得

GraphQLでは、欲しいデータを自由に組み合わせて取得できます。

query {
user(id: "123") {
name
email
posts {
title
content
comments {
author
text
}
}
}
}

このクエリでは、ユーザー情報と投稿、さらにコメントまで一度に取得しています。

型システム

GraphQLには強力な型システムがあります。 これにより、どのようなデータが取得できるかが明確に定義されます。

type User {
id: ID!
name: String!
email: String!
posts: [Post]
}
type Post {
id: ID!
title: String!
content: String!
author: User!
comments: [Comment]
}

この型定義により、APIの仕様が明確になります。

GraphQLの実際の使用例

同じブログシステムをGraphQLで

先ほどのブログシステムをGraphQLで設計すると、以下のようになります。

# 記事一覧を取得(タイトルのみ)
query {
posts {
id
title
}
}
# 記事詳細を取得(作者情報とコメントも含む)
query {
post(id: "123") {
title
content
author {
name
email
}
comments {
text
author {
name
}
}
}
}

必要なデータだけを柔軟に取得できることが分かりますね。

GraphQL vs REST:詳細比較

データ取得の違い

RESTの場合

RESTでは、複数のリクエストが必要になることがあります。

# 1. ユーザー情報を取得 GET /users/123 → { "id": "123", "name": "田中太郎", "email": "tanaka@example.com" } # 2. ユーザーの投稿を取得 GET /users/123/posts → [{ "id": "1", "title": "投稿1" }, { "id": "2", "title": "投稿2" }] # 3. 各投稿の詳細を取得 GET /posts/1 GET /posts/2

このように、欲しいデータを取得するために複数のAPIを呼び出す必要があります。

GraphQLの場合

GraphQLでは、1回のリクエストで必要なデータを全て取得できます。

query {
user(id: "123") {
name
email
posts {
id
title
content
}
}
}

1回のリクエストで、ユーザー情報と投稿の詳細を全て取得できます。

無駄なデータ転送の比較

RESTの問題点

RESTでは、API設計者が決めたデータ構造を受け取ることになります。

GET /users/123 → { "id": "123", "name": "田中太郎", "email": "tanaka@example.com", "address": "東京都...", "phone": "090-1234-5678", "birthday": "1990-01-01", "createdAt": "2020-01-01T00:00:00Z" }

名前だけが欲しい場合でも、全ての情報が送られてきます。

GraphQLの利点

GraphQLでは、必要なデータだけを指定できます。

query {
user(id: "123") {
name
}
}

この場合、名前だけが返されるため、無駄なデータ転送が発生しません。

学習コストの違い

RESTの学習コスト

RESTは比較的シンプルで、学習コストが低いです。

  • HTTP メソッド: GET、POST、PUT、DELETE
  • URL設計: リソースベースの考え方
  • ステータスコード: 200、404、500など

基本的なHTTPの知識があれば、比較的簡単に理解できます。

GraphQLの学習コスト

GraphQLは、学習すべき概念が多いです。

  • クエリ言語: GraphQLのクエリ構文
  • 型システム: スキーマ定義言語
  • リゾルバー: データ取得のロジック
  • サブスクリプション: リアルタイム通信

RESTと比較すると、学習コストは高めですね。

実際の使い分け方

RESTが適している場面

シンプルなAPI

以下のような場合は、RESTが適しています。

  • CRUD操作が中心: 基本的な作成・読み取り・更新・削除
  • リソースが明確: ユーザー、投稿、コメントなど明確なリソース
  • チームの経験: RESTに慣れたチームでの開発
  • シンプルなクライアント: 単純なデータ取得のみ

例:ECサイトの商品管理

GET /products # 商品一覧 GET /products/123 # 商品詳細 POST /products # 商品作成 PUT /products/123 # 商品更新 DELETE /products/123 # 商品削除

このような単純なCRUD操作では、RESTが適しています。

GraphQLが適している場面

複雑なデータ関係

以下のような場合は、GraphQLが適しています。

  • 複雑なデータ関係: 多対多の関係が多い
  • 柔軟なデータ取得: クライアントごとに異なるデータが必要
  • モバイルアプリ: データ転送量を最小限に抑えたい
  • リアルタイム通信: サブスクリプション機能が必要

例:SNSアプリケーション

query {
user(id: "123") {
name
avatar
posts(limit: 10) {
content
likes {
user {
name
}
}
comments(limit: 5) {
text
author {
name
avatar
}
}
}
}
}

このような複雑なデータ関係では、GraphQLが力を発揮します。

混在する場合

ハイブリッドアプローチ

実際のプロジェクトでは、RESTとGraphQLを混在させることもあります。

  • REST: 単純なCRUD操作
  • GraphQL: 複雑なデータ取得

この組み合わせにより、それぞれの利点を活かすことができます。

実装の難易度比較

RESTの実装

サーバーサイド

RESTは、多くのフレームワークで標準的にサポートされています。

// Express.js での例
app.get('/users/:id', (req, res) => {
const user = getUserById(req.params.id);
res.json(user);
});
app.post('/users', (req, res) => {
const newUser = createUser(req.body);
res.status(201).json(newUser);
});

シンプルで分かりやすい実装ですね。

クライアントサイド

RESTのクライアント実装も簡単です。

// ユーザー情報を取得
const response = await fetch('/users/123');
const user = await response.json();
// 新しいユーザーを作成
const response = await fetch('/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(newUser)
});

標準的なfetch APIで簡単に実装できます。

GraphQLの実装

サーバーサイド

GraphQLは、スキーマ定義とリゾルバーの実装が必要です。

const typeDefs = `
type User {
id: ID!
name: String!
posts: [Post]
}
type Query {
user(id: ID!): User
}
`;
const resolvers = {
Query: {
user: (parent, args) => getUserById(args.id),
},
User: {
posts: (parent) => getPostsByUserId(parent.id),
},
};

RESTと比較すると、実装が複雑になります。

クライアントサイド

GraphQLのクライアント実装は、専用のライブラリを使用することが多いです。

import { gql, useQuery } from '@apollo/client';
const GET_USER = gql`
query GetUser($id: ID!) {
user(id: $id) {
name
posts {
title
}
}
}
`;
const { loading, error, data } = useQuery(GET_USER, {
variables: { id: '123' },
});

専用のライブラリを使用することで、効率的に実装できます。

パフォーマンスの比較

RESTのパフォーマンス

利点

  • キャッシュが容易: HTTPキャッシュが利用できる
  • CDNとの相性: 静的コンテンツの配信が得意
  • 軽量: シンプルなHTTPリクエスト

課題

  • Over-fetching: 不要なデータも取得してしまう
  • Under-fetching: 複数のリクエストが必要
  • N+1問題: 関連データの取得で発生

GraphQLのパフォーマンス

利点

  • 必要なデータのみ: 無駄なデータ転送がない
  • バッチ処理: 複数のデータを一度に取得
  • リアルタイム: サブスクリプション機能

課題

  • キャッシュの複雑さ: クエリごとに異なるため複雑
  • N+1問題: 適切な実装が必要
  • クエリの複雑さ: 非効率なクエリが書かれる可能性

どちらも適切に実装すれば、十分なパフォーマンスを実現できます。

初心者へのおすすめ

学習の順序

初心者の方には、以下の順序で学習することをおすすめします。

1. RESTから始める

まずは、RESTの基本を理解しましょう。

  • HTTPメソッド: GET、POST、PUT、DELETE
  • ステータスコード: 成功、エラーの種類
  • URL設計: リソースベースの考え方
  • JSON: データ形式の理解

RESTは概念がシンプルで、多くの既存APIで使用されています。

2. 実際のプロジェクトで経験を積む

RESTを使った簡単なプロジェクトを作成してみましょう。

  • ToDoアプリ: 基本的なCRUD操作
  • ブログシステム: 記事の管理
  • ユーザー管理: 認証・認可

実際に手を動かすことで、理解が深まります。

3. GraphQLを学習する

RESTに慣れた後、GraphQLを学習しましょう。

  • 基本概念: クエリ、ミューテーション、サブスクリプション
  • 型システム: スキーマ定義言語
  • 実装: サーバーサイドとクライアントサイド

GraphQLの利点と課題を理解することが重要です。

最初のプロジェクトでの選択

RESTを選ぶべき場合

  • 学習中: APIの基本を理解したい
  • シンプルなアプリ: CRUD操作が中心
  • チームの経験: RESTに慣れたメンバーが多い
  • 既存システム: RESTベースのシステムとの連携

GraphQLを選ぶべき場合

  • 複雑なデータ関係: 多対多の関係が多い
  • モバイルアプリ: データ転送量を抑えたい
  • チームの技術力: GraphQLを学習できる環境
  • 新規プロジェクト: 既存システムとの制約がない

無理にGraphQLを選ぶ必要はありません。 プロジェクトの要件に応じて、適切な技術を選択することが重要です。

まとめ

RESTとGraphQLは、それぞれ異なる特徴を持つAPI設計手法です。

RESTは、シンプルで学習コストが低く、多くの場面で十分な機能を提供します。 HTTPの標準的な仕組みを活用するため、理解しやすく実装も簡単です。

GraphQLは、複雑なデータ関係や柔軟なデータ取得が必要な場合に威力を発揮します。 学習コストは高めですが、適切に使用すれば非常に効率的なAPIを構築できます。

初心者の方は、まずRESTから学習することをおすすめします。 基本的なAPI設計の考え方を理解した後、必要に応じてGraphQLを学習しましょう。

どちらの技術も、それぞれの特徴を理解して適切に使い分けることが重要です。 プロジェクトの要件や チームの状況を考慮して、最適な選択をしてみてください。

実際に手を動かしながら学習することで、それぞれの利点と課題を体験できるはずです。 ぜひ、簡単なプロジェクトから始めて、両方の技術を試してみてくださいね。

関連記事