BFF (Backend for Frontend)
フロントエンドごとに専用のバックエンドを用意し、クライアントに最適化された API を提供するパターン
BFF とは
BFF (Backend for Frontend) は、フロントエンドごとに専用のバックエンドを用意し、クライアントに最適化された API を提供するパターンである。Sam Newman が提唱。詳細は「BFF パターン」を参照。
なぜ必要か
マイクロサービス環境では、モバイルアプリと Web アプリで必要なデータの形式や量が異なる。汎用 API を 1 つだけ用意すると、モバイルには不要なフィールドまで返却され、通信量が増える。BFF を設けることで、各クライアントに最適化されたレスポンスを返せる。
❌ 汎用 API:
モバイル: /api/users/123 → 50 フィールド返却 (大半は不要)
Web: /api/users/123 → 50 フィールド返却 (別のフィールドが不要)
✅ BFF:
モバイル → Mobile BFF → { name, avatar } (必要最小限)
Web → Web BFF → { name, email, orders } (Web に最適化)
アーキテクチャ
各フロントエンドに専用の BFF を配置し、背後のマイクロサービス群から必要なデータだけを集約して返す。BFF はクライアントごとのデータ整形に専念し、ビジネスロジックは持たない。
モバイルアプリ → Mobile BFF (Lambda) → マイクロサービス群
Web アプリ → Web BFF (Lambda) → マイクロサービス群
管理画面 → Admin BFF (Lambda) → マイクロサービス群
BFF vs 汎用 API vs GraphQL
BFF と汎用 API vs GraphQL の違いを以下にまとめる。
| 観点 | 汎用 API | BFF | GraphQL |
|---|---|---|---|
| Over-fetching | 発生する | 解決 | 解決 |
| クライアント最適化 | 全クライアント共通の形で返す | 画面ごとに必要な形へ整えて返す | クライアントが必要な項目を指定する |
| バックエンド数 | 1 | クライアント数分 | 1 |
| 複雑さ | 低い | 中 | 中〜高 |
Lambda での BFF
Lambda での BFF のコード例を示す。
// Mobile BFF: モバイルに最適化されたレスポンス
export const mobileHandler = async (event: APIGatewayProxyEventV2) => {
const userId = event.pathParameters?.id;
const [user, orders] = await Promise.all([
userService.get(userId!),
orderService.getRecent(userId!, 3), // モバイルは直近 3 件のみ
]);
return {
statusCode: 200,
body: JSON.stringify({
name: user.name,
avatar: user.avatar,
recentOrders: orders.map(o => ({ id: o.id, total: o.total })),
}),
};
};
BFF の注意点
BFF の注意点を以下にまとめる。
| 注意点 | 対策 |
|---|---|
| BFF の肥大化 | ビジネスロジックを BFF に入れない |
| 重複コード | 共通ロジックをライブラリに抽出 |
| BFF の数が増える | GraphQL で代替を検討 |
いつ BFF を使うか
クライアントの数だけバックエンドを増やす判断は、レスポンスの形が画面ごとにどれだけ違うかで決まる。
| 場面 | 判断 | 理由 |
|---|---|---|
| モバイルと Web で必要なフィールドが食い違う | BFF を置く | 汎用 API では両方の要求を足した形になり、モバイル側は使わないフィールドまで受け取って通信量が増える |
| フロントエンドが 1 つだけ | 汎用 API のまま | 整形先が 1 つなら層を挟んでも返す形は変わらず、デプロイ対象と監視対象が増えるだけになる |
| クライアント側が必要なフィールドを都度決めたい | GraphQL を検討 | 取得したい形をクエリで指定できるため、画面が増えるたびに BFF を作り足す運用を避けられる |
より深く学ぶには関連書籍が役立つ。
この記事は役に立ちましたか?
関連用語
API Gateway
API のエントリーポイントとして認証、スロットリング、ルーティングを一元管理する AWS サービス
GraphQL
クライアントが必要なデータだけを指定して取得できる API クエリ言語
マイクロサービス
1 つの大きなアプリケーションを複数の小さなサービスに分割し、それぞれが独立してデプロイ / スケール可能な状態で協調動作するアーキテクチャパターン
HATEOAS
REST API のレスポンスにリンクを含め、クライアントが次に取れるアクションを動的に発見できるようにする設計原則
リバースプロキシ
クライアントとサーバーの間に位置し、リクエストを中継 / 制御するサーバー
PKCE
OAuth 2.0 の認可コードフローを、クライアントシークレットなしで安全に実行するための拡張
関連する記事
インフラ / クラウド本ガイド - AWS や Docker を本で学ぶ
クラウドインフラ、コンテナ、IaC を学べる技術書の選び方と学習順序を紹介。インフラ本の賞味期限問題と公式ドキュメントとの使い分けも解説します。
技術書の読む順番戦略 - 複数冊を組み合わせて理解を加速させる
技術書を 1 冊ずつ読むのではなく、複数冊を戦略的に組み合わせることで、1 冊では届かない理解の深さと広さに達する方法を解説します。
1 万行のコードより 1 冊の設計書が勝つ場面
大量のコードを書く力と、適切な設計を選ぶ力は別物です。コード量では解決できない問題に直面したとき、設計の知識がどう効くのかを具体例で解説します。