システム開発
約21分
更新

APIファースト開発:フロントエンドとバックエンドの疎結合化

執筆・編集Malake株式会社
まず押さえたいこと

APIファースト開発とは、実装の前に、APIを使う側(画面や連携先)と提供する側で、入力・出力・エラー・権限などの振る舞いを合意し、その後の変更も同じ記録で管理する進め方です。すべての仕様を最初に固定することではなく、合意した範囲と未確認の点を分けて進めます。

この記事の要点

APIファースト開発では、利用場面と入力・出力・エラー・権限を先に合意し、仕様の管理者と版を決めてから実装します。疎結合は責務と依存関係を整理することで、機能を別のサービスに分けるマイクロサービス化とは別の判断です。APIを変えるときは、任意の項目や値の追加でも利用側への影響を確かめ、連絡・移行・廃止の条件を記録します。BFFは画面ごとの要件が大きく異なる場合に検討し、認可はバックエンドでも対象データと操作ごとに行います。OpenAPIの検査や契約テストと、業務・権限・失敗時の受入は分けて確かめます。

この記事でわかること

  • APIファーストの意味と、OpenAPIとSwaggerの違い
  • 疎結合(責務の分離)とマイクロサービス化(配備の分割)の違い
  • API仕様の確認票と、互換性に影響する変更・変更記録の書き方
  • BFFを導入する条件と、認証・認可の信頼境界の置き方
  • OpenAPIの検査・契約テスト・業務の受入を分けた確認の方法

APIファーストとは:仕様を先に合意する進め方

APIファーストとは、実装の前に、APIを使う側と提供する側で、利用場面と入力・出力・エラー・権限などの振る舞いを合意し、その後の変更も記録で管理する進め方です。使う側は、画面のほか、別のシステムとの連携や夜間の一括処理などです。合意した内容を仕様として残すと、画面と処理を並行して作りやすくなり、変更するときの影響も確かめやすくなります。

API仕様の書き方として広く使われるのがOpenAPIです。OpenAPI Specificationは、HTTP APIを記述するための、プログラミング言語に依存しない標準です(OpenAPI Specification v3.2.1、2026年9月10日公開、確認日:2026年10月21日)。Swaggerは、OpenAPIの記述を編集・表示する関連ツールの名前として使われることが多く、仕様そのものとは区別します。古い版のOpenAPIで書かれた仕様がある場合も、最新版へ移すことはAPIファーストを始める条件ではありません。

仕様を先に書く方法(Design First)と、実装から仕様を書き出す方法(Code First)は、どちらかが常に優れているわけではありません。利用側が多い、外部の会社と連携する、複数のチームで同時に作るといった場合は、先に仕様を合意する利点が大きくなります。既存の実装が多い場合は、実装から仕様を書き出し、実際の振る舞いと照らして直す方法も選べます。どちらの場合も、仕様の管理者と版を決め、仕様と実装の違いを確かめる手順を持つことが前提です。

疎結合とマイクロサービスの違い:分ける範囲を決める

疎結合は、責務と依存関係を整理し、決めた接点(インターフェース)を守れば、ほかの部分に影響を広げずに変更できるようにする設計です。マイクロサービス化は、機能を別のプロセスや配備の単位に分けることで、疎結合と同じ意味ではありません。1つのアプリとして配備するシステム(モノリス)でも、画面・業務処理・データの扱いを層やモジュールに分け、依存の向きを整理できます。Microsoftの解説も、層は論理的な分離であり、1つの配備単位のまま複数の層に分けることは一般的だとしています(Microsoft Learn:Common web application architectures、確認日:2026年10月21日)。

反対に、サービスを別々に分けても、ほかのサービスの内部のデータ構造や処理の順序に強く依存していれば、片方の変更がもう一方に影響します。分けたサービスの間は通信になるため、通信の失敗や遅延、監視、データの整合性、配備の手順といった負担も増えます。

そのため、何を独立して変えたいのか(画面だけを頻繁に変えたい、連携先が増える、一部の機能だけ負荷が高いなど)から、分ける範囲を決めます。バックエンドを別の言語や基盤へ書き換える場合も、APIの仕様に加えて、エラーの返し方、並び順、処理時間などの振る舞いが変わらないかを確かめます。既存システムを段階的に移す方法はレガシーシステム移行の進め方、サイト全体の構成の選び方はモダンWeb開発の構成判断で扱っています。

OpenAPIで合意する項目:入力・出力・エラー・権限

API仕様の確認では、入力と出力の形に加えて、誰が使うか、エラーの返し方、権限、件数や再試行の条件まで、利用側と提供側で合意します。次の表は、仕様の確認票の例です。項目ごとに確認済みと未確認を分けて記録し、APIと仕様書の版、仕様の管理者を併記します。

表は横にスクロールできます →

▼ API仕様の確認票(例)
項目合意する内容確認方法担当の例
用途・利用側どの画面・連携先・一括処理が、何のために使うか。利用側の連絡先利用側の一覧と連絡先を記録する。分からない利用者は未確認として残す提供側の責任者、利用側の担当
入力必須・任意の項目、形式と制約(文字数・範囲)、省略したときの既定値仕様の記述を確認し、境界の値で試験する提供側・利用側の開発者
出力項目の型、金額などの単位、日付・時刻の形式とタイムゾーン、取りうる値(列挙値)仕様と実際の応答の例を照らす。未知の値を受けたときの扱いを決める提供側・利用側の開発者
エラーHTTPステータス、エラーの種類と内容。内部の情報は含めず、問い合わせ用の追跡IDを返すかエラーごとの応答の例と、利用側での表示・処理を確認する提供側の開発者、運用担当
認証・認可利用者や連携システムをどの方式で確認するか。どのデータ・テナント・操作を許可するか権限ごとに試験し、ほかの利用者のデータを取得・変更できないことを確かめる提供側の開発者、業務の責任者
一覧・件数・頻度一覧の並び順とページの分け方、1回の件数、呼び出し頻度の上限、応答時間の目安件数が多い条件と、上限を超えたときの応答を試す提供側の開発者、運用担当
タイムアウト・再試行応答を待つ時間、再試行してよい操作、同じ依頼が2回届いたときの扱い(二重登録の防止)と副作用通信の失敗を想定して試験し、再試行後のデータを確認する提供側・利用側の開発者

OpenAPIでは入力・出力・エラー・認証の方式などを記述できますが、業務上の意味(どの状態のときに何を許すか)、運用の連絡先、利用側ごとの移行の期限などは、仕様書の説明や別の記録で補います。仕様を書いたことで、実装がそのとおりに動くことや、権限の確認が行われることが保証されるわけではありません。型定義と、実行時に届くデータの検査の役割分担は、TypeScriptで保守性の高いコードを維持する記事で扱っています。

APIの互換性と変更管理:変更・移行・廃止を分ける

APIを変えるときは、変更の種類ごとに利用側への影響を確かめ、変更・移行・旧版の廃止を分けて合意します。必須の入力を増やす、項目を削除・改名するといった変更は、利用側の修正が必要になります。任意の項目や列挙値の追加でも、受け取る項目を厳密に検査する利用側や、未知の値を想定していない利用側には影響が出ます。GoogleのAPI設計指針(AIP-180)も、応答の列挙値を追加すると、利用側のコードが新しい値を適切に扱えない可能性があるとして注意を求めています(Google AIP-180:Backwards compatibility。Googleの設計指針で、すべてのAPIに共通の規格ではありません。確認日:2026年10月21日)。

表は横にスクロールできます →

▼ 変更の種類と影響の確認
変更の例影響する可能性確認すること対応の例
必須の入力を追加今の利用側の依頼がエラーになる利用側がその値を送れるか、既定値で補えるか任意の項目として追加し、既定値で今の動作を保つ。必須にする場合は移行の期限を合意する
出力の項目の削除・改名・型の変更項目を読む画面や連携が動かなくなるどの利用側がその項目を使っているか古い項目を残したまま新しい項目を加える。削除は移行を確かめてから
任意の出力項目の追加受け取る項目を厳密に検査する利用側や、項目の並びに依存する一括処理で失敗する利用側が未知の項目を無視できるか追加の予定を連絡し、利用側の検査を確かめてから反映する
出力の列挙値の追加画面が未知の状態を表示できない。連携先の変換表に値がない未知の値を受けたときの画面・処理の扱い利用側の対応を先に済ませ、段階的に反映する
既定値・並び順・ページ分割・単位の変更エラーにならないまま、件数や金額の解釈がずれる利用側が既定値や並び順に依存しているか既定値は変えず、新しい指定を追加する。変える場合は明示して連絡する
権限・エラー応答の変更これまで見えたデータが見えなくなる。利用側の再試行の判断が変わる利用側のエラー処理と、影響を受ける利用者権限ごとの試験をやり直し、利用側の問い合わせ先を決める

変更は、利用側の棚卸し、影響の確認、仕様と試験の更新、連絡と移行条件の合意、段階的な反映、利用状況・エラー・利用者の確認の順で進め、旧版の廃止は合意した条件を満たしてから行います。新しい版(v2)を作れば影響がなくなるわけではなく、旧版を使う利用側の移行と、両方の版を並行して保守する負担が残ります。夜間の一括処理、更新されていない旧版のアプリ、利用者が分からない連携を残したまま、期限だけで旧版を止めません。月次の処理のように呼び出しの間隔が長い利用側もあるため、アクセスの記録に出てこないことだけで、使われていないと判断しません。

HTTPには、非推奨になったことを知らせるDeprecationヘッダー(RFC 9745)や、応答しなくなる見込みの時期を知らせるSunsetヘッダー(RFC 8594。Informationalの文書)があります。Deprecationを付けてもAPIの動作は変わらず、Sunsetの時刻も目安として扱われるため、どちらも利用側への連絡と合意の代わりにはなりません。開発や保守の会社が変わる場合は、仕様と試験の所在、連携先への連絡の担当、受入と運用の責任も引き継ぎます。契約や資料の引き継ぎ全体は、システム開発会社を変更する前の確認事項で扱っています。

次の表は、変更記録の記入例です。社内の受注API(/orders)の応答の状態(status)に、保留中を表す on_hold を加える場面を、説明のために想定しました。現在の値は new・confirmed・cancelled の3つとします。

表は横にスクロールできます →

▼ 変更記録の記入例(statusにon_holdを追加)
記録項目今回の記入例未確認・判断条件担当と次の行動
変更の目的保留中の注文を区別するため、statusに on_hold を追加する。必須の入力と既存の値は変えない保留中の注文に、確定・取消・出荷のどの操作を許すかが、業務として決まっているか業務の責任者が、保留中の扱いを決める
利用側と影響Web画面と、夜間に注文をCSVへ出力する連携の2つ画面が未知の状態を表示できるか。CSVの変換先が on_hold を受け付けるか。ほかに利用者がいないか画面の担当と連携の担当が確認する。夜間連携は未確認
受入応答の形に加えて、保留中の表示、後続の処理(出荷の指示が出ないこと)、権限とテナントの境界を試す試験の担当と証跡の保存先。この時点では試験を行っていない提供側の開発者が試験項目を作り、業務の責任者が受け入れる
反映と戻し方夜間連携の確認が終わるまで、公開を保留するon_hold のデータが保存された後は、コードを戻すだけでは古い仕様に戻らない。保存済みのデータ、利用側、処理中の注文の扱い戻し方とデータの扱いを決めてから、反映日を決める

この例では、夜間連携などの確認が残っているため公開を保留し、確認の担当と期限を決めます。既存の版で追加できるかは、利用側への影響と対応を確認して判断します。現時点では、新しい版の追加や旧版の廃止は決めていません。

BFFとは:導入する条件と運用上の負担

BFF(Backend for Frontend)は、画面やアプリごとの要件に合わせて、データの集約や整形を担う層です。たとえば、Web画面とスマートフォンアプリで必要なデータの量や形が大きく異なる場合に、共通のAPIを画面ごとに作り替える代わりに、画面ごとのBFFで吸収します。一方で、BFFを増やすと、配備・監視・保守の対象と通信の段階が増え、応答の遅れや同じ処理の重複も起こり得ます。利用する画面が1つだけの場合や、画面ごとの要求が似ている場合は、合わないこともあります(Microsoft Learn:Backends for Frontends pattern、確認日:2026年10月21日)。

表は横にスクロールできます →

▼ BFFを置くかどうかの判断
構成合う条件増える負担確認する担当
共通のAPIを直接使う利用する画面が少なく、必要なデータの形が似ている画面の都合でAPIを変える依頼が提供側に集まる。画面ごとの整形が利用側に増える提供側の責任者、画面の担当
共通のゲートウェイを置く認証の確認、呼び出し頻度の制限、記録などを入口でそろえたいゲートウェイの設定と、障害時の影響範囲の管理。ゲートウェイを通らない経路を残さない基盤・運用の担当
画面ごとのBFFを設ける画面やアプリごとに必要なデータの量や形が大きく異なり、画面の担当が自分で変更したいBFFの数だけ配備・監視・保守が増える。通信の段階が増えて遅れが出る。同じ処理が重複する画面の担当(BFFの所有者)、運用担当

ゲートウェイは認証の確認や頻度の制限などの共通の制御、BFFは画面ごとの集約と整形、という役割の違いがあります。1つの実装が両方を担う場合もあり、すべてのシステムを「ゲートウェイ、BFF、バックエンド」の三段にする必要はありません。BFFはマイクロサービスの必須の部品でも、認証を任せれば済む層でもありません。Next.jsのサーバー側の処理やCloudflare WorkersもBFFを置く場所の候補ですが、画面の数、運用の担当、既存の基盤から選びます。

APIの認証・認可:BFFとバックエンドの信頼境界

認証は「誰か」を確かめること、認可は「その人が、対象のデータ・テナント・操作を使ってよいか」を判断することです。BFFやゲートウェイで認証しても、バックエンドで対象データごとの認可を省けるわけではありません。OWASPは、公開していないREST APIでは、各エンドポイントでアクセス制御を行うこととしています(OWASP:REST Security Cheat Sheet)。また、ログインしている利用者のIDと、依頼に含まれるIDを比べるだけでは、ほかの利用者のデータへのアクセスを防ぐ対策として十分ではないとしています(OWASP API Security Top 10 2023:API1)。

BFFからバックエンドへ利用者を伝えるとき、「User-ID」のようなヘッダーを受け取っただけでは、その値を信頼できません。信頼できる伝え方には、主に次の2つがあります(OWASP:Identity Propagation Patterns、いずれも確認日:2026年10月21日)。

  • トークンを渡し、受け取る側で検証する:信頼する発行元が発行したトークンを渡し、受け取るバックエンドが署名、発行元、宛先、有効期限などを検証します。検証できても、それは発行元が正しく、改ざんされていないことを示すもので、依頼された操作を許すかは別に判断します。
  • 信頼するプロキシが付けたヘッダーに限る:外部から送られた同じ名前のヘッダーを入口で取り除く、プロキシ自体を認証する、プロキシを通らない直接のアクセスを防ぐ、利用者の情報を伝えてよい相手を限る、といった条件がそろう場合に限ります。

サービスの間の通信を暗号化したり、呼び出し元のサービスを認証したりしても、そのサービスが任意の利用者として振る舞ってよいことまでは保証されません。また、Cookieはブラウザでの保存と送信の仕組み、JWTはトークンの形式で、同じ分類の二択ではありません。どの画面・連携がどの方式で利用者を伝え、どこで認可を判断するかを、仕様の確認票に記録します。

テスト・受入の確認:仕様一致と業務の正しさを分ける

APIの受入では、応答が仕様の形に合っているかと、業務の処理・権限・失敗時の動きが正しいかを分けて確かめます。OpenAPIに沿った検査は仕様との形の一致を確かめるもので、Pactのような契約テストは、利用側が実際に使うやり取りの例をもとに、提供側がそのとおりに応えるかを確かめます(Pact Docs:Introduction)。契約テストは副作用を確かめるものではなく、提供側の業務処理の正しさは別の試験で確かめる、とPactの資料も説明しています(Pact Docs:Contract tests vs functional tests、いずれも確認日:2026年10月21日)。

表は横にスクロールできます →

▼ テスト・受入の確認表
確認の種類確かめることそれだけでは分からないこと記録・担当
仕様・スキーマの検査応答の項目・型・必須がOpenAPIの記述に合うか。仕様の変更が互換性に影響するか利用側が実際にどの項目に依存しているか。業務上の値の正しさ検査の結果をCIに残す。提供側の開発者
利用側と提供側の契約テスト利用側が使う依頼と応答の例に、提供側が応えられるか契約テストを書いていない利用側(夜間連携・外部の会社など)への影響。副作用契約の一覧と対象外の利用側を記録する。両側の開発者
業務処理・保存・副作用状態の変化、保存される値、通知や後続の処理が業務のとおりか権限の誤り、通信が失敗したときの動き業務の責任者が受入の条件を決め、開発者が試験する
認証・対象データ・テナントの認可権限ごとに、許可された操作だけができ、ほかの利用者やテナントのデータにアクセスできないか新しい画面や連携で追加された経路権限ごとの試験結果。開発者と業務の責任者
失敗・再試行・二重処理タイムアウトや通信の失敗の後に再試行しても、二重に登録・請求されないか本番で起きる通信障害の頻度。外部サービス側の動き試験の条件と結果。開発者と運用担当
段階的な反映・戻し方・監視一部から反映し、エラーと利用状況を監視して、問題があれば戻せるか保存されたデータの扱い(コードを戻しても残る)反映の手順と判断する人。運用担当と業務の責任者

通信が失敗しても、依頼が処理されていないとは限りません。冪等性とは、同じ依頼を複数回送ったときのサーバーへの意図した効果が、1回だけ送った場合と同じになる性質です。応答内容やステータスまで同じになるとは限りません。HTTPの仕様では、非冪等なメソッドの依頼は、処理の意味が実際には冪等だと分かる場合や、最初の依頼が適用されていないと確認できる場合を除き、自動で再試行すべきではないとされています(RFC 9110 9.2.2、確認日:2026年10月21日)。注文の登録のような処理では、再試行してよい条件と、二重登録を防ぐ方法を合意して試験します。

OpenAPIから生成した型やクライアントは、利用側と提供側で形をそろえる助けになりますが、実行時に届くデータの検査や、業務の正しさを保証するものではありません。CIは、設定して実行した検査の範囲を毎回確かめる仕組みで、すべての不一致や互換性のない変更を防ぐものではありません。どの検査をどこで実行し、何を手作業で確かめるかを決めておきます。

APIファーストを始める前のチェックリストとFAQ

導入や変更を始める前に、分かる範囲で次の点を確認します。すべてに当てはまっても、APIの品質や安全性が保証されるわけではありません。未確認の項目は、担当と確認の時期を決めて残します。

社内や外部に相談するときは、利用中の画面や連携先、変えたい内容と困っていること、仕様書や資料の所在、権限と保守の担当について、分かる範囲をまとめておくと整理を進めやすくなります。仕様書がそろっていなくても、ご相談いただけます。パスワードやAPIキー、実際の顧客データを相談フォームに書いていただく必要はありません。

押さえておきたい点

APIファーストで大切なのは、仕様書を先に作ること自体よりも、利用側と提供側が同じ記録をもとに、変更の影響と受入の条件を確かめられる状態を保つことです。分ける範囲を目的から決め、確認票と変更記録に未確認の点を残しながら進めると、連携先が増えても判断しやすくなります。

自社の状況を確認する

  • □ APIで実現したい目的と、対象の範囲(画面・連携・処理)を決めた
  • □ 利用側(画面・連携先・一括処理)の一覧と連絡先を記録した
  • □ 仕様の管理者と、APIと仕様書の版の管理方法を決めた
  • □ 入力・出力・エラーの形式を、確認済みと未確認に分けて確認票に書いた
  • □ 認証の方式と、対象データ・テナント・操作ごとの認可を決めた
  • □ 互換性に影響する変更の範囲と、未知の項目・値の扱いを利用側と確認した
  • □ 変更の連絡、移行の期限、旧版を廃止する条件を合意した
  • □ 業務処理・契約・失敗時の再試行を、それぞれ試験する担当を決めた
  • □ 反映の手順、戻し方と保存済みデータの扱い、運用の担当を決めた
  • □ 未確認の事項と、受入を判断する人を決めた

よくある質問

Q. APIファーストとマイクロサービスは同じですか?

同じではありません。APIファーストは、APIの振る舞いを先に合意し、変更も記録で管理する進め方です。マイクロサービスは、機能を別のプロセスや配備の単位に分ける構成です。1つのアプリとして配備するシステムでも、APIを先に合意し、責務をモジュールに分けて進められます。

Q. OpenAPIで仕様を書けば十分ですか?

十分ではありません。OpenAPIは入力・出力・エラーなどを記述する標準で、実装がそのとおりに動くことや、権限の確認が行われることまでは保証しません。業務上の意味や運用の連絡先は別の記録で補い、仕様の検査、契約テスト、業務・権限・失敗時の試験を分けて確かめます。

Q. BFFは必須ですか?

必須ではありません。画面やアプリごとに必要なデータの量や形が大きく異なる場合に検討します。利用する画面が1つだけの場合や、要求が似ている場合は、共通のAPIを直接使う方が負担が小さいこともあります。BFFを置いても、バックエンドで対象データごとの認可は必要です。

Q. 既存のAPIを止めずに変えるには、何を確認すればよいですか?

利用側の一覧と使っている項目、変更が互換性に影響するか、未知の項目や値を利用側が扱えるかを確認します。そのうえで、連絡と移行の期限、段階的な反映、利用状況とエラーの確認、保存済みデータを含めた戻し方を決めます。夜間処理や利用者が分からない連携を残したまま、期限だけで旧版を止めないようにします。

Q. 仕様書がそろっていなくても相談できますか?

はい、ご相談いただけます。利用中の画面や連携先、変えたい内容、資料の所在、権限と保守の担当について、分かる範囲から整理します。パスワードやAPIキー、実際の顧客データを相談フォームに書いていただく必要はありません。

API連携と変更の条件を、要件から整理します。

連携先、利用中の画面・システム、変更したい内容、権限と保守の担当をもとに、要件整理・実装・受入の支援内容をご確認ください。初回相談で対象と支援範囲を確認します。

API連携・システム開発の支援内容を見る