Skip to content

C4 図

C4 図は、異なる抽象レベルでソフトウェアアーキテクチャを視覚化する方法を提供します。C4 モデルは、コンテキスト(Context)、コンテナ(Container)、コンポーネント(Component)、コード(Code)の4つのレベルの図で構成されています。

構文

基本要素

  • 人: Person(エイリアス, ラベル)
  • システム: System(エイリアス, ラベル)
  • コンテナ: Container(エイリアス, ラベル, 技術)
  • コンポーネント: Component(エイリアス, ラベル, 技術)
  • 関係: Rel(from, to, ラベル)

基本例

コード:
mermaid
C4Context
    title インターネットバンキングシステムのシステムコンテキスト図
    
    Person(customer, "銀行顧客", "銀行の顧客")
    System(banking_system, "インターネットバンキングシステム", "顧客が口座情報を確認できるようにする")
    
    Rel(customer, banking_system, "利用")
Ctrl + Enter|

応用例

より詳細なWebアプリケーションのコンテナ図:

コード:
mermaid
C4Container
    title インターネットバンキングシステムのコンテナ図

    Person(customer, "銀行顧客", "銀行の顧客")
    
    System_Boundary(banking_system, "インターネットバンキングシステム") {
        Container(web_app, "Webアプリケーション", "Java, Spring MVC", "静的コンテンツとSPAを提供")
        Container(spa, "シングルページアプリ", "JavaScript, Angular", "すべてのバンキング機能を提供")
        Container(mobile_app, "モバイルアプリ", "Kotlin, Android", "限定的なバンキング機能を提供")
        Container(api, "APIアプリケーション", "Java, Spring Boot", "API経由でバンキング機能を提供")
        ContainerDb(database, "データベース", "Oracle Database", "ユーザー登録情報、認証情報、アクセスログ等を保存")
    }

    Rel(customer, web_app, "利用", "HTTPS")
    Rel(customer, spa, "利用", "HTTPS")
    Rel(customer, mobile_app, "利用")
    Rel(web_app, spa, "提供")
    Rel(spa, api, "利用", "JSON/HTTPS")
    Rel(mobile_app, api, "利用", "JSON/HTTPS")
    Rel(api, database, "読み書き", "JDBC")
Ctrl + Enter|

コンポーネントレベル

コード:
mermaid
C4Component
    title インターネットバンキングシステムのAPIアプリケーションコンポーネント図

    Container_Boundary(api, "APIアプリケーション") {
        Component(sign_in_controller, "サインインコントローラー", "Spring MVC Rest Controller", "ユーザーのサインイン機能を提供")
        Component(security_component, "セキュリティコンポーネント", "Spring Security", "サインインやパスワード変更などの機能を提供")
        Component(user_repository, "ユーザーリポジトリ", "Spring Data", "ユーザー情報へのアクセスを提供")
    }

    Rel(sign_in_controller, security_component, "使用")
    Rel(security_component, user_repository, "使用")
Ctrl + Enter|

デプロイメント図

コード:
mermaid
C4Deployment
    title インターネットバンキングシステムのデプロイメント図

    Deployment_Node(customer_computer, "顧客のコンピュータ", "Microsoft Windows または Apple macOS") {
        Deployment_Node(web_browser, "Webブラウザ", "Chrome, Firefox, Safari, または Edge") {
            Container(spa, "シングルページアプリ", "JavaScript, Angular", "すべてのバンキング機能を提供")
        }
    }

    Deployment_Node(data_center, "データセンター") {
        Deployment_Node(server, "アプリケーションサーバー", "Ubuntu 20.04 LTS") {
            Container(api, "APIアプリケーション", "Java, Spring Boot")
        }
        Deployment_Node(database_server, "データベースサーバー", "Oracle") {
            ContainerDb(database, "データベース", "Oracle 19c")
        }
    }

    Rel(spa, api, "API呼び出し", "JSON/HTTPS")
    Rel(api, database, "読み書き", "JDBC")
Ctrl + Enter|

追加機能

境界と企業

コード:
mermaid
C4Context
    Enterprise_Boundary(enterprise, "銀行") {
        System(banking_system, "インターネットバンキングシステム")
        System(atm_system, "ATMシステム")
    }
    
    Person(customer, "顧客")
    System_Ext(mail_system, "メールシステム")
    
    Rel(customer, banking_system, "利用")
    Rel(customer, atm_system, "ATMで引き出し")
    Rel(banking_system, mail_system, "メール送信")
Ctrl + Enter|

スタイル設定

C4 図は自動的に:

  • 異なる種類の要素をフォーマット
  • 関係と依存関係を表示
  • 技術スタックを表示
  • 階層構造を整理
  • 一貫した視覚言語を使用

実用的なヒント

  • コンテキスト図から開始
  • コンテナとコンポーネントビューで徐々に詳細を追加
  • 図の焦点を明確に保つ
  • 関連する技術的詳細を含める
  • 重要な関係を表示
  • 意味のある説明を使用
  • 適切な場所に技術選択を含める
  • 対象者の技術レベルを考慮

よくある問題の解決

  1. 複雑さの問題

    • 適切な抽象レベルを選択
    • 複雑なシステムを分解
    • 境界を使用して要素を整理
  2. 可読性の問題

    • 明確な階層構造を維持
    • 過度な関係線を避ける
    • 意味のあるラベルを使用
  3. 一貫性の問題

    • C4モデルの規約に従う
    • 命名の一貫性を保つ
    • 統一された表現方法を使用

ベストプラクティス

  • 適切な抽象レベルを選択
  • 図をシンプルに保つ
  • 明確な命名を使用
  • 必要な技術的詳細を含める
  • 重要な関係を強調
  • 図の対象者を考慮
  • ビュー間の一貫性を保つ

次のステップ