メインコンテンツまでスキップ

🧩 Classic Layered Architecture(クラシックレイヤードアーキテクチャ)

✅ このスタイルの概要

UI / Application / Domain / Infrastructure のようにアプリケーションを層に分割し、上位レイヤーが下位レイヤーに依存する構造スタイル。 最も広く知られている「3 層 / n 層アーキテクチャ」。

✅ 解決しようとした問題

  • 画面(UI)・ビジネスロジック・DB アクセスが混在したスパゲッティ構造
  • 変更の影響範囲が読めない
  • チーム分業がしづらい

Classic Layered は、

「似た責務のコードを層としてまとめ、上下の依存を整理する」

ことで、構造を見通し良くする ことを狙う。

✅ 基本思想・ルール

典型的なレイヤー構造:

  • Presentation / UI
  • Application / Service
  • Domain / Business Logic
  • Infrastructure / Data Access

基本ルール:

  • 上位レイヤーは下位レイヤーに依存してよい
  • 下位レイヤーが上位レイヤーに依存することは避ける
  • レイヤーを“ジャンプ”する依存は避ける(UI → DB 直結など)

実装上は、

  • パッケージや名前空間でレイヤーを分ける
  • レイヤー内の依存は比較的自由

という構造で運用されることが多い。

✅ 概念図(Conceptual Diagram)

✅ 得意なアプリケーション

  • 業務 Web アプリケーション全般
  • ビジネスロジックがそこまで複雑ではない社内システム
  • 画面や API ごとに素直な CRUD が中心のアプリ
  • チーム分業(フロント / バックエンド / DB)を前提とした開発

Classic Layered は “とりあえずこれで分割する” という標準解 として有効である。

❌ 不向きなケース

  • ドメインルールが複雑で、ドメインモデルを本格的に設計したい場合
  • 外部サービス連携や複数 UI を前提にしたアプリケーション
  • フレームワークや DB への依存を極力減らしたい場合

典型的な限界として:

  • Domain 層が薄くなりがち(実質的には Application/Service にロジック集中)
  • インフラ依存(ORM・フレームワーク)が Domain に侵食しやすい
  • テストがインフラ依存に引きずられる

✅ 歴史(系譜・親スタイル)

  • 非構造〜Transaction Script の時代からの進化として登場
  • 90〜2000 年代のエンタープライズアプリで標準的なスタイルに
  • Fowler の Patterns of Enterprise Application Architecture などで整理
  • のちに DDD や Hexagonal へと発展する “ベースキャンプ”的な存在

✅ 関連スタイル

✅ 代表的なフレームワーク

Classic Layered はもっとも一般的な構造スタイルのひとつであり、多くのフレームワークがこの形を前提にしているか、自然に誘導する。

  • Spring Boot(Java)
    Controller / Service / Repository といった 3 層構造が標準的なサンプルとして提示される。

  • ASP.NET Core / .NET
    Presentation / Application / Domain / Infrastructure のようなレイヤード構成のテンプレートが豊富。

  • NestJS(Node.js)
    Module / Controller / Provider といった構成が、レイヤードに寄せた設計をしやすくしている。

  • Angular
    UI フレームワークだが、Component / Service / Data Access という 3 層的な構造で考えやすい。

✅ このスタイルを支えるデザインパターン

Classic Layered 自体はシンプルな責務分割だが、レイヤー間の関係を整理するために次のパターンがよく使われる。

  • Facade
    上位レイヤ(UI / Application)から下位レイヤの複雑さを隠し、統一インターフェースを提供する。

  • Strategy
    ビジネスロジックのバリエーションを Application / Domain レイヤで切り替える際に使われる。

  • Template Method
    複数の Service や Repository が似た処理手順を持つ場合、その骨格を共通化する。

  • Proxy
    外部 API やキャッシュ、リモートサービスへのアクセスを、Infrastructure レイヤでラップする際に利用される。

✅ まとめ

Classic Layered は、

  • シンプルで理解しやすく、
  • 多くのフレームワークやサンプルコードが前提としている

という意味で、今でも現役のスタイルである。

一方で、

  • フレームワーク依存やドメイン表現の弱さ

といった限界もあるため、より複雑なシステムでは次の発展段階(Domain Model / Hexagonal など)を検討するための基準点 として位置づけるとよい。