🐱 うさねこ教室 Python と可観測性の教室

バージョニングと互換性

🐱 この章の目次

なぜバージョニングが必要か

公開 API は一度リリースするとクライアントが依存するため、破壊的変更を自由に加えられません。 後方互換性(backward compatibility) を維持しながら API を進化させるために、バージョニング戦略が必要です。 DDIA 第 4 章で扱うエンコーディングとスキーマ進化の考え方は、API 設計にもそのまま適用されます。

バージョニング戦略

代表的な戦略は以下の 3 つです。

戦略メリットデメリット
URL パス/v1/users明示的で分かりやすいURL が変わるためキャッシュ・ブックマークに影響
カスタムヘッダーAPI-Version: 2URL を汚さないブラウザやツールで扱いにくい
Accept ヘッダーAccept: application/vnd.api+json;version=2HTTP 標準に則る複雑で実装コストが高い

URL パスによるバージョニングが最も広く採用されており、初期段階ではこの方式を推奨します。

後方互換な変更と破壊的変更

以下は後方互換な(非破壊的な)変更です。

  • レスポンスにオプショナルフィールドを追加する
  • 新しいエンドポイントを追加する
  • クエリパラメータにオプショナルな項目を追加する

以下は破壊的変更です。

  • 既存フィールドの型やセマンティクスを変更する
  • 必須フィールドを追加する
  • エンドポイントの URL を変更・削除する

クライアントは「知らないフィールドは無視する」という原則(寛容な読み取り)を採用することで、非破壊的変更に対して堅牢になります。

非推奨化(Deprecation)

フィールドやエンドポイントを廃止する際は、段階的に 非推奨化(deprecation) を進めます。 OpenAPI では deprecated: true を指定することで、ドキュメント上に警告を表示できます。

paths:
  /v1/legacy-endpoint:
    get:
      deprecated: true
      summary: "[非推奨] 旧形式のデータ取得"
      description: "v2/new-endpoint を使用してください。2025-12 に削除予定。"

実行時には Sunset ヘッダー(RFC 8594)で廃止日をクライアントに通知し、移行猶予期間を設けます。

スキーマ進化と互換性ルール

API スキーマの進化は、DDIA 第 4 章で解説されるエンコーディングの前方・後方互換性と本質的に同じ問題です。 Protobuf のフィールド番号のように、各フィールドに一意の識別子を持たせ、新旧スキーマが共存できるよう設計します。 OpenAPI の CI パイプラインにスキーマ差分チェック(例: oasdiff)を組み込むことで、破壊的変更を自動検知できます。

# oasdiff で破壊的変更を検出
oasdiff breaking base.yaml revised.yaml