なぜ今この比較なのか

かつて Web API といえば事実上 REST(より正確には HTTP+JSON)一択だった。しかしマイクロサービス化が進み、 1 リクエストの裏で複数のサービスが相互に通信するようになると、サービス間(内部)通信の効率とスキーマの厳密さが 無視できないコストとして表面化してきた。ここに gRPC が広まった背景がある。

一方でブラウザやモバイル、社外公開 API の世界では、依然として REST が圧倒的に扱いやすい。 つまり現代のシステムでは「外向きは REST、内部は gRPC」のように、両者を適材適所で使い分ける構成が現実的な選択肢になっている。 だからこそ「どちらか一方が優れている」ではなく、「どの観点でどう選ぶか」を言語化することに価値がある。

💡 このシリーズのゴール

REST と gRPC の優劣を決めることではなく、スキーマ・通信モデル・エラー・互換性・運用といった設計観点ごとに両者がどう違い、実際の移行ではどこでつまずくのかを、実装者の視点で整理することを目的とする。

REST とは — アーキテクチャスタイル

REST(Representational State Transfer)は、Roy Fielding が 2000 年の博士論文で定義した アーキテクチャスタイルであり、特定のライブラリやプロトコル製品ではない。 リソースを URI で識別し、HTTP メソッド(GET / POST / PUT / DELETE など)でそのリソースに対する操作を表現する、という「設計の作法」を指す。

現場で「REST API」と呼ばれるものの多くは、厳密には Fielding の定義(特に HATEOAS)を満たさない HTTP + JSON のリソース指向 APIである。本シリーズでも、この実務的な意味での REST を対象にする。

HTTP — REST のリクエスト例
GET /users/42 HTTP/1.1
Host: api.example.com
Accept: application/json

# レスポンス
HTTP/1.1 200 OK
Content-Type: application/json

{
  "id": 42,
  "name": "Taro Yamada",
  "email": "taro@example.com"
}

REST が前提とする代表的な性質は次の通り。

  • リソース指向 — 「ユーザー」「注文」などの名詞(リソース)を URI で表す
  • 統一インターフェース — 操作は HTTP メソッドの意味論に従う(GET は取得、DELETE は削除…)
  • ステートレス — サーバーはリクエスト間でクライアントの状態を保持しない
  • 表現の自由 — ボディの形式は JSON でも XML でもよい(実務では JSON が主流)

gRPC とは — HTTP/2 + Protocol Buffers の RPC

gRPC は Google が公開した RPC(Remote Procedure Call)フレームワークである。 「リソースを操作する」のではなく「リモートのメソッドを呼び出す」という発想に立つ。 通信路には HTTP/2 を使い、データのシリアライズには Protocol Buffers(protobuf) を使う。

gRPC ではまず .proto ファイルにサービス(メソッド群)とメッセージ(型)を定義し、 そこからクライアント/サーバー双方のコードを自動生成する。型と契約がコードに強制されるのが大きな特徴だ。

Protocol Buffers — gRPC のサービス定義
syntax = "proto3";

package user.v1;

// サービス = 呼び出せるメソッドの集合
service UserService {
  rpc GetUser(GetUserRequest) returns (User);
}

// メッセージ = やり取りする型
message GetUserRequest {
  int64 id = 1;          // フィールド番号は互換性の要
}

message User {
  int64  id    = 1;
  string name  = 2;
  string email = 3;
}

gRPC が標準で備える代表的な性質は次の通り。

  • スキーマファースト.proto が唯一の契約。クライアント/サーバーは生成コードを共有する
  • バイナリ表現 — protobuf はコンパクトな2進形式で、JSON より小さく速い
  • HTTP/2 前提 — 多重化(1接続で並列)・ヘッダ圧縮・双方向ストリーミングを活用
  • 4 つの通信方式 — Unary(1対1)に加えてサーバー/クライアント/双方向ストリーミングを持つ

「スタイル」と「実装」の非対称性

ここが本シリーズで最初に押さえておきたい最重要ポイントだ。REST と gRPC は同じ階層のものではない

REST
「こう設計せよ」というスタイル(規約)。プロトコルは HTTP、表現は自由、実装ライブラリも無数にある。中身は実装者が決める。
gRPC
スキーマ言語・シリアライズ・通信プロトコル・コード生成までを束ねた具体的な実装フレームワーク。決まっていることが多い。

つまり REST は「設計の指針」であり、gRPC は「指針+実装が一体になった製品」だ。 この非対称性を理解しないまま「REST vs gRPC」を語ると、議論が噛み合わなくなる。 たとえば「gRPC はスキーマが厳密」という長所は、REST 側でも OpenAPI を導入すれば近づけられる。 逆に「REST はブラウザからそのまま叩ける」という長所は、gRPC では gRPC-Web というブラウザ向けの別レイヤーが必要になる。

⚠️ 比較の前提を揃える

本シリーズでは REST を「HTTP + JSON + OpenAPI で運用するリソース指向 API」、gRPC を「HTTP/2 + protobuf + コード生成で運用する RPC」という、それぞれ実務でよく取られる典型構成として比較する。「素の REST」と「フル装備の gRPC」を比べると不公平になるためだ。

RPC 指向とリソース指向の発想の差

実装に入る前に、両者の発想(メンタルモデル)の違いを掴んでおくと、以降の設計観点が腹落ちしやすい。 同じ「ユーザーを取得する」という処理を、両者は次のように考える。

観点REST(リソース指向)gRPC(RPC 指向)
考え方「ユーザーというリソースを GET する」「GetUser というメソッドを呼ぶ」
URL / 名前GET /users/42UserService.GetUser(id=42)
操作の表現HTTP メソッド(動詞)に意味を持たせるメソッド名そのものが動詞
新しい操作の追加新しい URL / メソッドの組み合わせ.proto に rpc を1行追加
得意なモデルCRUD(作成・取得・更新・削除)任意の手続き・アクション

「ユーザーを退会させる」のようなCRUD に綺麗に収まらない操作を考えると差が分かりやすい。 REST では POST /users/42/deactivation のようにリソース化を工夫する必要があるが、 gRPC では DeactivateUser(id) というメソッドを足すだけで自然に表現できる。 逆に「リソースの一覧をページングで取得」のような定型操作は REST の統一インターフェースが綺麗にハマる。

このシリーズの読み方

本シリーズは全 5 回で構成する。設計観点の整理 → 判断軸 → 実例での移行、という順で深掘りしていく。

テーマ扱う内容
PART 01立ち位置と前提(本記事)なぜ比較するか・スタイルと実装の非対称性
PART 02設計観点の対比スキーマ・通信・エラー・互換性・運用+観点別比較表
PART 03選定の判断軸どんな条件でどちらに倒すか・併用パターン
PART 04REST→gRPC 移行ケーススタディ同一エンドポイントのコード対比・段階的移行
PART 05まとめ・チェックリスト設計観点チェックリストと結論

次の章では…

PART 02 では、スキーマ・データ表現・通信モデル・エラー設計・互換性・エコシステム・運用という7 つの設計観点で REST と gRPC を 1 つずつ対比し、最後に全体を俯瞰できる観点別比較表にまとめる。

→ PART 02 — 設計観点ごとの対比へ