Mermaid 다이어그램 치트시트 (OOA/D용)
Larman 프로세스에서 필요한 Mermaid 문법은 딱 두 가지다: sequenceDiagram과 classDiagram. 이 노트는 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 하나를 권장한다.