C4モデル:コードのための「グーグルマップ」のようにソフトウェアアーキテクチャを可視化する

「C4モデルは、チームがソフトウェアアーキテクチャを明確に、一貫して、適切な詳細レベルで伝えるのを助けます。」
— シモン・ブラウン

The C4モデル (コンテキスト、コンテナ、コンポーネント、コード)は、ソフトウェアアーキテクチャを文書化するための階層的でズーム可能なフレームワークです。開発者にとって使いやすく、開発者フレンドリーアジャイル準拠、そして読みやすい — 混雑した静的な「箱と線」の図を越えていきます。

これによりチームは次のようにできます:

  • 技術者と非技術者を問わず、アーキテクチャを効果的に伝える。

  • 一貫性があり、バージョン管理されたドキュメントを維持する。

  • それぞれの抽象レベルで重要なものに注目するに注目する。


🔍 C4モデルのコアな抽象概念

The Ultimate Guide to C4 Model Visualization with Visual Paradigm's AI Tools - ArchiMetric

レベル 概念 目的
レベル1:コンテキスト システムと人々 誰がシステムを使用するのか?環境とどのように相互作用するのか?
レベル2:コンテナ デプロイ可能な単位 高レベルの技術的構成要素(アプリ、データベース、APIなど)は何ですか?
レベル3:コンポーネント 論理的なグループ化 コンテナ内では機能がどのように構造化されていますか?
レベル4:コード(オプション) クラス、インターフェース、メソッド 実装の詳細 — 通常、IDEによって生成されます。

✅ 重要な原則必要がある場合にのみズームインしてください。広く始めてから、段階的に詳細へと掘り下げてください。


🧩 主な要素と関係性

要素 説明
人物 人間のアクターまたはユーザー 顧客管理者サードパーティAPI
ソフトウェアシステム 価値を提供するシステム インターネットバンキングシステム
コンテナ デプロイ可能な単位(実行時またはデプロイ可能な) Webアプリ、マイクロサービス、データベース、サーバーレス関数
コンポーネント 関連する機能の論理的なグループ 認証モジュール支払いプロセッサメインフレームのフェイサード
関係 要素間の平易な言語による接続 "使用する""呼び出す""読み取り/書き込み""に依存する"

💬 使用する自然言語関係に使用する。”接続する”のような曖昧な用語を避ける。


📊 PlantUML例付きのC4モデルレベル

📌 すべての例では、C4-PlantUMLライブラリ一貫性と自動化のために使用する。


1. システムコンテキスト図 (レベル1)

誰がシステムを使用するのか?外部システムとはどのような関係にあるのか?

🎯 対象者: 技術に詳しくないステークホルダー、プロダクトオーナー、経営陣。

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml
LAYOUT_WITH_LEGEND()
title インターネットバンキングのシステムコンテキスト図

Person(customer, "顧客", "個人向けバンキングの顧客")
System(banking_system, "インターネットバンキングシステム", "顧客が口座を確認し、支払いを行うことを可能にする")
System_Ext(mainframe, "メインフレームバンキングシステム", "すべての核心バンキングデータを格納する")

Rel(customer, banking_system, "使用する")
Rel_R(banking_system, mainframe, "口座情報を取得する")
@enduml

✅ 注目点:範囲と境界システムの。


2. コンテナ図 (レベル2)

主要な技術的コンポーネントとそれらの技術は何ですか?

🎯 対象読者: アーキテクト、開発者、DevOpsエンジニア。

@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

Person(customer, "顧客", "個人向け銀行サービスの利用者")
System_Boundary(c1, "インターネットバンキングシステム") {
    Container(web_app, "Webアプリケーション", "Java, Spring MVC", "ユーザーにコンテンツを提供")
    Container(api_app, "APIアプリケーション", "Java, Spring Boot", "JSON/HTTPS経由で機能を提供")
    ContainerDb(db, "データベース", "リレーショナルデータベース", "ユーザー情報を保存")
}

System_Ext(mainframe, "メインフレーム銀行システム", "すべての核心的な銀行データを保存")

Rel(customer, web_app, "使用", "HTTPS")
Rel(web_app, api_app, "呼び出し", "JSON/HTTPS")
Rel(api_app, db, "読み書き", "JDBC")
Rel(api_app, mainframe, "使用", "XML/HTTPS")
@enduml

✅ 注目点: 技術選定デプロイ境界データフロー.


3. コンポーネント図 (レベル3)

APIアプリケーションは内部的にどのように構成されていますか?

🎯 対象読者: 開発者、技術リード、チームリード。

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml
LAYOUT_WITH_LEGEND()
title インターネットバンキングにおけるAPIアプリケーションのコンポーネント図

Container(api_app, "APIアプリケーション", "Java, Spring Boot")
ContainerDb(db, "データベース", "リレーショナルデータベース")
System_Ext(mainframe, "メインフレーム銀行システム")

Container_Boundary(api_boundary, "APIアプリケーション") {
    Component(sign_in, "ログインコントローラ", "MVCコントローラ", "ユーザーのログインを許可")
    Component(security, "セキュリティコンポーネント", "Spring Security", "認証を処理")
    Component(mainframe_facade, "メインフレームフェイサ", "DAO", "メインフレームと通信")

    Rel(sign_in, security, "使用")
    Rel(security, db, "読み書き")
    Rel(sign_in, mainframe_facade, "使用")
    Rel(mainframe_facade, mainframe, "使用")
}
@enduml

✅ 注目点: 内部構造責任依存関係.


4. コード図 (レベル4 – オプション)

実装の詳細:クラス、インターフェース、メソッド。

🎯 対象読者:開発者、コードレビュアー。

⚠️ 手動で描くことは推奨されません — IDE(例:IntelliJ、VS Code)を用いて自動図示ツールで生成するのが最適です。

例(簡略化):

@startuml
class SignInController {
  +signIn()
  +validateCredentials()
}

class SecurityComponent {
  +authenticate()
  +generateToken()
}

class MainframeFacade {
  +fetchAccountData()
  +sendTransaction()
}

SignInController --> SecurityComponent : 使用
SecurityComponent --> Database : 読み取り/書き込み
MainframeFacade --> MainframeAPI : 使用
@enduml

✅ 最良の実践:自動化 このレベルを、次のようなツールを使って自動化する:PlantUML + IDEプラグイン.


✅ 最良の実践と重要な原則

原則 なぜ重要なのか
段階的改善 コンテキストから始める → 必要な場合にのみ詳細を追加する。過剰な文書化を避ける。
図をコードとして扱う 保存する:.puml ファイルをGitに保存する。バージョン管理、CI/CD、共同作業、差分比較が可能になる。
凡例を含める 記号、色、規約(例:赤 = 外部青 = 内部).
コミュニケーションに焦点を当てる 図は、情報を伝えるべき、印象づけるためではない。シンプルさ > 完全性。
「システムランドスケープ」図を使用する 複数のシステムが組織全体でどのように相互作用するかを示す。
「ダイナミック」図を使用する 実行時の振る舞い(例:ログインフロー)を示すためにシーケンス図を追加する。
範囲を適切に設定する コンポーネント図は、範囲を設定する必要がある単一のコンテナ内に。コンテナを混ぜてはいけません!

🛠 ツールとエコシステム

  • PlantUML + C4-PlantUML ライブラリ – 無料、テキストベース、バージョン管理可能。

  • Visual ParadigmLucidchartDraw.io – テンプレートを通じてC4をサポート。

  • IDE プラグイン – コードからC4図を自動生成(例:IntelliJ + PlantUMLプラグイン)。

  • CI/CD 統合 – ビルドパイプラインの一部として図を生成。


📚 参考文献および追加読書


🎯 最後の考え

C4モデルの目的は完璧な図を描くことではなく、適切な詳細度で、正しい物語を伝えること.

次のように使ってください:

  • 新規開発者をより迅速にオンボーディングする。

  • チーム間でシステムの境界を一致させる。

  • 専門用語を使わずにステークホルダーとコミュニケーションする。

  • コードとともにアーキテクチャドキュメントを進化させる。


✅ プロのヒント:まず システムコンテキスト 図から始めましょう。その後、チームのニーズに応じてモデルを拡大していく——1つの通りずつ地図を描くように。


以下が必要な場合は教えてください:

  • このガイドのダウンロード可能なPDF版

  • GitにC4図を含むテンプレートリポジトリ

  • コードからC4図を生成するための自動化スクリプト

  • 他のモデル(例:4+1ビュー、Zachman)との比較

楽しい図作成を! 🖥️📘