Webシステムを開発するとき、
「まず画面を作って、必要になったAPIを後から追加する」
という進め方があります。
一方で、最初にAPIの役割や入出力を整理してから、フロントエンドや外部システムを接続していく考え方が「APIファースト設計」です。
APIファースト設計が特に有効なのは、
- Webブラウザ以外からも利用する
- 将来モバイルアプリを作る可能性がある
- 他社システムと連携したい
- 複数のフロントエンドを持つ
- フロントエンドとバックエンドを並行開発したい
- 将来的な機能追加を見据えている
といったシステムです。
ただし、APIを作れば自動的に拡張性の高いシステムになるわけではありません。
重要なのは、画面の都合だけでAPIを作るのではなく、「システムとしてどの機能・データをどのような契約で提供するか」を先に整理することです。
この記事では、API first設計の基本から、メリット・デメリット、具体的な設計手順、OpenAPI、認証、バージョニング、外部連携まで実務を想定して解説します。
APIファースト設計とは
APIファーストとは、システム開発においてAPIを後付けの機能として扱うのではなく、システムの主要なインターフェースとして先に設計する考え方です。
例えば顧客管理システムを作るとします。
画面中心で考える場合は、
顧客一覧画面を作る
↓
顧客詳細画面を作る
↓
顧客登録画面を作る
↓
画面に必要なAPIを追加する
という流れになることがあります。
APIファーストでは先に、
- 顧客一覧を取得する
- 顧客詳細を取得する
- 顧客を登録する
- 顧客を更新する
- 顧客を削除する
というシステム側の機能を整理します。
そのうえで、
Web画面
↓
API
↓
業務ロジック・データベース
という構造を作ります。
Web画面だけでなく、将来的にモバイルアプリや外部システムからも同じAPIを利用しやすくなります。
APIとは
APIはApplication Programming Interfaceの略です。
簡単にいえば、システム同士が機能やデータをやり取りするための窓口です。
例えば顧客管理システムに、
GET /customers
というAPIがあれば、顧客一覧を取得できます。
また、
POST /customers
で新しい顧客を登録するといった設計もできます。
ユーザーが直接APIを操作する必要はありません。
Web画面で「顧客一覧」を開いたとき、裏側でフロントエンドからAPIへリクエストし、取得したデータを画面へ表示します。
APIファーストと「APIを使っているシステム」は同じではない
APIファーストについて理解するときに重要なのがこの違いです。
現在のWebシステムでは、フロントエンドとバックエンドの通信にAPIを利用すること自体は珍しくありません。
しかし、
「APIを利用している」
ことと、
「APIファーストで設計している」
ことは同じではありません。
例えば画面をすべて作ったあと、
「この画面で必要だからこのAPIを作ろう」
と都度追加しているだけなら、画面中心の設計になっている可能性があります。
APIファーストでは先に、
- どのリソースを扱うか
- どの操作を提供するか
- 何を入力するか
- 何を返すか
- エラー時にどうするか
といったAPIの契約を整理します。
APIファースト設計が向いているシステム
すべてのシステムでAPIファーストを大規模に導入する必要はありません。
特に効果が出やすいケースを見ていきます。
Webとモバイルアプリの両方を提供する
例えば予約サービスを、
- Webサイト
- iPhoneアプリ
- Androidアプリ
から利用できるようにするとします。
それぞれで予約処理を別々に実装すると、ロジックが重複しやすくなります。
APIとして、
予約一覧取得
予約登録
予約変更
予約キャンセル
を提供しておけば、それぞれのクライアントから共通して利用できます。
外部システムと連携する
例えば受注管理システムに登録されたデータを、会計システムへ連携したいケースです。
APIが整理されていれば、
受注システム
↓
API
↓
外部システム
という連携を作りやすくなります。
他にも、
- CRM
- 会計システム
- 在庫管理
- ECサイト
- 決済サービス
- 配送サービス
- AIシステム
などとの連携が考えられます。
フロントエンドとバックエンドを分業する
開発チームで、
フロントエンド担当
バックエンド担当
が分かれている場合にもAPIファーストは有効です。
先にAPI仕様を決めておけば、
フロントエンド:
API仕様に基づいて画面開発
バックエンド:
API仕様に基づいて実装
という形で並行して開発しやすくなります。
将来的にSaaS化したい
最初は自社向けWebシステムでも、将来的にSaaSとして提供する可能性がある場合があります。
例えば、
- 在庫管理
- 顧客管理
- 案件管理
- 発注管理
などです。
APIを意識してシステム機能を分離しておけば、後から、
- 他社システムとの連携
- モバイル対応
- 顧客向けAPI提供
などへ拡張しやすくなる可能性があります。
APIファースト設計のメリット
1. フロントエンドとバックエンドを分離しやすい
APIを境界として、
フロントエンド
↓
API
↓
バックエンド
を分けられます。
フロントエンド側の技術を変更しても、API仕様が維持されていればバックエンドへの影響を抑えられる場合があります。
例えば、
Web:Next.js
モバイル:Swift / Kotlin
という構成でも、同じAPIを利用できます。
2. 外部連携しやすい
画面からしか操作できないシステムでは、外部システムと連携するときに新たな仕組みを追加しなければならない場合があります。
最初からAPIとして機能が整理されていれば、そのAPIを外部連携にも利用できる可能性があります。
例えば発注管理システムなら、
発注データ登録
↓
API
↓
在庫管理システム
といった連携です。
3. 並行開発しやすい
API仕様が先に決まっていれば、バックエンドの完成を待たずにフロントエンドを作ることもできます。
例えばAPIのレスポンスとして、
- customer_id
- customer_name
- status
が返ると決まっていれば、モックデータを使って画面を作れます。
これによって開発チーム内で作業を分担しやすくなります。
4. テストしやすい
画面操作だけでなく、API単位で動作確認できます。
例えば、
「顧客登録APIへ正しいデータを送ったら登録できるか」
「必須項目がなければエラーになるか」
「権限のないユーザーから拒否されるか」
といったテストです。
業務ロジックをAPIとして明確にすると、自動テストとの相性もよくなります。
5. 将来のUI変更へ対応しやすい
現在はWeb画面でも、将来的に、
- モバイルアプリ
- タブレット
- 管理画面
- AIチャット
- 音声インターフェース
などが追加される可能性があります。
機能がAPIとして整理されていれば、新しいUIから既存機能を利用しやすくなります。
APIファースト設計のデメリット
APIファーストにはメリットがありますが、すべての開発で採用すればよいわけではありません。
設計工程が増える
小規模なシステムでも、
- API一覧
- リクエスト
- レスポンス
- エラー
- 認証
- バージョニング
まで細かく設計すると、初期工数が増えます。
例えば数画面だけの社内ツールで、今後外部連携の予定もない場合には、過剰設計になる可能性があります。
APIを細かくしすぎると複雑になる
「APIファーストだから細かくAPIを分けよう」
と考えすぎるのも問題です。
API数が増えると、
- 仕様管理
- 認証
- テスト
- ドキュメント
- バージョニング
の管理対象も増えます。
必要な業務単位を整理して設計することが重要です。
フロントエンド都合との調整が必要
理想的なAPI構造と、実際の画面で必要なデータが一致しない場合があります。
例えば1画面を表示するだけなのに、
顧客取得
案件取得
契約取得
請求取得
という4回のAPIアクセスが必要になるケースです。
このような場合は、画面向けにデータをまとめるBFFなどの構成を検討することもあります。
APIファースト設計の基本的な進め方
ここからは実際の設計手順を見ていきます。
1. まず業務と要求を整理する
最初からエンドポイントを考えるのではありません。
例えば顧客管理システムであれば、
- 顧客を登録したい
- 顧客を検索したい
- 顧客情報を変更したい
- 顧客を案件と紐付けたい
といった要求を整理します。
APIは業務を実現するための手段です。
業務要件が曖昧な状態でAPIだけ設計すると、後から作り直しになる可能性があります。
2. リソースを整理する
REST APIでは、扱う対象をリソースとして整理することがよくあります。
例えば顧客管理なら、
- customers
- projects
- contracts
- users
などです。
発注管理なら、
- purchase-orders
- suppliers
- products
- approvals
などが考えられます。
データベースのテーブル名をそのままAPIにすればよいわけではありません。
利用者や業務から見て意味のある単位で整理します。
3. 必要な操作を整理する
例えば顧客に対して、
- 一覧取得
- 詳細取得
- 登録
- 更新
- 削除
が必要だとします。
REST APIなら一例として、
GET /customers
GET /customers/{id}
POST /customers
PATCH /customers/{id}
DELETE /customers/{id}
と設計できます。
ただし、実際にはすべてのデータでCRUDが必要とは限りません。
例えば請求書は発行後に直接DELETEできないなど、業務ルールを優先します。
4. リクエストを決める
登録APIで何を受け取るか決めます。
例えば顧客登録なら、
- 顧客名
- 担当者名
- メールアドレス
- 電話番号
などです。
ここで重要なのが、
「画面にある入力項目を全部そのままAPIへ送る」
だけで考えないことです。
どの項目が必須か、どの形式を許可するかをAPI側でも定義します。
5. レスポンスを決める
APIからどのような情報を返すか決めます。
例えば顧客登録成功後に、
- 顧客ID
- 顧客名
- 登録日時
- ステータス
などを返す設計が考えられます。
返却項目を毎回場当たり的に追加すると、利用側が依存して変更しにくくなります。
6. エラー形式を統一する
API設計で見落とされやすいのがエラーです。
例えば入力エラー時に、
あるAPI:
「入力が間違っています」
別のAPI:
「400」
別のAPI:
独自JSON
となっていると、フロントエンド側で扱いにくくなります。
例えば、
- error_code
- message
- field
- details
など、共通形式を決めておくと実装しやすくなります。
HTTPステータスコードも整理する
Web APIではHTTPステータスコードを適切に利用します。
代表的には、
- 200:成功
- 201:作成成功
- 400:不正なリクエスト
- 401:認証が必要
- 403:権限がない
- 404:対象が存在しない
- 409:競合
- 500:サーバー内部エラー
などです。
すべての失敗を200で返し、レスポンス本文だけでエラー判定する設計より、HTTPの意味を活用した方が利用側も理解しやすくなります。
OpenAPIを使ってAPI仕様を定義する
APIファースト開発では、OpenAPIなどを利用してAPI仕様を定義する方法があります。
例えば、
- URL
- HTTPメソッド
- パラメータ
- リクエスト
- レスポンス
- 認証方式
などを機械的に扱える形式で記述できます。
これによって、
設計
↓
ドキュメント生成
↓
フロントエンド確認
↓
バックエンド実装
↓
テスト
という流れを作りやすくなります。
API仕様を「契約」として扱う
APIファーストで特に重要なのが、API仕様をフロントエンドとバックエンドの契約として扱う考え方です。
例えば、
API仕様では customer_name が文字列として返る
と決めたのであれば、バックエンド側で突然項目名を name に変更すると、フロントエンドが動かなくなる可能性があります。
APIを公開した後は、
「内部実装だから自由に変更できる」
とは考えないことが重要です。
APIの認証・認可を設計する
APIを作る場合、誰でも利用できる状態にしてはいけないケースがほとんどです。
例えば業務システムなら、
ログイン
↓
認証情報を確認
↓
APIへアクセス
↓
権限判定
↓
データ返却
という流れになります。
認証と認可は別に考える
認証は、
「誰なのか」
を確認します。
認可は、
「その人がその操作をしてよいのか」
を確認します。
例えば一般社員がログインしていても、管理者向けユーザー削除APIを実行できてはいけません。
そのため、
認証済みか
↓
必要な権限があるか
↓
対象データへアクセスできるか
まで確認します。
マルチテナントSaaSではテナント判定も必要
複数企業が1つのSaaSを利用する場合は、
- 認証
- 権限
- tenant_id
を組み合わせます。
例えばA社ユーザーが、
GET /customers/100
へアクセスしたとき、customer_idだけを確認するのではなく、
「顧客100がA社のデータなのか」
まで確認する必要があります。
APIファーストで設計する場合は、このアクセス制御もAPI仕様・実装ルールとして統一しておくことが重要です。
APIのバージョニングを考える
APIを外部公開する場合や複数クライアントから利用する場合、変更方法も考えておく必要があります。
例えば現在、
GET /api/v1/customers
を利用しているアプリがあるとします。
仕様を大きく変更したい場合、
GET /api/v2/customers
のように新しいバージョンを用意する方法があります。
すべての変更でバージョンを増やす必要はありませんが、
「既存利用者を壊す変更」
をどのように扱うかは決めておく必要があります。
後方互換性を意識する
例えばレスポンスから、既存クライアントが使用している項目を突然削除すると不具合につながります。
そのため、
- 新しい項目を追加する
- 古い項目を一定期間残す
- 廃止予定を通知する
- 新バージョンへ移行する
などの方法があります。
特に外部企業へ公開しているAPIでは、変更管理が重要です。
API一覧を作ると全体像を整理しやすい
要件定義・基本設計では、API一覧を作ると開発範囲を整理できます。
例えば、
| API | 用途 |
|---|---|
| GET /customers | 顧客一覧取得 |
| GET /customers/{id} | 顧客詳細取得 |
| POST /customers | 顧客登録 |
| PATCH /customers/{id} | 顧客更新 |
| GET /projects | 案件一覧取得 |
| POST /projects | 案件登録 |
といった形です。
必要に応じて、
- 認証要否
- 必要権限
- 利用画面
- 外部公開可否
なども整理します。
外部公開APIと内部APIは分けて考える
Webフロントエンドが利用するAPIを、そのまま外部企業へ公開できるとは限りません。
内部APIは、
- 頻繁に変更する
- 細かい業務情報を返す
- 自社フロントエンド専用
という設計でも問題ない場合があります。
一方、外部公開APIでは、
- 仕様の安定性
- バージョニング
- 利用制限
- APIキー管理
- ドキュメント
- SLA
などを考える必要があります。
そのため、
内部API
外部公開API
を分ける設計もあります。
APIキーやOAuthなど認証方式を選ぶ
外部システムとのAPI連携では、ログイン画面を利用できない場合があります。
そのため、
- APIキー
- OAuth
- クライアントクレデンシャル
- アクセストークン
などを利用する場合があります。
どの方式が適切かは、
- 誰が利用するのか
- ユーザー操作があるか
- システム同士の連携か
- 権限をどこまで分けるか
によって変わります。
APIの利用回数を制限する
外部公開APIでは、大量アクセスへの対策としてレート制限を設けることがあります。
例えば、
1分間に100リクエストまで
といった制御です。
これによって、
- 誤実装による大量リクエスト
- 不正アクセス
- サーバー負荷
などを抑えられます。
ただし内部システムでも、大量処理が発生するAPIについては負荷設計が必要です。
一覧APIではページネーションを考える
例えば顧客が10件なら、
GET /customers
で全部返しても問題ない場合があります。
しかし顧客が100万件になった場合、全件を一度に返すのは現実的ではありません。
そのため、
- page
- limit
- cursor
などを使って一部ずつ取得する設計にします。
例えば、
1ページ目:100件
2ページ目:100件
という方法です。
検索・ソート条件についてもAPI設計時に整理します。
APIでN+1のような過剰通信を起こさない
APIを細かく分けすぎると、1画面を表示するために大量の通信が必要になる場合があります。
例えば案件一覧で、
案件100件取得
↓
案件ごとに顧客APIを100回呼ぶ
という設計です。
API設計では理論上きれいな分割だけでなく、実際にクライアントがどう使うのかも考える必要があります。
必要に応じて、
- レスポンスへ関連情報を含める
- 一括取得APIを作る
- BFFを利用する
などを検討します。
BFFとは
BFFはBackend for Frontendの略です。
Web画面やモバイルアプリなど、それぞれのフロントエンドに適したデータをまとめて提供するバックエンド層です。
例えば内部では複数APIを利用していても、
Web画面
↓
BFF
↓
顧客API
案件API
契約API
という構成にすることで、フロントエンドからの通信をシンプルにできます。
APIファーストとBFFは対立する考え方ではなく、システム構成によって組み合わせることができます。
APIファーストとマイクロサービスは同じではない
APIファーストというとマイクロサービスを連想することがありますが、別の考え方です。
1つのアプリケーションで構成されたモノリスでも、APIファースト設計はできます。
例えば、
Next.jsフロントエンド
↓
REST API
↓
1つのバックエンド
↓
PostgreSQL
というシンプルな構成でも問題ありません。
最初からマイクロサービスへ分割する必要はありません。
APIファーストは「システム境界のインターフェースを先に整理する考え方」であり、インフラ構成とは分けて考えます。
APIファーストでよくある失敗
APIを作ること自体が目的になる
APIファーストは、APIを大量に作るための考え方ではありません。
業務上不要なAPIを作っても、開発・テスト・保守対象が増えるだけです。
まず業務要求を整理します。
画面とAPIの粒度が合っていない
APIを細かく分けすぎて、1画面表示するだけで大量アクセスが発生するケースです。
実際の利用方法まで含めて確認します。
エラー形式がAPIごとに違う
開発者ごとに自由に実装すると、エラー処理がバラバラになります。
共通ルールを決めます。
API仕様書が更新されない
最初にOpenAPIなどで仕様を作っても、実装変更時に更新しなければ実態とずれていきます。
仕様書を成果物として終わらせず、開発フローの中で維持する必要があります。
認可処理をフロントエンドに任せる
管理者ボタンを非表示にするだけでは不十分です。
API側で権限確認します。
既存クライアントを考えず仕様変更する
項目名やレスポンス形式を突然変更すると、既存のWebアプリや外部連携が壊れる可能性があります。
APIは利用者との契約として管理します。
APIファースト設計の進め方
実際の開発では、次の順番で進めると整理しやすくなります。
1. 業務フローを整理する
誰が何をするのかを明確にします。
2. 必要な機能を整理する
例えば、
- 顧客登録
- 案件登録
- 契約締結
- 請求処理
などです。
3. データ・リソースを整理する
顧客、案件、契約などの関係を整理します。
4. API一覧を作る
必要なエンドポイントを洗い出します。
5. リクエスト・レスポンスを定義する
入力項目、返却項目、データ形式を決めます。
6. エラー仕様を定義する
共通のエラー形式を決めます。
7. 認証・認可を設計する
誰がどのAPIを利用できるか決めます。
8. API仕様を共有する
OpenAPIなどを使い、フロントエンド・バックエンド間で認識を合わせます。
9. モックを使って並行開発する
仕様をもとにフロントエンドとバックエンドを並行して進めます。
10. 結合テストを行う
実装したAPIが仕様通り動作するか確認します。
【コピペ用】APIファースト設計チェックリスト
API設計を始めるときは、次の内容を整理すると進めやすくなります。
利用者
- Web画面から利用するか
- モバイルアプリから利用するか
- 外部システムから利用するか
- 社外へAPI公開するか
API
- どの機能をAPI化するか
- リソースは何か
- 一覧取得が必要か
- 詳細取得が必要か
- 登録・更新・削除が必要か
リクエスト
- 必須項目は何か
- 任意項目は何か
- データ形式は何か
- バリデーションルールは何か
レスポンス
- どの項目を返すか
- 一覧と詳細で何を変えるか
- ページネーションが必要か
- 関連データをどこまで含めるか
エラー
- HTTPステータスコードをどう使うか
- エラーコードを持つか
- 入力エラーをどう返すか
- 利用者向けメッセージをどう扱うか
セキュリティ
- 認証方式は何か
- APIごとの権限は何か
- テナント分離が必要か
- APIキーをどう管理するか
- レート制限が必要か
運用
- API仕様書をどう管理するか
- バージョニングが必要か
- 廃止APIをどう扱うか
- 利用ログを残すか
- 監視方法をどうするか
APIファースト設計に関するよくある質問
小規模なWebシステムでもAPIファーストにするべきですか?
必ずしも必要ではありません。
数画面だけの社内システムで、外部連携やモバイル対応の予定がなければ、シンプルな構成の方が開発しやすい場合があります。
一方、将来的な外部連携や複数UIを想定しているなら、初期段階からAPI境界を整理する価値があります。
APIファーストならフロントエンドとバックエンドは完全に分離すべきですか?
必ずしも別プロジェクトや別サーバーにする必要はありません。
1つのアプリケーション内でも、API境界を明確に設計することはできます。
重要なのは物理構成より責務を整理することです。
REST APIでなければAPIファーストではありませんか?
APIファーストはRESTだけを意味するものではありません。
GraphQLなど他の方式でも、インターフェースを先に定義して開発する考え方は適用できます。
OpenAPIは必須ですか?
必須ではありませんが、REST APIの仕様共有やドキュメント管理には有効です。
特に複数人開発や外部公開APIでは、仕様を機械的に管理できるメリットがあります。
APIを外部公開する予定がなくても意味はありますか?
あります。
Webフロントエンドとバックエンドの責務分離やテスト容易性などのメリットがあります。
ただし、規模に対して過剰な設計にならないようにすることが重要です。
APIファーストにすると開発費は高くなりますか?
初期設計の工数は増える場合があります。
一方、フロントエンドとバックエンドの並行開発や将来の外部連携、モバイル対応などを見据えると、後から作り直すコストを抑えられる可能性があります。
短期的な開発費だけではなく、将来の拡張性まで含めて判断します。
API設計から開発会社へ相談できますか?
可能です。
API一覧やOpenAPIを発注側で用意しておく必要はありません。
現在の業務、必要な画面、将来連携したいシステムなどを整理すれば、必要なAPI構成を検討できます。
hiro-dev-labではAPIを含めたWebシステム設計から相談できます
APIファースト設計で重要なのは、技術的にAPIを作ることではありません。
まず、
現在の業務
↓
必要な機能
↓
扱うデータ
↓
利用する画面・システム
↓
APIとして提供する境界
を整理する必要があります。
hiro-dev-labでは、
- 業務ヒアリング
- 要求整理
- 要件定義
- 業務フロー整理
- 機能一覧
- API一覧
- API設計
- データベース設計
- 認証・権限設計
- Webシステム開発
- 外部システム連携
- AIサービスとのAPI連携
など、APIを作る前の要求整理から相談できます。
例えば、
「今はWebだけだが将来アプリも作りたい」
「顧客企業からAPI連携を求められている」
「複数システムへ同じデータを入力している」
「フロントエンドとバックエンドを分けて開発したい」
「将来的にSaaSとして外部連携機能を提供したい」
といった段階からでも設計できます。
APIファースト設計の本質は、単にREST APIを作ることではありません。
システムが提供する機能とデータの境界を明確にし、そのインターフェースを安定した契約として設計することが、Web・モバイル・外部連携へ拡張しやすいシステムを作るための基本です。