TL;DR
デザインファーストとは、実装コードを書く前にAPI仕様を定義し、その仕様をモック、ドキュメント、テスト、クライアントスタブなどの起点にするワークフローです。仕様を単一の信頼できる情報源にすると、コードとドキュメントのズレを減らし、フロントエンドとバックエンドを並行開発しやすくなります。この記事では、デザインファーストを実装する手順と、Apidogを使った具体的な進め方を説明します。
はじめに
多くの開発チームは、まずルートやコントローラーを書き、アノテーションやジェネレーターからAPIドキュメントを生成します。コードファーストの進め方です。
この方法は小規模な開発では機能しますが、チーム開発では次の問題が起きやすくなります。
- ドキュメントが実装に追従しない
- アノテーションが古くなる
- レスポンス形式の変更が共有されない
- フロントエンドがバックエンド実装を待つ
- 統合時に契約の不一致が発覚する
たとえば、ドキュメントには「文字列の配列を返す」と書かれているのに、実際のAPIは次のようなオブジェクト配列を返す、という状況です。
[
{
"value": "example"
}
]
デザインファーストでは、この順序を逆にします。
- API仕様を先に定義する
- 仕様からモックを生成する
- 仕様をもとにフロントエンドとバックエンドを並行開発する
- 実装が仕様に合っているかテストする
- 仕様からドキュメントを公開する
つまり、仕様がAPI開発の中心になります。
デザインファーストが実際に意味すること
デザインファーストは特定のツールではなく、API開発の進め方です。実際の開発フローに分解すると、次のようになります。
1. コードを書く前にAPI仕様を定義する
まずOpenAPI仕様としてAPIを定義します。
最低限、次の項目を決めます。
- エンドポイントのパス
- HTTPメソッド
- パス、クエリ、ヘッダーパラメーター
- リクエストボディのスキーマ
- レスポンスのステータスコード
- 各ステータスコードのレスポンススキーマ
- 認証要件
- フィールド説明
- サンプル値
例:
paths:
/users/{id}:
get:
summary: ユーザー詳細を取得する
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
"200":
description: "ユーザー詳細"
content:
application/json:
schema:
$ref: "#/components/schemas/User"
"404":
description: "ユーザーが見つからない"
この段階で、命名、レスポンス形式、エラー形式、ページネーションなどの設計をレビューします。
2. 開発中は仕様からモックを使う
仕様を作成したら、モックサーバーを公開します。
フロントエンドはモックAPIに対して実装を進めます。バックエンドは同じ仕様を要件として実装します。
フロントエンド → モックAPI
バックエンド → OpenAPI仕様に沿って実装
これにより、バックエンドの完成を待たずにUIや状態管理の実装を進められます。
3. 実装後は仕様との一致を検証する
実装が完了したら、レスポンスが仕様と一致しているかをテストします。
確認すべきポイントは次の通りです。
- 必須フィールドが存在するか
- 型が一致しているか
- Enum値が仕様内に収まっているか
- エラーレスポンス形式が統一されているか
- ステータスコードが仕様通りか
4. 要件変更時は仕様を先に更新する
APIの変更が必要になった場合は、実装ではなく仕様を先に変更します。
推奨フローは次の通りです。
- 仕様を更新する
- フロントエンド、バックエンド、PMでレビューする
- 合意後にモックを更新する
- 実装を変更する
- テストで仕様との一致を確認する
これにより、仕様が常に正しいAPI契約として維持されます。
デザインファーストプラットフォームに必要な機能
すべてのAPIツールがデザインファーストに向いているわけではありません。実用するには、次の機能が必要です。
ビジュアルAPIエディタ
OpenAPIを直接YAMLで書くことはできますが、設計作業としては負荷が高くなります。
デザインファーストでは、次のようなビジュアルエディタがあると実用しやすくなります。
- パス、メソッド、パラメーターをフォームで定義できる
- リクエストとレスポンスのスキーマを構造化して編集できる
- 共通スキーマをコンポーネントとして再利用できる
- YAML/JSONとしてエクスポートできる
- 編集中にOpenAPIとして検証できる
OpenAPI検証
仕様は、モック、ドキュメント、テスト、コード生成の入力になります。
そのため、仕様がOpenAPIとして正しいことを編集中に検証できる必要があります。
よくある検証対象は次の通りです。
- 必須フィールドの不足
- 無効な型
- 不正な
$ref - レスポンス定義の不足
- スキーマ構造の矛盾
仕様からの自動モック生成
仕様を保存したら、すぐにモックAPIとして呼び出せる状態が理想です。
モックは次の情報をもとにレスポンスを生成できるべきです。
typeformatminimummaximumenumrequired- 配列構造
- ネストされたオブジェクト
-
$refコンポーネント
例:
email:
type: string
format: email
age:
type: integer
minimum: 18
maximum: 99
status:
type: string
enum:
- active
- inactive
このようなスキーマから、現実的なモックデータが返ると、フロントエンド開発で使いやすくなります。
ドキュメントプレビュー
仕様は開発者だけでなく、PM、QA、フロントエンドリードなどもレビューします。
そのため、OpenAPIのYAMLだけでなく、読みやすいドキュメントとして確認できる必要があります。
ドキュメントプレビューで確認すべき項目は次の通りです。
- エンドポイントの説明
- パラメーター一覧
- リクエスト例
- レスポンス例
- ステータスコード
- フィールド説明
- 認証条件
チームレビューワークフロー
API仕様の変更は、コード変更と同じようにレビューされるべきです。
必要な機能は次の通りです。
- エンドポイント単位のコメント
- フィールド単位のコメント
- 変更履歴
- 誰がいつ何を変更したかの追跡
- レビュー後の合意形成
標準OpenAPIへのエクスポート
仕様はツールに閉じ込めるべきではありません。
OpenAPIとしてエクスポートできれば、次のような下流ツールと連携できます。
- コードジェネレーター
- APIゲートウェイ
- テストフレームワーク
- ドキュメント生成ツール
- CI/CDパイプライン
デザインファーストプラットフォームとしてのApidog
Apidogは、API仕様を中心に設計、モック、テスト、ドキュメントをつなげるAPI開発プラットフォームです。
デザインタブで定義したAPIは、モックサーバー、ドキュメント、テストランナーに接続されます。つまり、同じAPI定義を複数の成果物で再利用できます。
ビジュアルOpenAPIエディタ
Apidogでは、エンドポイントをフォームベースで定義できます。
たとえば、次の情報を画面上で設定できます。
- パス
- HTTPメソッド
- パラメーター
- リクエストボディ
- レスポンス
- スキーマ
- バリデーションルール
- 説明文
- サンプル値
YAMLを直接書かなくてもAPI仕様を作成できます。
必要に応じて、OpenAPIのYAMLまたはJSON表現を確認し、直接編集することもできます。ビジュアルビューと生の仕様は同期されます。
共通スキーマをコンポーネント化する
デザインファーストでは、共通スキーマを最初に設計すると後の不整合を防げます。
例:
components:
schemas:
UserProfile:
type: object
required:
- id
- name
- email
properties:
id:
type: string
description: ユーザーID
name:
type: string
description: 表示名
email:
type: string
format: email
description: メールアドレス
このUserProfileを複数エンドポイントから$refで参照すれば、スキーマ変更を一箇所に集約できます。
schema:
$ref: "#/components/schemas/UserProfile"
リアルタイムドキュメントプレビュー
Apidogでは、エンドポイントを設計するとドキュメントビューも更新されます。
設計中に次の内容を確認できます。
- 説明文が読みやすいか
- フィールド名が理解しやすいか
- リクエスト例が十分か
- レスポンス例が実装イメージと合っているか
- エラーケースが定義されているか
設計段階でドキュメントリンクを共有すれば、PMやフロントエンドメンバーも仕様をレビューできます。
スマートモック:仕様から動作するモックへ
Apidogでは、エンドポイントを保存するとモックサーバーを利用できます。
モックはスキーマに基づいてレスポンスデータを生成します。
例:
-
format: emailの文字列はメールアドレス形式になる -
minimumとmaximumを持つ整数は範囲内の値になる - Enumフィールドは定義済みの値から返る
- ネストされたオブジェクトや配列もスキーマ構造に従う
-
$refコンポーネントも解決される
さらに、特定条件に応じたモックも設定できます。
例:
- パスパラメーターが
0なら404を返す - クエリパラメーターが
status=inactiveなら非アクティブユーザーを返す - 特定のリクエストボディに対してエラーを返す
チームレビューと変更追跡
Apidogでは、API仕様の変更をワークスペースメンバーが確認できます。
デザインファーストで重要なのは、仕様変更をコード変更と同じように扱うことです。
実務では、次のような運用が有効です。
- API変更案を仕様に反映する
- 対象エンドポイントにコメントを追加する
- フロントエンドとバックエンドで確認する
- 合意後に実装へ進む
- CIでスキーマ検証を実行する
デザインファースト vs. コードファースト:実際のトレードオフ
デザインファーストはすべてのケースで最適とは限りません。コードファーストとの違いを整理します。
デザインファーストの利点
- フロントエンドとバックエンドが並行して作業できる
- ドキュメントが後付けではなく仕様そのものになる
- 統合前にAPI契約の問題を発見しやすい
- API変更がレビュー対象になる
- モックを早期に利用できる
- 契約テストを導入しやすい
デザインファーストの欠点
- 実装前に仕様を書く時間が必要
- OpenAPIや仕様ツールの学習が必要
- 仕様と実装を同期させる運用が必要
- ドメイン理解が浅い段階で過剰に決めすぎるリスクがある
コードファーストの利点
- 小規模な実験では開始が速い
- 単独開発ではプロセスが少ない
- 仕様ツールを覚える必要がない
コードファーストの欠点
- ドキュメントが実装からズレやすい
- フロントエンドがバックエンド実装を待ちやすい
- API契約が暗黙的になりやすい
- 破壊的変更を検出しにくい
- リファクタリング時にドキュメント更新が漏れやすい
複数人でAPIを開発する場合、特にフロントエンドとバックエンドが分かれているチームでは、デザインファーストの効果が出やすくなります。
デザインファーストワークフローをサポートするツール
Apidog
Apidogは、ビジュアルエディタ、モック、ドキュメント、テスト、チームレビューを1つのワークフローで扱えるデザインファースト向けプラットフォームです。
特に、仕様からすぐにモックを利用できる点が実装フローで役立ちます。
Stoplight Studio
Stoplight Studioは、OpenAPI編集とSpectralによるリンティングに強いツールです。
APIガバナンスやスタイルルールの強制が必要な組織に向いています。一方で、モックサーバーやテストランナーは内蔵されていません。
SwaggerHub
SwaggerHubは、OpenAPI編集とコラボレーションに対応した成熟したプラットフォームです。
企業利用が多く、Swaggerエコシステムを使っている組織に適しています。モックやテスト機能は限定的です。
Postman(API Builder付き)
PostmanにはOpenAPI仕様を扱うAPIデザイン機能があります。
ただし、デザインとコレクションのワークフローが分かれているため、仕様から一貫してモックやテストへ流す用途では注意が必要です。
Insomnia(ドキュメントモード付き)
InsomniaはOpenAPI仕様の編集と基本的なモックをサポートします。
軽量な選択肢として、個人開発や小規模なAPI設計に向いています。
Apidogでデザインファーストワークフローをセットアップする
ここからは、Apidogでデザインファーストを運用する手順です。
ステップ1:コレクションではなく仕様から始める
新しいプロジェクトを作成したら、まずデザインタブを開きます。
最初に定義する項目は次の通りです。
- エンドポイントパス
- HTTPメソッド
- リクエストパラメーター
- レスポンスステータス
- レスポンススキーマ
最初からすべてを完璧に決める必要はありません。ただし、リクエストを手動で送る前に、最低限のAPI契約を定義します。
ステップ2:共有コンポーネントを先に定義する
エンドポイントを増やす前に、再利用されるスキーマを作成します。
代表例:
- エラーレスポンス
- ページネーション
- ユーザー
- 権限
- 共通メタデータ
例:
components:
schemas:
ErrorResponse:
type: object
required:
- code
- message
properties:
code:
type: string
example: USER_NOT_FOUND
message:
type: string
example: ユーザーが見つかりません
エラーレスポンスを共通化しておくと、API全体の一貫性を保ちやすくなります。
ステップ3:早めにモックURLを共有する
エンドポイントを保存したら、モックURLをフロントエンドに共有します。
フロントエンド側では、環境変数でAPIベースURLを切り替えると便利です。
VITE_API_BASE_URL=https://mock.example.com
実装例:
const baseUrl = import.meta.env.VITE_API_BASE_URL;
export async function fetchUser(id: string) {
const res = await fetch(`${baseUrl}/users/${id}`);
if (!res.ok) {
throw new Error("ユーザー取得に失敗しました");
}
return res.json();
}
これにより、バックエンド完成前でもUI実装を進められます。
ステップ4:コードを書く前にドキュメントをレビューする
生成されたドキュメントを確認します。
レビュー時は、次の観点でチェックします。
- エンドポイント名は意図が伝わるか
- フィールド説明は十分か
- 成功レスポンスだけでなくエラーも定義されているか
- 認証が必要なAPIに認証条件が書かれているか
- フロントエンドが必要な値がレスポンスに含まれているか
ドキュメント上で分かりにくい仕様は、実装後にも誤解を生みます。コードを書く前に修正します。
ステップ5:実装前に仕様をロックする
設計レビューが完了したら、そのスプリントでは仕様を一度固定します。
実装中に変更が必要になった場合は、次の順序で対応します。
- 仕様を更新する
- 関係者にレビューを依頼する
- 合意後にモックを更新する
- 実装を変更する
- テストを更新する
黙って実装だけを変えると、デザインファーストのメリットが失われます。
ステップ6:CIでスキーマ検証を実行する
実装が仕様からズレないように、CIでレスポンススキーマ検証を実行します。
チェック対象の例:
-
200レスポンスが仕様通りか -
400や404のエラー形式が共通化されているか - 必須フィールドが欠けていないか
- 型が一致しているか
CIに組み込むことで、API契約の破壊を早期に検出できます。
よくある質問
デザインファーストはREST API専用ですか?
いいえ。デザインファーストの考え方は、契約を定義できるプロトコルに適用できます。
例:
- REST: OpenAPI
- GraphQL: スキーマファースト
- gRPC: protobuf
- イベント駆動: AsyncAPI
ApidogはRESTおよびGraphQLのデザインをサポートしています。gRPCではprotoファイルが契約ファーストの役割を持ちます。
開発前にすべてのエンドポイントを定義する必要がありますか?
いいえ。機能単位で導入できます。
たとえば、既存APIがコードファーストでも、新しい機能だけをデザインファーストで進められます。
推奨する導入単位は次の通りです。
- 新規画面
- 新規マイクロサービス
- 外部公開API
- フロントエンドとバックエンドの連携が多い機能
デザインファーストはアジャイルスプリントと相性が悪くありませんか?
相性は悪くありません。
スプリント開始時に、そのスプリントで実装するAPI契約を定義します。その後、フロントエンドとバックエンドが並行して作業します。
実務では、スプリント計画に「API仕様レビュー」を含めると運用しやすくなります。
実装中に仕様から逸脱する必要が出たらどうしますか?
まず仕様を更新します。
正しい順序は次の通りです。
- 仕様の変更案を作る
- フロントエンド、バックエンド、関係者で確認する
- 合意後に実装を変更する
- テストを更新する
これにより、仕様が単一の信頼できる情報源として維持されます。
ApidogのOpenAPIエクスポートからサーバースタブを生成できますか?
はい。ApidogからOpenAPI 3.xとして仕様をエクスポートし、標準的なコードジェネレーターでサーバースタブを生成できます。
たとえば、openapi-generatorは多くのサーバー言語やフレームワークをサポートしています。
仕様のバージョン管理はどうすればよいですか?
Apidogはプロジェクト内で変更履歴を保持します。
並行してメジャーバージョンを保守する場合、たとえばv1とv2を同時に運用する場合は、別プロジェクトまたはブランチで管理すると分かりやすくなります。
まとめ
デザインファーストは、API仕様を開発の中心に置くワークフローです。
導入時には仕様を書く手間がありますが、次の効果が期待できます。
- フロントエンドとバックエンドの並行開発
- ドキュメントと実装のズレの削減
- 統合時の手戻り削減
- API契約の明確化
- モックとテストの早期活用
重要なのは、仕様作成を重い作業にしないことです。仕様を書くのが面倒であれば、チームはそのプロセスをスキップします。
Apidogのビジュアルエディタ、インスタントモック、ドキュメントプレビュー、テスト機能を使うと、デザインファーストを実務フローに組み込みやすくなります。
Top comments (0)