research

Mermaid 다이어그램 치트시트 (OOA/D용)

Mermaid 다이어그램 치트시트 (OOA/D용)

Larman 프로세스에서 필요한 Mermaid 문법은 딱 두 가지다: sequenceDiagramclassDiagram. 이 노트는 OOA/D 산출물을 그리는 데 필요한 문법만 모았다.


1. sequenceDiagram

SSD와 Interaction Diagram 둘 다 이걸로 그린다. 차이는 참여자가 누구냐뿐.

기본 구조

sequenceDiagram
    participant A as 표시이름
    participant B as 표시이름

    A->>B: 메시지(파라미터)
    B-->>A: 리턴값

화살표 종류

| 문법 | 모양 | 용도 | |---|---|---| | ->> | 실선, 닫힌 화살표 | 동기 메시지 (일반적인 호출) | | -->> | 점선, 닫힌 화살표 | 리턴 | | --) | 실선, 열린 화살표 | 비동기 메시지 | | --) | 점선, 열린 화살표 | 비동기 리턴 |

대부분의 경우 ->>-->> 만 쓰면 된다.

액터 vs 참여자

sequenceDiagram
    actor Cashier           %% 사람 아이콘
    participant System      %% 박스 아이콘
  • SSD에서는 actor(사람)와 participant(시스템)을 구분
  • Interaction Diagram에서는 전부 participant(소프트웨어 객체)

반복 (loop)

sequenceDiagram
    actor Cashier
    participant System

    loop [more items]
        Cashier->>System: enterItem(itemID, qty)
        System-->>Cashier: description, total
    end

조건 분기 (alt/else)

sequenceDiagram
    participant :Register
    participant :Sale

    alt cash payment
        :Register->>:Sale: makeCashPayment(amount)
    else credit payment
        :Register->>:Sale: makeCreditPayment(credNum, expiry)
    end

선택적 (opt)

sequenceDiagram
    participant :Sale
    participant :Discount

    opt has discount strategy
        :Sale->>:Discount: applyDiscount(total)
    end

객체 생성 표현

Mermaid에는 UML의 <<create>> 스테레오타입이 없다. Note나 메시지 이름으로 표현한다:

sequenceDiagram
    participant :Sale
    participant :SalesLineItem

    :Sale->>:SalesLineItem: create(spec, qty)
    Note over :SalesLineItem: 새 인스턴스 생성

노트 (Note)

sequenceDiagram
    participant :Register

    Note over :Register: Controller 패턴 적용
    Note right of :Register: Expert에 의해 위임
    Note over :Register,:Sale: 이 두 객체가 협력

SSD 실전 예시

Interaction Diagram 실전 예시


2. classDiagram

Domain Model(메서드 없음)과 DCD(메서드 있음) 둘 다 이걸로 그린다.

기본 구조

classDiagram
    class ClassName {
        -privateAttr: Type
        +publicMethod(param): ReturnType
    }

접근 제어자

| 기호 | 의미 | |---|---| | + | public | | - | private | | # | protected | | ~ | package/internal |

관계 종류

| 문법 | 모양 | 의미 | 예시 | | ----------- | -------- | --------------------- | ----------------------------------- | | A -- B | 실선 | 연관 (association) | Sale -- Payment | | A --> B | 실선 화살표 | 단방향 연관 (navigability) | Register --> Sale | | A --o B | 다이아몬드(빈) | 집약 (aggregation) | Sale --o SalesLineItem | | A --* B | 다이아몬드(찬) | 합성 (composition) | Sale --* SalesLineItem | | A ..\|> B | 점선 삼각형 | 구현 (implements) | StripeAdapter ..|> IPaymentGateway | | A --\|> B | 실선 삼각형 | 상속 (extends) | CreditPayment --|> Payment | | A .. B | 점선 | 의존 (dependency) | Register .. ProductCatalog |

다중성 (Multiplicity)

classDiagram
    Sale "1" --> "*" SalesLineItem : contains
    Register "1" --> "1" ProductCatalog : looks-in

라벨을 " " 안에 넣는다. 흔한 표기: "1", "*", "0..1", "1..*"

인터페이스

classDiagram
    class IPaymentGateway {
        <<interface>>
        +processPayment(amount): Boolean
    }
    class StripeAdapter {
        +processPayment(amount): Boolean
    }
    StripeAdapter ..|> IPaymentGateway

추상 클래스

classDiagram
    class AbstractPayment {
        <<abstract>>
        -amount: Money
        +getAmount()* Money
    }

Domain Model 실전 예시 (메서드 없음)

DCD 실전 예시 (메서드 있음)


이름 컨벤션:

  • SSD: actor Cashier, participant System (역할 이름)
  • Interaction Diagram: participant reg as :Register (콜론+클래스명은 인스턴스를 의미)
  • Domain Model: 클래스명만 (Register, Sale)
  • DCD: 클래스명 + 메서드 + 속성

Obsidian에서 렌더링: Obsidian은 Mermaid를 기본 지원한다. 코드 블록을 ```mermaid로 시작하면 바로 렌더링된다.

복잡한 다이어그램이 깨질 때: Mermaid는 복잡한 UML을 완벽하게 지원하지 않는다. 너무 복잡해지면 다이어그램을 쪼개라. Larman도 시스템 이벤트 하나당 Interaction Diagram 하나를 권장한다.