소프트웨어 개발 분야에서는 아키텍처 설계를 명확하게 전달하는 것이 매우 중요합니다. C4 모델(컨텍스트, 컨테이너, 구성 요소, 코드)은 개발 아키텍트를 위해 맞춤화된 시스템 아키텍처 다이어그램 방법입니다. 이는 시스템의 다양한 수준의 아키텍처 정보를 표현하는 간단하고 명확하며 이해하기 쉬운 방법을 제공하여 개발자, 아키텍트 및 이해 관계자가 아키텍처 관련 결정을 더 잘 이해하고 전달하는 데 도움이 됩니다.
C4 모델은 Simon Brown이 그의 책 "Software Architecture for Developers"에서 처음 제안했습니다. 일련의 다이어그램을 통해 소프트웨어 시스템의 아키텍처를 보여주는 것을 목표로 합니다. 이러한 다이어그램은 시스템 컨텍스트 다이어그램, 컨테이너 다이어그램, 구성 요소 다이어그램, 코드 다이어그램을 포함하여 시스템의 다양한 수준에 따라 구분됩니다. C4 모델은 특정 그래픽이나 모델링 언어를 사용할 필요가 없으므로 사용자는 매우 유연하게 건축 다이어그램을 생성할 수 있습니다.
시스템 컨텍스트 다이어그램은 C4 모델의 최상위에 위치하며 소프트웨어 시스템 아키텍처 다이어그램의 시작점입니다. 여기에는 시스템 경계, 시스템 관련 사용자, 기타 지원 시스템 및 시스템과의 상호 작용을 포함한 시스템의 전반적인 그림이 표시됩니다. 이 유형의 다이어그램은 기술적 세부 사항을 설명하지 않고도 간단하고 직관적이기 때문에 기술적인 지식이 없는 이해 관계자에게 적합합니다.
주요 요소: 설명할 소프트웨어 시스템, 사용자, 외부 종속 시스템 등.
대상 청중: 소프트웨어 개발팀 내부 및 외부의 모든 사람, 기술자, 비기술자 모두.

컨테이너 다이어그램은 시스템 컨텍스트 다이어그램을 확대하고 보완한 것으로, 시스템의 물리적 구조를 보여줍니다. 각 컨테이너는 웹 서버, 애플리케이션 서버, 데이터베이스 서버 등 개별적으로 실행/배포 가능한 단위를 나타냅니다. 컨테이너 다이어그램은 시스템의 주요 기술 선택과 컨테이너 간의 통신 및 상호작용도 보여줍니다.
주요 요소: Spring Boot 패키지 애플리케이션, MySQL 데이터베이스, Redis 등과 같은 소프트웨어 시스템 범위 내의 컨테이너입니다.
대상 청중: 소프트웨어 아키텍트, 개발자, 운영/지원 직원을 포함한 소프트웨어 개발팀 내부 및 외부의 기술자.

구성 요소 다이어그램은 컨테이너 깊숙이 들어가 컨테이너에 들어 있는 구성 요소와 구성 요소 간의 관계를 보여줍니다. 구성요소는 일반적으로 사용자 인터페이스, 비즈니스 로직, 데이터 처리 등 시스템의 주요 비즈니스 기능을 나타냅니다. 이러한 유형의 다이어그램은 개발자와 설계자에게 매우 중요합니다. 시스템 내부 구조를 자세히 볼 수 있기 때문입니다.
주요 요소: Dubbo 인터페이스, REST 인터페이스, 서비스 등과 같은 컨테이너 내부의 구성 요소입니다.
대상 청중: 소프트웨어 아키텍트 및 개발자.

코드 다이어그램은 구성 요소 내의 클래스와 그 상호 작용을 보여주며 가장 세부적인 수준입니다. 이러한 유형의 다이어그램은 일반적으로 클래스, 속성, 메서드, 관계를 포함하여 단일 구성 요소의 구현 세부 정보를 보여주는 데 사용됩니다. 그러나 오늘날 애자일 개발이 초점인 세상에서는 코드가 아직 작성되지 않은 매우 중요한 구성 요소가 아닌 한 코드 다이어그램을 만드는 것이 권장되지 않습니다.
주요 요소: 클래스, 인터페이스, 객체, 함수, 데이터베이스 테이블 등과 같은 구성 요소 내의 코드 요소입니다.
대상 청중: 소프트웨어 아키텍트 및 개발자.

또한 C4 모델에는 다양한 수준과 시나리오에서 소프트웨어 시스템의 결합과 협업을 설명하기 위한 시스템 랜드스케이프 다이어그램, 동적 다이어그램, 배포 다이어그램과 같은 확장된 뷰가 포함되어 있습니다.
C4 차트를 그리는 데는 많은 도구가 있습니다. 일반적인 도구로는 draw.io, Plantuml, ProcessOn 등이 있습니다. 사용자는 필요에 따라 적절한 차트 도구를 선택할 수 있습니다. 초보자에게는 ProcessOn을 사용하는 것이 좋습니다. ProcessOn 은 전문적인 플로우차트 도구로, C4 차트의 온라인 그리기를 지원하고 다양한 스파이더 차트 템플릿을 제공합니다.