はじめに
この記事はAPI構成や責務分離とは何かを紹介し、API構成や責務分離がどのような歴史をたどって現在に至るのかを説明していきます。
✅ 1. APIとは?
API(Application Programming Interface)とは、
ソフトウェア同士がやり取りするための「窓口(インターフェース)」です。
アプリケーションは、APIを通じて「何ができるか」「どのようなデータを渡せばよいか」だけを知ればよく、 内部でどのような処理が行われているかを意識する必要はありません。
🔧 例:レストランでの注文
APIの仕組みはレストランによく例えられます。
- API:メニュー(注文できる内容の一覧)
- クライアント:お客さん(注文=リクエストを送る)
- サーバー:厨房(料理=レスポンスを返す)
💡 ポイント
お客さんは「どうやって調理されているか(内部ロジック)」を知らなくても、
メニュー(API)さえ見れば料理を受け取れます。
この 内部実装を隠蔽できる点 が、APIの最大の利点です。
✅ 2. API構成とは?
API構成とは、APIを「安全・分かりやすく・長く使える形」で提供するための
設計ルールや構造全体を指します。
主な構成要素
- エンドポイント
- URL(どこにアクセスするか)
- HTTPメソッド
- GET / POST / PUT / DELETE(何をするか)
- リクエスト・レスポンス
- 入力データと返却データの形式
- 認証・認可
- 誰が利用できるか
- バージョン管理
- v1 / v2 などによる後方互換性の維持
- レート制限
- 過剰アクセス防止・安定運用のための制御
✅ 3. 責務分離の歴史
アプリケーションが大規模・複雑になるにつれて、
「どこまでを誰が担当するか(責務)」を明確に分ける必要が生まれました。
🕰 1980s:モノリシック構成
- 特徴:UI・ロジック・DBが1つの巨大なプログラムに集約
- 技術:C / COBOL / メインフレーム
- 構造:関数単位の分離はあるが、全体は密結合
👉 小規模では問題ないが、変更に弱い構成
🕰 1990s:オブジェクト指向と3層アーキテクチャ
- 特徴:クラスに責務を持たせ、層(レイヤー)で分離
- 技術:Java / C++ / CORBA
- 構造:
- プレゼンテーション層
- ビジネスロジック層
- データアクセス層
👉 単一責任の原則(SRP) が意識され始める
🕰 2000s:Web API(REST / SOAP)
- 特徴:フロントエンドとバックエンドがネットワーク越しに分離
- 技術:XML / SOAP / REST / PHP / JAX-RS
- 構造:サービス指向アーキテクチャ(SOA)
👉 API仕様=契約 という考え方が重要に
🕰 2010s:マイクロサービスとAPIファースト
- 特徴:1サービス=1責務で小さく分割
- 技術:Node.js / Go / Docker / Kubernetes / OpenAPI
- 構造:
- マイクロサービスアーキテクチャ
- ドメイン駆動設計(DDD)
👉 スケーラビリティとチーム分業を重視
🕰 2020s:サーバーレス・BFF・モダン構成
- 特徴:クライアントごとに最適なAPI(BFF)を提供
- 技術:TypeScript / AWS Lambda / GraphQL / gRPC
- 構造:
- サーバーレスによる機能単位分割
- 可観測性(Observability)の重視
▼ 歴史まとめ
| 時代 | 構成スタイル | 目的 |
|---|---|---|
| 80s | モノリシック | 単純な処理を一体で管理 |
| 90s | 3層アーキテクチャ | UIと処理の分業 |
| 00s | Web API | Web・多端末対応 |
| 10s | マイクロサービス | 大規模化・スケール対応 |
| 20s~ | BFF / サーバーレス | DX・複雑なUI要件対応 |
✅ 4. モダンWebアプリケーションの階層化アーキテクチャ(レストラン例)
モダンなWebアプリケーションでは、
MVCやレイヤードアーキテクチャに基づいた分離が一般的です。
レストラン例での対応関係
| 層 | レストランでの役割 | 責務 |
|---|---|---|
| Route | ウェイター | リクエストを受け取り、処理先を決める |
| FormRequest | 注文確認係 | 入力内容のバリデーション |
| Controller | フロアマネージャー | 処理の流れを制御し、レスポンスを返す |
| Service | シェフ | ビジネスロジックを実行 |
| Repository | 冷蔵庫 | データの取得・保存 |
👉 Controllerを薄く保ち、Serviceにロジックを集約するのが重要です。
✅ 5. 各層ごとに起きやすいバグ
責務が明確だと、バグの原因特定が容易になります。
| 層 | 起きやすい問題 | 例 |
|---|---|---|
| Route | ルーティング競合 | /users/:id が /users/new を上書き |
| FormRequest | バリデーション漏れ | email未検証でDBエラー |
| Controller | エラー処理不足 | try-catch不足でクラッシュ |
| Service | ロジック不備 | 存在しないユーザーを処理 |
| Repository | クエリミス | 誤ったテーブル参照 |
| Exception Handling | 情報漏洩 | スタックトレースを返却 |
✅ さいごに
責務分離のメリット
- 単体テストがしやすい
- 変更に強い設計になる
- チーム開発での分業が容易
責務分離は「コードを綺麗にするため」ではなく、
「開発スピードと品質を守るための設計思想」です。
要点整理
| 概念 | 要点 |
|---|---|
| API | アプリ間通信のための窓口 |
| 責務分離 | 各層が自分の役割に集中 |
| Node.js構成 | 層ごとに明確に分割 |
| 注意点 | Service / Repository の責務肥大化に注意 |