LASSIC Media らしくメディア
OpenAPIでAPI仕様設計を外注|契約駆動開発
LASSIC IT事業部|元請(プライムベンダー)としてシステム保守・運用を受託
この記事のポイント
- OpenAPIはREST APIの仕様を機械可読な形式で定義する標準であり、契約駆動開発(Design-First)の土台になります。
- スキーマ・エンドポイント・パラメータ・レスポンス・エラーの設計を先に固めることで、フロントとバックエンドを並行して開発できます。
- モックサーバーや自動生成、契約テストの活用範囲を明確にすると、外注時の委託範囲と発注側の準備事項が整理できます。
目次
OpenAPIとは — 機械可読なAPI定義と契約駆動開発の関係
OpenAPIとは、HTTPで通信するAPIの仕様を人間とコンピュータの両方が理解できる形式で記述するための標準仕様です*1。エンドポイント・パラメータ・リクエストとレスポンスの構造をYAMLまたはJSON形式のドキュメントとして定義します。
OpenAPI仕様の策定・普及を担う非営利団体OpenAPI Initiativeは、OpenAPIを「ベンダー中立で可搬性のある、REST APIの技術的なメタデータを記述するためのオープンな仕様」と説明しています*1。2025年9月公開の最新版OpenAPI Specification 3.2.0では、APIの仕様を「ソースコードへのアクセス・追加ドキュメント・通信内容の調査を必要とせずに、人間とコンピュータの双方がサービスの機能を発見し理解できるようにする、プログラミング言語に依存しないインターフェース記述」と定義しています*2。
契約駆動開発(Contract-First、またはDesign-First開発)とは、実装コードを書く前にOpenAPI文書でAPIの仕様を先に確定し、その仕様を発注者・開発者間の「契約」として扱う開発手法を指します。OpenAPI Initiativeは、自団体の開発方針そのものを「APIファーストの設計アプローチを前提としており、OpenAPI文書を先に作成し、その後にコードを書く」としています*1。設計と実装の一致を確認する目的で「契約テストを実行するツールを使い、設計と実装が一致するかを検証することは、APIを提供する側にとって一般的な活動である」とも述べています*1。
Design-Firstの利点は、実装より先に仕様の議論を済ませられる点にあります。API提供者は「OpenAPI文書を使ってサーバー側のコードを生成することは、コントローラークラスの作成を自動化する一般的な手法である」としており*1、仕様が固まった時点でサーバースタブ・クライアントSDK・ドキュメントを同時に生成できます。仕様を後回しにして実装から始める方式(Code-First)では、実装のずれが後工程で発覚しやすく、外注先とのすり合わせコストが膨らみやすい点が実務上の課題になります。
スキーマ・エンドポイント・パラメータ・レスポンス設計の要点
OpenAPI文書の骨格は、エンドポイントを定義するPaths Object、データ構造を定義するSchema Object、再利用可能な定義をまとめるComponents Objectで構成されます。OpenAPI Specification 3.2.0の仕様書では、Paths Objectを「個々のエンドポイントとその操作への相対パスを保持し、Server Objectで示されるURLに付加することで完全なリクエストURLを構成する」と定義しています*2。
Schema Object(データ型と構造を定義するオブジェクトで、JSON Schemaの記法をOpenAPI文書内に組み込んだもの*2)は、リクエストボディとレスポンスボディの両方に使います。同じ構造を複数のエンドポイントで使う場合は、Components Objectに定義を集約し、各エンドポイントから参照する設計が推奨されます。OpenAPI Specification 3.2.0の仕様書は、Components Objectを「スキーマ・レスポンス・パラメータ・セキュリティスキームなど、仕様全体で参照される再利用可能な定義を保持するオブジェクト」と説明しています*2。
エンドポイント設計では、リソース単位でパスを分割し、HTTPメソッド(GET・POST・PUT・DELETE等)の意味に沿った操作を割り当てます。パラメータはパス・クエリ・ヘッダー・クッキーの4種類に分類し、必須/任意の区分と型(文字列・数値・配列等)をSchema Objectで明示します。パラメータの型や必須区分があいまいなまま外注先に渡すと、実装段階で解釈の齟齬が生じやすく、受け入れテストの手戻りにつながります。
レスポンス設計では、正常系(200番台)だけでなく異常系のステータスコードとレスポンス構造も仕様に含めます。API提供者は、OpenAPI文書を使って「開発者ポータルやインタラクティブな体験を迅速に提供できる」としており*1、レスポンス構造を仕様に明記しておくことは、外注先だけでなく利用者向けドキュメントの品質にも直結します。
バージョニングとエラー設計 — 外注前に握るべき2つの決定事項
APIのバージョニングでは、OpenAPI Specification自体のバージョン(仕様フォーマットの版)と、APIドキュメントのInfo Objectに記載する「document version(提供するAPI自体のバージョン)」を区別する必要があります。OpenAPI Specification 3.2.0の仕様書は、Info Objectについて「タイトル・バージョン・説明・連絡先・ライセンス情報などのAPIメタデータを提供する」と定義し*2、この`info.version`フィールドはOpenAPI Specificationのバージョンとは別物であると注記しています*2。発注時は、URLパス(`/v1/`等)・ヘッダー・クエリパラメータのいずれでAPI自体のバージョンを表現するかを、外注先に発注する前に決めておく必要があります。
OpenAPI Specification自体もmajor.minor.patchの形式でバージョン管理されており、仕様書では「major.minorの部分が機能セットを示し、patchの部分はエラー修正や明確化に対応する」と説明しています*2。外注先が使用するコード生成ツール・エディタが対応するOpenAPIのバージョン(3.0系・3.1系・3.2系等)が異なると、記法の一部が使えない場合があるため、発注前にツールの対応バージョンを確認する工程が必要です。
エラー設計では、エラーレスポンスの構造(エラーコード・メッセージ・詳細情報の項目)をSchema Objectとして定義し、全エンドポイントで共通利用します。エラー構造をエンドポイントごとに個別定義すると、フロントエンド側のエラーハンドリングが複雑になり、外注先の実装と発注側の想定がずれるリスクがあります。共通のエラースキーマをComponents Objectに1つ用意し、各エンドポイントのレスポンス定義から参照する設計が実務上の基本形です。
モック・自動生成・契約テスト — OpenAPI文書を使い切る3つの手段
OpenAPI文書を作成した後は、その文書を起点に複数の作業を自動化できます。第一に、モックサーバーの生成です。仕様に定義したパスとレスポンス例から、実装前の段階でも仕様通りのレスポンスを返すサーバーを立てられます。第二に、サーバースタブ・クライアントSDK・ドキュメントの自動生成です。OpenAPI Initiativeは、OpenAPI文書を使ったサーバー側コード生成を「コントローラークラスの作成を自動化する一般的な手法」と位置づけています*1。生成したスタブに実装を追加すれば、パラメータの型チェックなど仕様に沿った処理の骨格を省力化できます。
第三に、契約テストです。契約テストとは、OpenAPI文書に定義した仕様(契約)と実際の実装が一致しているかを検証するテスト手法を指します。OpenAPI Initiativeは「設計と実装が一致するかを確認するために契約テストを実行するツールを使うことは、APIを提供する側にとって一般的な活動である」と説明しています*1。契約テストを外注先の受け入れ検収に組み込むことで、レスポンス構造やステータスコードが仕様と食い違っていないかを、目視確認ではなく機械的に検証できます。
これら3つの手段は、OpenAPI文書の精度に依存します。パラメータの型や必須区分、レスポンス構造にあいまいな箇所が残っていると、モックサーバーが実際のAPIと異なる挙動を返し、契約テストも仕様のあいまいさを検出できません。外注前にOpenAPI文書のレビューを社内で完了させ、仕様の抜け漏れを潰しておくことが、自動生成・契約テストの効果を引き出す前提条件になります。
フロントとバックの並行開発 — 外注委託範囲と発注側の準備
OpenAPIによる契約駆動開発の実務上の価値は、フロントエンドとバックエンドを並行して開発できる点にあります。OpenAPI文書とモックサーバーが用意できれば、バックエンドの実装が完了する前でも、フロントエンド側は仕様通りのレスポンスを前提に開発を進められます。バックエンド側は同じOpenAPI文書から生成したサーバースタブに実装を追加します。両者が同じ仕様書を参照するため、途中で仕様変更が発生した場合もOpenAPI文書を更新し、両チームに同時に伝達できます。
この体制を内製のみで構築するには、OpenAPI文書の記法(YAML/JSON、Schema Objectの記法)を理解した人材と、契約テスト・モックサーバーのツールチェーンを構築・運用できる人材が必要です。仕様設計と実装の両方を1〜2名で兼務すると、仕様のセルフレビューが甘くなりやすく、契約テストが形骸化するリスクがあります。
外注する場合の委託範囲は、大きく3パターンに分かれます。1つ目は「仕様設計のみ」を外注し、実装は内製する形です。2つ目は「仕様設計から実装まで」を一括で外注する形です。3つ目は「実装のみ」を外注し、仕様設計は発注側が確定させておく形です。契約駆動開発の利点を活かすには、少なくとも仕様設計の段階で発注側が要件(リソースの種類・想定される利用者・非機能要件)を明確にし、外注先とOpenAPI文書のレビューを共同で行う工程を設けることが実務上の前提になります。
発注側の準備としては、既存システムがある場合は現行のエンドポイント一覧とデータ構造の棚卸しが必要です。新規開発の場合は、想定する利用者(自社の別システムか、外部の連携先か)とアクセス頻度、認証方式の要件を事前に整理しておくと、外注先が提示する見積もりの精度が上がります。仕様のレビュー体制(誰が最終承認するか)を発注前に決めておくことも、契約駆動開発を機能させる前提条件です。
まとめ:OpenAPIによるAPI仕様設計外注の3つの判断軸
本稿では、OpenAPIによるREST API仕様設計と契約駆動開発の実務を整理しました。要点を3つに集約すると次の通りです。第一に、OpenAPI文書はAPIの仕様を機械可読な形式で記述する標準であり、実装前に仕様を確定するDesign-First開発の土台になります。第二に、スキーマ・エンドポイント・パラメータ・レスポンス・バージョニング・エラー設計を先に固めることで、モックサーバー・自動生成・契約テストという3つの自動化手段を活用できます。第三に、外注の委託範囲は「仕様設計のみ」「仕様設計から実装まで」「実装のみ」の3パターンに分かれ、いずれの場合も発注側が要件整理と仕様レビュー体制を準備しておくことが前提条件になります。
よくある質問
OpenAPIとSwaggerは何が違うのですか。
Swaggerは元々の仕様名であり、その後仕様自体がOpenAPI Specificationという名称でOpenAPI Initiativeに移管されました。現在はSwaggerという名称は主にSwaggerUI・Swagger Editorなどの関連ツール群を指し、仕様そのものの名称はOpenAPI Specificationです。
OpenAPI文書はYAMLとJSONのどちらで書くべきですか。
OpenAPI SpecificationはYAML・JSONのどちらの記法でも仕様上有効です*2。コメントを書きやすく差分レビューがしやすいYAMLを採用するプロジェクトが多い傾向にありますが、既存のツールチェーンがJSONを前提にしている場合はJSONを選ぶ実務判断も成立します。
契約テストを導入すれば実装のテストは不要になりますか。
契約テストは仕様と実装の整合を検証するものであり、業務ロジックの正しさを保証するものではありません*1。契約テストに加えて、業務要件を満たすかを確認する単体テスト・結合テストを別途用意する必要があります。
既存のREST APIをOpenAPI化する場合、どこから始めるのが現実的ですか。
既存のエンドポイント一覧とレスポンス構造の棚卸しから始めるのが現実的です。すべてのエンドポイントを一度に文書化するのではなく、利用頻度が高い、または外部連携が多いエンドポイントから優先的にOpenAPI化し、契約テストの対象を段階的に広げる進め方が実務上の負荷を抑えられます。
仕様設計だけを外注し、実装は内製することはできますか。
可能です。OpenAPI文書によるDesign-First開発では仕様と実装が分離されているため、仕様設計のみを外部パートナーに委託し、生成されたサーバースタブへの実装は内製するという分担が成立します。この場合は仕様のレビュー基準を発注前に明確にしておく必要があります。
著者:テレリモ総研編集部 鈴木 亮佑
ご不明な点はお問い合わせフォームからもご連絡いただけます。
- *1 出典:OpenAPI Initiative「OpenAPI Initiative公式サイト(About / What is OpenAPI)」(https://www.openapis.org/、https://www.openapis.org/what-is-openapi)
- *2 出典:OpenAPI Initiative「OpenAPI Specification v3.2.0」(2025年9月公表、https://spec.openapis.org/oas/latest.html)