---
tags: [개발/설계, template/mermaid, c4, architecture]
---

# C4 — 컨텍스트 · 컨테이너

시스템을 4계층(Context→Container→Component→Code)으로 그리는 표준. 발표에는 위 2계층(누가 쓰나 / 무엇으로 구성되나)이면 충분하다.

## Level 1 — System Context (누가·무엇과 연결되나)

```mermaid
C4Context
    title 시스템 컨텍스트
    Person(user, "사용자", "웹·모바일로 이용")
    Person(admin, "운영자", "내부 관리 도구")
    System(app, "우리 서비스", "핵심 애플리케이션")
    System_Ext(pay, "결제 PG", "외부 결제")
    System_Ext(mail, "메일 발송", "트랜잭션 메일")
    SystemDb_Ext(idp, "SSO / IdP", "외부 인증")

    Rel(user, app, "사용", "HTTPS")
    Rel(admin, app, "관리", "HTTPS")
    Rel(app, pay, "결제 요청", "REST/webhook")
    Rel(app, mail, "발송", "API")
    Rel(app, idp, "인증 위임", "OIDC")
```

## Level 2 — Container (무엇으로 구성되나)

```mermaid
C4Container
    title 컨테이너 구성
    Person(user, "사용자")
    Container(web, "Web 앱", "React", "브라우저 SPA")
    Container(api, "API 서버", "Node/Go", "비즈니스 로직")
    Container(worker, "워커", "큐 소비자", "비동기 작업")
    ContainerDb(db, "DB", "PostgreSQL", "원장 데이터")
    ContainerDb(cache, "캐시", "Redis", "세션·핫데이터")
    ContainerQueue(mq, "큐", "메시지 브로커", "비동기 이벤트")

    Rel(user, web, "이용", "HTTPS")
    Rel(web, api, "호출", "REST/JSON")
    Rel(api, db, "읽기·쓰기", "SQL")
    Rel(api, cache, "조회", "TCP")
    Rel(api, mq, "발행", "")
    Rel(mq, worker, "소비", "")
    Rel(worker, db, "쓰기", "SQL")
```

반드시 표기할 것: 신뢰 경계(외부 시스템 vs 내부), 프로토콜, 원장 저장소와 캐시 구분, 동기(REST)·비동기(큐) 구분. 컨테이너 = 배포 단위이지 클래스가 아니다.
