Files
2nd/10_Wiki/Topics/C4_Model.md
T
2026-05-02 23:55:09 +09:00

9.1 KiB

category, tags, title, description, last_updated
category tags title description last_updated
Unified
auto-wikified
technical-documentation
C4 Model C4 모델은 소프트웨어 아키텍처 다이어그램을 컨텍스트(Context), 컨테이너(Container), 컴포넌트(Component), 코드(Code)의 4가지 추상화 수준으로 계층화하여 표현하는 접근법입니다[1]. 2026-05-02

C4 Model

📌 Brief Summary

C4 모델은 소프트웨어 아키텍처 다이어그램을 컨텍스트(Context), 컨테이너(Container), 컴포넌트(Component), 코드(Code)의 4가지 추상화 수준으로 계층화하여 표현하는 접근법입니다[1]. 이 모델은 마치 지도를 확대(Zoom-in)하듯 상위 수준의 시스템 개요부터 세부적인 코드 구현까지 점진적으로 세부 사항을 제공하여, 기술적 지식이 다른 다양한 이해관계자들이 직관적으로 시스템을 이해할 수 있도록 돕습니다[1, 2]. 표준화되고 도구에 종속되지 않는 뷰를 제공함으로써 복잡한 코드베이스와 시스템 설계를 일관된 어휘로 소통하는 데 유용합니다[1, 3].

📖 Core Content

C4 모델은 혼재된 추상화 수준으로 인한 혼란을 방지하기 위해 소프트웨어 구조를 다음과 같은 4단계의 명확한 계층으로 시각화합니다[1, 2].

  • 레벨 1: 컨텍스트 다이어그램 (Context Diagram)
    • 가장 높은 추상화 수준으로 시스템을 하나의 블랙박스로 취급합니다[4, 5].
    • 누가 시스템을 사용(역할/사용자)하는지, 그리고 시스템이 상호작용하는 외부 시스템은 무엇인지를 보여주어 전체적인 경계와 의존성을 정의합니다[1, 4, 5].
  • 레벨 2: 컨테이너 다이어그램 (Container Diagram)
    • 컨텍스트를 확대하여 시스템 내의 주요 기술적 구성 블록들을 보여줍니다[1].
    • 여기서 컨테이너란 실행 가능하거나 배포 가능한 단위(예: 애플리케이션, 데이터베이스, 파일 시스템 등)를 의미합니다[5].
    • 각 컨테이너에 할당된 책임, 주요 기술 선택, 통신 채널 및 의존성을 매핑합니다[5].
  • 레벨 3: 컴포넌트 다이어그램 (Component Diagram)
    • 특정 컨테이너 내부를 확대하여 주요 구조적 컴포넌트들과 그 상호작용을 드러냅니다[1, 6].
    • 컨테이너가 제공하거나 요구하는 기능, 내부 API, 컴포넌트 간의 의존성 및 구현 기술을 구체적으로 보여줍니다[2, 7].
  • 레벨 4: 코드 다이어그램 (Code Diagram)
    • 선택적으로 제공되는 가장 낮은 수준의 뷰로, 코드가 어떻게 구성되어 있는지 상세히 보여줍니다[1].
    • 주로 UML(Unified Modeling Language) 클래스 다이어그램을 활용해 객체와 클래스의 정적 구조를 표현합니다[1].

C4 모델의 이점

  • 단순한 블록과 선의 나열을 넘어, 청중(비기술적 이해관계자부터 개발자까지)에 따라 필요한 만큼의 세부 정보를 맞춤형으로 제공할 수 있습니다[1].
  • 추상화 수준이 섞이는 것을 방지하여 복잡한 시스템 아키텍처에 대한 팀 간의 의사소통과 이해도를 극대화합니다[1-3].
  • 복잡한 코드베이스를 읽고 파악할 때, 직관적인 탐색 경로를 제공하여 개발자의 인지적 과부하를 줄여줍니다[8].

⚖️ Trade-offs & Caveats

  • 세밀한 명세의 한계: C4 모델은 다양한 이해관계자와 직관적으로 소통하는 데 다재다능하지만, 고도로 복잡하고 정밀한 소프트웨어 명세를 표현할 때는 UML이 제공하는 풍부함과 상세한 의미적(Semantic) 디테일이 부족할 수 있습니다[3].
  • 클라우드 인프라 표현의 부족: 논리적 소프트웨어 아키텍처에 초점을 맞추기 때문에, 클라우드 아키텍처 다이어그램에서 필수적으로 다루는 하드웨어의 물리적 배치, 서브넷(Subnets), VPC(Virtual Private Clouds), 라우터 등의 복잡한 클라우드 배포 인프라 및 네트워킹 요소를 구체적으로 표현하는 데는 적합하지 않습니다[3, 9].

🔗 Knowledge Connections

[관계 유형 A: 아키텍처/기반 기술]

  • UML (Unified Modeling Language)

    • 연결 이유: C4 모델의 '코드' 레벨 다이어그램에서 주로 채용되는 언어이자, C4가 커버하지 못하는 복잡한 명세(클래스 관계, 상호작용 등)를 구체적으로 표현할 수 있는 표준 모델링 언어입니다[1, 3].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 시스템의 객체 지향 설계, 클래스 간의 관계(상속, 합성 등) 및 정밀한 정적/동적 구조 모델링[10].
  • Architecture Diagrams

    • 연결 이유: C4 모델을 구성하는 핵심 시각화 산출물(컨텍스트, 컨테이너, 컴포넌트 다이어그램)들의 총칭입니다[4, 6, 7].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 소프트웨어 시스템의 청사진을 그리고 이해관계자와 구조, 통신 채널, 의존성을 소통하는 기본 원리[11, 12].

[관계 유형 B: 구현/활용 도구]

  • Structurizr

    • 연결 이유: C4 모델을 기반으로 아키텍처 다이어그램을 코드로 정의(Diagrams as Code)하고 시각화할 수 있도록 지원하는 대표적인 도구입니다[13].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 아키텍처 문서를 버전 관리 시스템과 친화적으로 관리하고 일관된 스타일링을 강제하는 방법[13].
  • vFunction

    • 연결 이유: 복잡하게 얽힌 기존의 분산 아키텍처(마이크로서비스 등)를 실시간으로 분석하여 C4 컨테이너 다이어그램 형식으로 아키텍처를 추출하고 내보낼 수 있는 도구입니다[14, 15].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 코드를 통해 실제 구동 중인 아키텍처를 가시화하고, 설계도와의 차이(Architectural Drift)를 파악하는 전략[14, 15].

Deeper Research Questions

  • C4 모델의 4단계 추상화 구조는 PM(Product Manager), 프론트엔드 개발자, 백엔드 개발자, 그리고 인프라 운영자의 시스템 이해 요구를 각각 어떻게 만족시키는가?
  • 정교한 기술 명세가 필요할 때 C4 모델과 UML을 어떻게 결합하거나 상호 보완하여 사용하는 것이 가장 이상적인가?
  • 대규모 레거시 모놀리스(Monolith) 시스템을 분석할 때, C4 컨테이너 다이어그램 추출이 결합도(Coupling)와 바운더리를 파악하는 데 어떤 도움을 주는가?
  • 클라우드 네이티브 애플리케이션 아키텍처를 설계할 때, C4 모델이 표현하지 못하는 인프라 요소(VPC, 로드밸런서 등)를 클라우드 전용 다이어그램과 어떻게 혼합하여 문서화할 수 있는가?
  • Structurizr 등을 통해 다이어그램을 코드(Diagrams as Code)로 관리할 경우, 기존의 정적 이미지 기반 문서화 방식이 가졌던 '문서 최신화 실패' 문제를 어떻게 해결할 수 있는가?

Practical Application Contexts

  • Implementation: 새로운 기능 구현 시, 개발자는 C4의 컴포넌트 다이어그램을 통해 해당 모듈의 내부 구조와 책임, 그리고 외부와의 의존성을 파악한 뒤 코드를 안전하게 수정할 수 있습니다[6, 7].
  • System Design: 신규 시스템을 설계할 때 외부 시스템과 사용자의 관계(컨텍스트)를 먼저 식별하고, 점진적으로 내부 컨테이너와 컴포넌트를 명세하는 논리적이고 체계적인 하향식(Top-down) 가이드로 작용합니다[16].
  • Operation / Maintenance: 운영 중인 분산 마이크로서비스 환경에서 실시간 런타임 분석 도구(예: vFunction)와 결합하여 참조 C4 아키텍처를 구성하면, 설계 의도와 다르게 변질된 아키텍처 드리프트(Architectural Drift)를 모니터링하고 추적할 수 있습니다[14, 15].
  • Learning Path: 복잡한 대규모 코드베이스에 온보딩하는 개발자는 가장 상위 수준의 다이어그램(컨텍스트/컨테이너)부터 시작해 필요한 영역만 코드로 줌인(Zoom-in)해 들어감으로써, 정보 과부하 없이 시스템을 학습할 수 있습니다[1, 8].
  • My Project Relevance: 코드베이스의 전반적인 아키텍처를 문서화하고 비기술적 이해관계자나 새로운 팀원에게 시스템을 브리핑할 때, 청중의 이해도에 맞춰 다이어그램의 깊이를 조절하는 커뮤니케이션 도구로 활용 가능합니다[1].

Adjacent Topics

  • Diagrams as Code
    • 확장 방향: PlantUML, Mermaid와 같이 텍스트 기반으로 다이어그램을 생성하여, 코드와 문서를 동일한 Git 저장소에서 함께 버저닝(Versioning)하고 자동화하는 방법론[13, 14].
  • Layered Architecture
    • 확장 방향: 시스템을 프레젠테이션, 비즈니스 로직, 데이터 접근 등의 수평적 계층으로 분리하는 전통적 아키텍처 패턴으로, C4의 컴포넌트 구조를 설계하고 분석할 때 핵심이 되는 개념[17, 18].

Last updated: 2026-05-02