The C4モデル、サイモン・ブラウンによって作成されたもので、ソフトウェアアーキテクチャを可視化するシンプルで階層的かつ開発者フレンドリーな方法です。4つの抽象化レベル(そのため「C4」)を使用して、システムを最高レベルの概要からコードレベルの詳細まで記述します:
- システムコンテキスト (レベル1)-全体像:システムとそのユーザー/外部依存関係。
- コンテナ (レベル2)-高レベルの技術選択と責任。
- コンポーネント (レベル3)-コンテナ内の主要な論理的構成要素。
- コード (レベル4)-オプションのクラスレベルまたはコード構造の詳細。
3つの追加の図形式によってサポートされています:
- システムランドスケープ
- ダイナミック
- デプロイメント
このモデルは表記に依存せず(任意の図作成ツールを使用可能)、明確性、一貫性、対象読者に適した詳細さに焦点を当てています。『大きな泥だらけのボール』のようなアーキテクチャ図を避け、ホワイトボードのスケッチから自動文書化までスケーラブルであるため、広く採用されています。
この 対象となる事例研究では、公式C4ウェブサイトの標準例を使用します: インターネットバンキングシステム 、架空の「Big Bank plc」向けです。ビジネス目標は、個人顧客が自らの口座をオンラインで確認し、支払いを行うことを可能にするとともに、銀行の既存のコアシステムと統合することです。
以下では、 すべてのレベルについて、次のように説明します:
- 目的と対象読者
- 主要な要素+責任
- 関係
- 使用可能な PlantUML C4図(PlantUMLはC4構文をサポートしており、ほとんどのMarkdownビューアーで美しくレンダリングされます)
- 根拠と重要な意思決定
- 図がステークホルダーにどのように役立つか
ステップ1:範囲の定義とシステムコンテキスト図の作成(レベル1)
目的:新しいインターネットバンキングシステムが世界の中でどのように位置づけられているかを示す。対象:ビジネス関係者、技術に詳しくない人、新しくチームに加わったメンバー。
要素 (公式の例から):
- 個人銀行顧客 (人)-1つ以上の個人口座を持つ顧客。
- インターネットバンキングシステム (ソフトウェアシステム)-私たちが構築している新しいシステム。
- コアバンキングシステム (ソフトウェアシステム、既存)-顧客データ、口座、取引を処理するメインフレーム。
- メールシステム (ソフトウェアシステム、外部)-確認メールの送信に使用するAmazon Web Services Simple Email Service(AWS SES)。
関係:
- 顧客 → 使用 → インターネットバンキングシステム(口座の確認や支払いのため)
- インターネットバンキングシステム → 使用 → コアバンキングシステム(口座データおよび支払いのため)
- インターネットバンキングシステム → メールを送信 → メールシステム経由
こちらが PlantUML C4コンテキスト図:

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml
LAYOUT_TOP_DOWN()
LAYOUT_WITH_LEGEND()
title インターネットバンキングシステムのシステムコンテキスト図(レベル1)
Person(customer, "個人銀行顧客", "1つ以上の個人口座を持つ顧客。")
System(internet_banking_system, "インターネットバンキングシステム", "口座の確認や支払いを行うための新しいシステム。")
System(core_banking_system, "コアバンキングシステム", "既存のメインフレームで顧客データ、口座、取引を処理しています。")
System_Ext(email_system, "メールシステム", "確認メールの送信に使用するAmazon Web Services Simple Email Service(AWS SES)。")
Rel(customer, internet_banking_system, "使用")
Rel(internet_banking_system, core_banking_system, "使用")
Rel(internet_banking_system, email_system, "メールを送信 via")
Lay_D(customer, internet_banking_system)
Lay_D(internet_banking_system, core_banking_system)
Lay_U(email_system, internet_banking_system)
@enduml 根拠と価値:この1枚の図で、「何を構築しているのか、誰とやり取りしているのか」がすぐにわかります。外部依存関係を明確にすることで、範囲の拡大(スコープクリープ)を防ぎます。技術的な詳細がまだないため、ビジネス関係者はこの図を好むのです。
ステップ2:コンテナ図(レベル2)
目的: インターネットバンキングシステムを詳細に表示し、主要なデプロイ可能/実行可能な単位(コンテナ)とその技術選定を示す。対象:アーキテクト、リード開発者、運用担当者。
インターネットバンキングシステム内のコンテナ:
- シングルページアプリケーション (Webブラウザ – JavaScript + Angular) – インターネットバンキングの完全なUI。
- モバイルアプリ (モバイルデバイス – iOS/AndroidネイティブまたはReact Native) – 移動中における限定的な機能。
- APIアプリケーション (サーバーサイド – Java + Spring Boot) – 両方のフロントエンドで使用されるJSON/HTTPS API。
- データベース (リレーショナルDB – PostgreSQL) – セッションデータ、ユーザー設定、キャッシュされた口座概要を格納(コアデータはメインフレームに保持)。
主要な関係 (レベル1と同様の外部システム):
- SPAおよびモバイルアプリ → 呼び出し → APIアプリケーション
- APIアプリケーション ↔ データベース
- APIアプリケーション → コアバンキングシステムおよびメールシステム
PlantUML C4コンテナ図:
@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml
!include https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/devicons/angular.puml
!include https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/devicons/java.puml
!include https://raw.githubusercontent.com/tupadr3/plantuml-icon-font-sprites/master/devicons/postgresql.puml
LAYOUT_TOP_DOWN()
LAYOUT_WITH_LEGEND()
title インターネットバンキングシステムのC4コンテナ図
Person(customer, "個人バンキング顧客", "1つ以上の個人口座を持つ顧客。")
System_Boundary(internet_banking_system, "インターネットバンキングシステム", "口座の確認や支払いを行うための新システム。") {
Container(spa, "シングルページアプリケーション", "JavaScript + Angular", "完全なインターネットバンキングUI", $sprite="angular")
Container(mobile_app, "モバイルアプリ", "iOS/Android(React Native)", "移動中における限定的な機能", $sprite="react")
Container(api_app, "APIアプリケーション", "Java + Spring Boot", "両方のフロントエンドで使用されるJSON/HTTPS API", $sprite="java")
ContainerDb(database, "データベース", "PostgreSQL", "セッションデータ、ユーザー設定、キャッシュされた口座概要を格納", $sprite="postgresql")
}
System(core_banking_system, "コアバンキングシステム", "顧客データ、口座、取引を処理する既存のメインフレーム。")
System_Ext(email_system, "メールシステム", "確認メールを送信するためのAmazon Web Services Simple Email Service(AWS SES)。")
' 関係
Rel(customer, spa, "使用", "HTTPS")
Rel(customer, mobile_app, "使用", "HTTPS")
Rel(spa, api_app, "呼び出し", "JSON/HTTPS")
Rel(mobile_app, api_app, "呼び出し", "JSON/HTTPS")
Rel(api_app, database, "読み書き", "JDBC/SQL")
Rel(api_app, core_banking_system, "照会/更新", "JSON/HTTPS")
Rel(api_app, email_system, "メール送信経由", "HTTPS")
' レイアウトヒント(オプション – PlantUMLが要素をより良い順序で配置するのを助ける)
Lay_D(customer, internet_banking_system)
Lay_D(internet_banking_system, core_banking_system)
Lay_U(email_system, internet_banking_system)
@enduml
根拠: ウェブでは現代的なSPA+APIバックエンドパターンを選択し、パフォーマンスを重視してネイティブモバイルアプリを採用し、データベースは軽量に保ちました(大部分のデータはレガシーなメインフレームに保存)。この図は上位レベルの技術的決定事項の唯一の信頼できる情報源であり、DevOpsがインフラを計画するのを支援します。
ステップ3:コンポーネント図(レベル3)
目的: 1つのコンテナ(通常は最も複雑なもの-APIアプリケーション)にズームインし、その主要な論理コンポーネントを示す。対象:開発チーム。
例:APIアプリケーション内のコンポーネント:
- アカウントコントローラー(Spring MVC)
- 認証コントローラー
- パスワードリセットコントローラー
- セキュリティコンポーネント(認証、JWTなど処理)
- アカウント管理コンポーネント(コアバンキングシステムへの呼び出しを調整)
- メール通知コンポーネント
PlantUML C4 コンポーネント図 (APIアプリケーションに焦点を当てた):

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml
LAYOUT_WITH_LEGEND()
title インターネットバンキングシステム - APIアプリケーションのコンポーネント図
Container(spa, "シングルページアプリケーション", "javascript and angular", "顧客がウェブブラウザ経由ですべてのインターネットバンキング機能を利用できるように提供。")
Container(ma, "モバイルアプリ", "Xamarin", "顧客がモバイルデバイス経由でインターネットバンキング機能の限定的なサブセットを利用できるように提供。")
ContainerDb(db, "データベース", "リレーショナルデータベーススキーマ", "ユーザー登録情報、ハッシュ化された認証資格情報、アクセスログなどを保存。")
System_Ext(mbs, "メインフレームバンキングシステム", "顧客、アカウント、取引などのすべてのコアバンキング情報を保存。")
Container_Boundary(api, "APIアプリケーション") {
Component(accounts, "アカウントコントローラー", "Spring MVC", "顧客にアカウント概要と残高を提供。")
Component(auth, "認証コントローラー", "Spring MVC", "ユーザーのログイン、セッション管理、トークン生成を処理。")
Component(reset, "パスワードリセットコントローラー", "Spring MVC", "ユーザーがメール経由でパスワードをリセットできるようにする。")
Component(security, "セキュリティコンポーネント", "Spring Bean", "認証、JWTトークン生成、パスワードハッシュ化を処理。")
Component(accountmgmt, "アカウント管理コンポーネント", "Spring Bean", "アカウント操作のため、コアバンキングシステムへの呼び出しを調整。")
Component(email, "メール通知コンポーネント", "Spring Bean", "SMTP経由でパスワードリセットメールおよびアカウント確認メールを送信。")
Rel(accounts, security, "使用")
Rel(auth, security, "使用")
Rel(reset, security, "使用")
Rel(accountmgmt, mbs, "使用", "XML/HTTPS")
Rel(email, db, "読み取り", "JDBC")
}
Rel(spa, accounts, "使用", "JSON/HTTPS")
Rel(spa, auth, "使用", "JSON/HTTPS")
Rel(spa, reset, "使用", "JSON/HTTPS")
Rel(ma, accounts, "使用", "JSON/HTTPS")
Rel(ma, auth, "使用", "JSON/HTTPS")
Rel(ma, reset, "使用", "JSON/HTTPS")
@enduml
根拠:このレベルは責任の分割(関心の分離)を示し、新規開発者のオンボーディングをはるかに迅速にする。コンポーネント図を描くのは、その複雑さがそれだけの価値があると判断されるコンテナに限る。
ステップ4:コード図(レベル4)-オプション
目的:単一コンポーネントの内部構造(クラス図、シーケンス図など)を示す。対象:そのコードを担当する開発者。
例:認証コントローラーコンポーネント – PlantUMLによるシンプルなUMLクラス図:
@startuml
classDiagram
skinparam {
roundcorner 8
ArrowColor #444444
ArrowFontColor #444444
BorderColor #444444
Class {
BorderColor #1A237E
BackgroundColor #E8EAF6
FontColor #1A237E
}
}
class "認証コントローラー" {
+login(credentials)
+refreshToken()
}
class "JwtTokenProvider" {
+generateToken(user)
+validateToken(token)
}
class "UserRepository" {
+findByUsername()
}
認証コントローラー ..> JwtTokenProvider : "使用"
認証コントローラー ..> UserRepository : "使用"
@enduml
実際のプロジェクトでは、レベル4をスキップして、代わりに実際のソースコードを参照することが多い。
ステップ5:補助図
動的図 (例:「アカウント概要の表示」のフロー)

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml
title アカウント概要ビューの動的図
Person(customer, "個人向けバンキング顧客") {
Container(spa, "シングルページアプリケーション") {
Container(api, "APIアプリケーション") {
ContainerDb(db, "データベース") {
System_Ext(coreBanking, "コアバンキングシステム")
}
}
}
}
Rel(customer, spa, "1. 'アカウント'をクリック", "")
Rel(spa, api, "2. GET /accounts", "JSON/HTTPS")
Rel(api, db, "3. キャッシュされた概要を読み取り", "")
Rel(api, coreBanking, "4. 最新のデータを取得", "")
Rel(api, spa, "5. JSONを返却", "")
SHOW_LEGEND()
@enduml 展開図 (高レベルの物理マッピング):

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Deployment.puml
title インターネットバンキングシステムの展開図
Deployment_Node(aws, "Amazon Web Services", "クラウド") {
Deployment_Node(ec2, "EC2 Auto-Scaling Group", "Linux") {
Container(api, "APIアプリケーション", "Java Spring Boot")
}
Deployment_Node(rds, "RDS", "PostgreSQL") {
ContainerDb(db, "データベース")
}
}
Deployment_Node(customerDevice, "顧客のデバイス", "Web/モバイル") {
Container(spa, "シングルページアプリケーション")
Container(mobile, "モバイルアプリ")
}
System_Ext(coreBanking, "コアバンキングシステム(オンプレミスのメインフレーム)")
Rel(spa, api, "APIコールを実行", "HTTPS")
Rel(mobile, api, "APIコールを実行", "HTTPS")
Rel_U(api, spa, "顧客のWebブラウザに配信")
Rel_U(api, mobile, "モバイルアプリに配信")
SHOW_LEGEND()
@enduml
実際の現場でこの事例をどう活用するか
- ワークショップから始める:ホワイトボードにコンテキストを描く。
- PlantUML C4を使って、コンテナとコンポーネントへと段階的に進む。
- 図をコードリポジトリに保持(コードとして!)することで、常に最新の状態を保つ。
- 生きたドキュメントを自動的に生成する。
このインターネットバンキングシステムの例は、シモン・ブラウンが公式に作成したリファレンスであり、世界中の数千の組織で使用されています。これらの手順に従うことで、CEOから新米のジュニア開発者まで、誰もが適切な詳細レベルで理解できる、完全で本番環境対応のアーキテクチャ記述が得られます。
C4図に関する記事
- Visual ParadigmのAIツールを活用したC4モデル可視化の究極のガイド: このガイドでは、AIを活用したツールを活用して、C4モデルの可視化を自動化・強化し、ソフトウェアアーキテクチャ設計をより迅速に行う方法を説明します。
- Visual ParadigmのAI C4 Studioを活用したスムーズなアーキテクチャドキュメント作成: この記事では、AI強化されたスタジオを使用して、クリーンでスケーラブルかつ保守可能なソフトウェアアーキテクチャドキュメントを作成する方法を詳述しています。
- C4-PlantUML Studioの究極のガイド:ソフトウェアアーキテクチャ設計を変革する: このリソースでは、AI駆動の自動化、C4モデルの明確さ、PlantUMLの柔軟性を統合した単一の強力なツールの可能性を探ります。
- Visual ParadigmのAI搭載C4 PlantUML Studioの包括的ガイド: このガイドでは、2025年後半にリリースされた目的特化型ツールについて説明しており、自然言語のプロンプトを段階的なC4図に変換する機能を紹介しています。
- C4-PlantUML Studio|AI搭載C4図生成ツール: この機能概要では、シンプルなテキスト記述からC4ソフトウェアアーキテクチャ図を生成するように設計されたAI駆動のツールを紹介しています。
- Visual Paradigm AIチャットボットを活用したC4コンポーネント図の生成と修正: このチュートリアルでは、AI搭載チャットボットを活用して、複雑なシステムのコンポーネントレベルのアーキテクチャを段階的に作成・改善する方法を示します。
- AI搭載C4図生成ツール:コアレベルと補助ビュー: このページでは、AI生成ツールがC4モデルの4つのコアレベル(コンテキスト、コンテナ、コンポーネント、展開)をサポートすることで、包括的なドキュメントを提供する仕組みを説明しています。
- AI図表生成ツール:C4モデル完全対応リリース: このアップデートでは、階層的なC4モデル図の自動作成に向けたAI機能の統合について説明しています。
- C4モデルAI生成ツール:モデル作成ライフサイクルの完全自動化: このリソースでは、専用のAIチャットボットが会話形式のプロンプトを使用して、DevOpsチームのアーキテクチャドキュメントの整合性を保つ方法を強調しています。
- 包括的レビュー:汎用AIチャットボットとVisual ParadigmのC4ツールの比較: この比較では、汎用言語モデルよりも、C4 PlantUML Studioのような専門ツールがより構造的でプロフェッショナルな結果を提供する理由を説明しています。






