- 技術 💻
- 設計
シーケンス図の書き方|記号・alt/loop等と実務3パターン
シーケンス図とは、システムの登場人物(利用者、画面、API、データベースなど)が、どの順番でどんなメッセージをやり取りするかを、時間の流れに沿って表すUMLの図です。 上から下へ時間が進み、横に並んだ登場人物の間を矢印でつないで表します。
記号の紹介だけなら多くの解説がありますが、実務で迷うのは「タイムアウトや再試行はどう描くか」「非同期処理の矢印はどれか」「どこまで細かく描くか」といった点です。この記事では、記号と複合フラグメント(alt、loopなどの枠)7種類の意味を表で整理したうえで、ログイン/外部API呼び出し+タイムアウト/非同期ジョブの実務3パターンをMermaidで示します。掲載したMermaidはすべて mermaid-cli 12.0.0 で描画できることを確認済みです。PlantUML版、詳細度の判断基準、NG例の修正、コードから起こすコツ、AIに描かせるときの指示例もまとめました。
シーケンス図の書き方の早見表
| 手順 | やること | ポイント |
|---|---|---|
| 1 | 描くシナリオを1つに絞る | 「ログイン成功と失敗」など、1枚1テーマ |
| 2 | 登場人物(ライフライン)を左から並べる | 呼び出す側を左、呼ばれる側を右に |
| 3 | 正常系のメッセージを上から順に描く | 同期・非同期・戻りを矢印で区別 |
| 4 | 分岐・繰り返しを枠(複合フラグメント)で囲む | alt、opt、loop などを使い分ける |
| 5 | 異常系(エラー、タイムアウト)を足す | 設計レビューで一番見られる部分 |
| 6 | 目的に合わせて詳細度を調整する | 基本設計用とレビュー用で粒度を変える |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「シーケンス図の書き方|記号・alt/loop等と実務3パターン」
シーケンス図の記号一覧
| 要素 | 見た目(UML) | 意味 | Mermaid の書き方 |
|---|---|---|---|
| ライフライン | 上に箱、下に縦の破線 | 登場人物と、その存在期間 | participant A as 名前 |
| アクター | 人の形 | システムの外の利用者 | actor U as 会員 |
| 活性区間(実行仕様) | ライフライン上の細長い箱 | その登場人物が処理を実行中の期間 | activate A / 矢印の + - |
| 同期メッセージ | 実線+塗りつぶし矢じり | 呼び出して、応答を待つ | A->>B: 処理 |
| 非同期メッセージ | 実線+開いた矢じり | 送ったら待たずに次へ進む | A-)B: 処理 |
| 戻り(応答)メッセージ | 破線+開いた矢じり | 呼び出しへの応答 | B-->>A: 結果 |
| 自己呼び出し | 自分に戻る矢印 | 自分の中の処理 | A->>A: 処理 |
| 生成 | 破線の矢印が箱に直接届く | 途中で登場人物が作られる | create participant F |
| 破棄 | ライフラインの終わりに × | 登場人物が消える | destroy F |
| ノート | 角の折れた紙 | 補足説明 | Note over A: 説明 |
※Mermaid では、非同期メッセージを -)、×付きの矢印を -x で描きます。->> と -) は矢じりの形が違うだけなので、同期か非同期かを凡例やノートで補うと読み違いが減ります。
複合フラグメント(alt・opt・loop など)の意味
複合フラグメントとは、メッセージのまとまりを枠で囲み、左上の演算子で「分岐」「繰り返し」などの意味を与える記法です。 枠の中の条件は [ ] に書きます(ガード条件)。
| 演算子 | 意味 | 使う場面の例 | Mermaid |
|---|---|---|---|
| alt | 条件による分岐(if / else)。どれか1つだけ実行 | パスワード一致/不一致 | alt 〜 else 〜 end |
| opt | 条件を満たすときだけ実行(elseなしのif) | ポイントがあれば割引 | opt 〜 end |
| loop | 繰り返し | 最大3回まで再試行 | loop 〜 end |
| par | 並行して実行(順序は問わない) | 通知と状態更新を同時に | par 〜 and 〜 end |
| break | 条件を満たしたら枠内を実行し、外側の残りを打ち切る | 再試行しても失敗したら終了 | break 〜 end |
| critical | 枠内を割り込まれずに一続きで実行する | ロックを取って更新 | critical 〜 end |
| ref | 別のシーケンス図を参照する(相互作用の利用) | 「ログイン処理」を別図に切り出す | Mermaid 未対応(ノートで代用) |
UML 2.5 の仕様では、このほかに neg(起きてはいけない)、assert(必ずこうなる)、strict、seq、ignore、consider も定義されています。業務システムの設計書では、上の表の7種類でほとんどの場面を表せます。
altとoptの使い分けは「else側で何かするか」です。else側で何もしないならopt、何かするならaltにします。また、Mermaid の critical には option で別の状況を書き足す独自の書き方がありますが、UMLの critical は枠を1つだけ持つ演算子なので、分岐は中に alt を入れて表すと、UMLに慣れた読み手にも伝わりやすくなります。
実務パターン1:ログイン(alt)
架空の「会員制の予約サイト」のログインです。正常系と、パスワード不一致をaltで分けます。
sequenceDiagram
autonumber
actor U as 会員
participant B as ブラウザ
participant A as 認証API
participant D as 会員DB
U->>B: ID・パスワードを入力
B->>+A: POST /login
A->>+D: 会員を検索(ID)
D-->>-A: 会員レコード
alt パスワード一致
A->>A: セッションを発行
A-->>B: 200 OK(Cookie)
B-->>U: マイページを表示
else 不一致
A->>D: 失敗回数を+1
A-->>B: 401 Unauthorized
B-->>U: エラーを表示
end
deactivate A
※WordPressでMermaidの図を表示するには、Mermaid対応のプラグインが必要です。
ポイント
autonumberでメッセージに通し番号が付き、レビューで「5番の矢印ですが」と指摘しやすくなりますB->>+Aの+で活性区間を開始し、最後にdeactivate Aで閉じています- 戻りメッセージにはHTTPステータスなど「何が返るか」を書くと、API設計との対応が明確になります
同じ図をPlantUMLで書く
PlantUMLは、Javaで動くテキスト作図ツールです。データベースを円柱で描ける、ref over が使えるなど、UMLの記法に近い表現ができます。
@startuml
autonumber
actor 会員 as U
participant ブラウザ as B
participant 認証API as A
database 会員DB as D
U -> B : ID・パスワードを入力
B -> A : POST /login
activate A
A -> D : 会員を検索(ID)
activate D
D --> A : 会員レコード
deactivate D
alt パスワード一致
A -> A : セッションを発行
A --> B : 200 OK(Cookie)
B --> U : マイページを表示
else 不一致
A -> D : 失敗回数を+1
A --> B : 401 Unauthorized
B --> U : エラーを表示
end
deactivate A
@enduml
このコードは、PlantUML(1.2019.06、Java 21で実行)でPNGに描画できることを確認しました。
| 観点 | Mermaid | PlantUML |
|---|---|---|
| 実行環境 | ブラウザ(JavaScript)。GitHubなどのMarkdownで表示できる | Java(+一部の図はGraphviz)。サーバーやエディタ拡張で表示 |
| 同期の矢印 | ->> |
-> |
| 戻りの矢印 | -->> |
--> |
| 非同期の矢印 | -) |
->> |
| ref(別図の参照) | なし | ref over A, B : ログイン処理 |
| 向いている場面 | Markdownの設計書、README | UMLの表現を細かく使いたい設計書 |
MermaidとPlantUMLでは、->> の意味が逆(Mermaidは同期、PlantUMLは非同期)なので、書き換えるときは注意しましょう。
実務パターン2:外部API呼び出し+タイムアウト(alt・loop・break)
「ECの注文」で、外部の在庫サービスに在庫数を問い合わせる場面です。タイムアウト、再試行、打ち切りを1枚で表します。
sequenceDiagram
participant C as 画面
participant O as 注文API
participant S as 在庫サービス(外部)
participant L as ログ基盤
C->>+O: 注文内容を確認
O->>S: GET /stock/{sku}(タイムアウト3秒)
alt 3秒以内に応答
S-->>O: 200 在庫数
O-->>C: 在庫あり・注文可能
else タイムアウト
Note over O: 3秒経過で待つのをやめる
loop 最大2回(1秒・2秒あけて再試行)
O->>S: GET /stock/{sku}
end
break 再試行でも応答なし
O-)L: 警告ログを送信
O-->>C: 503(時間をおいて再操作を案内)
end
end
deactivate O
ポイント
- タイムアウトは「相手からの応答」ではないので、戻り矢印ではなく、呼び出し側のノートで表します
- 再試行の回数と間隔(1秒・2秒)はガード条件に数字で書きます。「数回」では実装とテストの基準になりません
- break は「条件を満たしたら、この枠を実行して外側の残りを打ち切る」という意味です。再試行で応答が得られたときは、枠を抜けて「在庫あり」と同じ流れになることを、ノートで補足しておくと親切です
- ログ送信は結果を待たないので、非同期メッセージ(
-))にしています
実務パターン3:非同期ジョブ(非同期メッセージ・par・生成と破棄)
時間のかかるCSV出力を、ジョブキューで裏側に回す場面です。利用者はすぐに応答を受け取り、完了はメールで知らせます。
sequenceDiagram
actor U as 利用者
participant W as Webアプリ
participant Q as ジョブキュー
participant J as ワーカー
participant M as メール送信
U->>+W: CSV出力を依頼
W-)Q: ジョブ登録(job_id)
W-->>-U: 202 Accepted(job_id)
Q-)J: ジョブを取り出す
activate J
create participant F as 一時ファイル
J->>F: CSVを書き出す
par 通知
J-)M: 完了メールを依頼
and 状態更新
J->>Q: 状態=完了
end
destroy F
J-xF: DL用の領域へ移したら削除
deactivate J
opt 画面を開いたまま
U->>W: GET /jobs/{job_id}
W-->>U: 状態=完了・DLリンク
end
ポイント
- Webアプリはジョブを登録したらすぐ202を返すので、
W-)Qは非同期、W-->>-Uで活性区間が終わります create participantで途中から登場し、destroyで消える一時ファイルを表しています。生成と破棄を描くと、後片付け漏れのレビューがしやすくなります- par は「順序を問わない」という意味です。通知と状態更新のどちらが先でも問題ない、という設計判断を図で伝えられます
- 状態確認は画面を開いているときだけなので opt にしています
補足:critical(割り込ませない処理)
「会員制の予約サイト」で、同じ枠に2件の予約が入らないようにする場面です。
sequenceDiagram
participant A as 予約API
participant D as 予約DB
critical 同じ枠への予約を割り込ませない
A->>D: SELECT ... FOR UPDATE(枠をロック)
alt 空きあり
A->>D: INSERT 予約
else 満席
A->>A: 409 Conflict を返す準備
end
A->>D: COMMIT(ロック解放)
end
critical の範囲=ロックを持っている範囲として描くと、トランザクションの境界がレビューで確認しやすくなります。
詳細度の判断基準:基本設計用とレビュー用
シーケンス図は、目的によって「ちょうどよい細かさ」が変わります。
| 観点 | 基本設計用(関係者と合意する) | 詳細設計・コードレビュー用 |
|---|---|---|
| 主な読者 | 発注者、他チーム、テスト担当 | 開発者、レビュアー |
| ライフライン | システム・サービス・DB単位 | クラス・モジュール単位 |
| メッセージ名 | 業務の言葉、APIのエンドポイント | メソッド名と主な引数 |
| 異常系 | 利用者に見える結果(エラー画面、503) | 例外の種類、再試行、ロールバック |
| 書かないもの | クラス名、内部の処理 | getter、ログ出力、入力値の整形など |
| 1枚の目安 | ライフライン4〜6、矢印15前後 | 1ユースケースの1シナリオ |
迷ったら「この矢印を消すと、読み手の判断が変わるか」で残すかどうかを決めます。変わらない矢印は、ノートにまとめるか削除します。
NG例と修正
NG:内部の処理を全部描いて、分岐が見えない
sequenceDiagram
participant C as LoginController
participant S as AuthService
participant R as MemberRepository
participant H as PasswordHasher
C->>S: login(id, pw)
S->>S: validate(id)
S->>S: trim(id)
S->>R: findById(id)
R->>R: buildQuery()
R-->>S: member
S->>S: getHash()
S->>H: matches(pw, hash)
H-->>S: true
S-->>C: token
| 問題 | 理由 |
|---|---|
| 自己呼び出しが多い(validate、trim、getHash、buildQuery) | 読み手の判断に影響しない処理で、図が長くなる |
| 正常系しかない | 会員がいない、パスワード不一致のときの動きがわからない |
| 活性区間がない | どこで処理が止まって待っているのか読み取れない |
修正後:クラス間のやり取りと分岐に絞る
sequenceDiagram
participant C as LoginController
participant S as AuthService
participant R as MemberRepository
participant H as PasswordHasher
C->>+S: login(id, pw)
S->>+R: findById(id)
R-->>-S: member(なければ空)
S->>+H: matches(pw, hash)
H-->>-S: 一致 / 不一致
alt 会員あり かつ 一致
S-->>C: token
else それ以外
S-->>C: 認証エラー(どちらが違うかは返さない)
end
deactivate S
クラスの境界をまたぐメッセージだけを残し、異常系をaltで足しただけで、レビューで確認すべき点(エラー時に何を返すか)が見えるようになりました。
その他のよくあるNG
| NG | 修正 |
|---|---|
| 1枚に正常系・異常系・管理者操作を全部入れる | 1枚1シナリオ。共通部分は ref(またはノート)で別図に |
| 矢印のラベルが「処理」「データ」 | 「POST /login」「会員レコード」など具体的な名前に |
| 呼び出し側が右、呼ばれる側が左にある | 左から右へ流れるように並べ替える |
| 同期と非同期が区別されていない | 待つかどうかで矢印を使い分け、必要なら凡例を付ける |
| 戻り矢印をすべて省略する | 省略するなら「戻りは省略」と注記し、エラーの戻りだけは描く |
コードからシーケンス図を起こすときのコツ
既存システムの調査や、実装後の設計書更新で、コードから図を起こすこともよくあります。
| コツ | 具体的な方法 |
|---|---|
| 入口から1シナリオだけ追う | コントローラーやAPIのハンドラーから始め、1つのリクエストの流れを追う |
| 境界をまたぐ呼び出しだけ拾う | クラス・サービス・DB・外部APIの間の呼び出しを矢印にし、内部処理は省く |
| 分岐は「結果が変わるもの」だけ | 例外で処理が終わる、返すステータスが変わる分岐をaltにする |
| 実際の順番はログやトレースで確かめる | 分散トレーシング(OpenTelemetryなど)のスパンの親子関係と時刻は、そのままシーケンス図の材料になる |
| 非同期の境界に印を付ける | キューへの登録、イベント発行、別スレッドの起動は -) で描く |
| 図の対象バージョンを書く | 図のタイトルやノートにブランチ名・リリース番号を残す |
AIにシーケンス図を描かせるときの指示例
生成AIは、Mermaid や PlantUML のコードを書くのが得意です。登場人物・シナリオ・異常系・詳細度を指定すると、手直しの少ない図になります。
次の処理のシーケンス図を Mermaid の sequenceDiagram で書いてください。
# 対象
- 会員制の予約サイトの「予約確定」API(POST /reservations)
# 登場人物(左から順に)
- 会員(actor)、ブラウザ、予約API、予約DB、メール送信
# 描くこと
- 正常系:空き確認 → 予約登録 → 確認メールの依頼(メールは非同期)
- 異常系:満席なら409、DBエラーなら500(altで分ける)
- 同期は ->>、非同期は -)、戻りは -->> を使う
- 活性区間を付け、autonumber を使う
# 詳細度
- 基本設計用。クラス名やメソッド名は出さない
- 矢印は15本程度まで
# 最後に
- 図からは読み取れない前提(タイムアウト値など)を箇条書きで挙げてください
AIの出力は、必ず描画して確認します。Mermaid はバージョンによって使える構文(create participant など)が違うため、表示に使う環境(プラグインやmermaid-cli)で実際に描画できるかを見ます。そのうえで、ガード条件の具体性(数字が入っているか)と、同期・非同期の矢印の使い分けを人が確認しましょう。
よくある質問
Q. シーケンス図とアクティビティ図(フローチャート)はどう使い分けますか? A. 「誰と誰がやり取りするか」を見せたいならシーケンス図、「処理の手順と分岐」を見せたいならアクティビティ図です。複数のシステムやサービスの間の連携を説明するときは、シーケンス図が向いています。
Q. 戻りメッセージは必ず描く必要がありますか? A. UMLでは省略できます。ただし、何が返るか(ステータス、データ)がレビューの対象になる設計書では描くのがおすすめです。省略する場合は、エラーの戻りだけは描いておくと、異常系の確認漏れを防げます。
Q. 1枚のシーケンス図にどこまで入れてよいですか?
A. 目安は1シナリオ、ライフライン4〜6個、矢印15本前後です。これを超える場合は、共通部分を別の図に切り出し、PlantUML なら ref、Mermaid ならノートで参照先を示します。
Q. MermaidとPlantUMLのどちらを使えばよいですか? A. GitHubやMarkdownの設計書で手軽に表示したいならMermaid、ref などUMLの表現を細かく使いたいならPlantUMLが便利です。チームの設計書の置き場所(表示できる環境)で選ぶのが確実です。
まとめ
- シーケンス図は、登場人物間のメッセージのやり取りを時間順に表すUMLの図です
- 矢印は同期(待つ)・非同期(待たない)・戻りを使い分け、活性区間で処理中の期間を示します
- 複合フラグメントはalt・opt・loop・par・break・critical・refの7種類でほとんどの場面を表せます
- タイムアウトは戻り矢印ではなく呼び出し側のノートで、再試行の回数と間隔は数字で書きます
- 1枚1シナリオにし、基本設計用とレビュー用で詳細度を変えます
- コードから起こすときは入口から1シナリオ、境界をまたぐ呼び出しだけを追います
- AIに描かせたら、使う環境で描画して確認し、条件と矢印の種類を人が見直します
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「シーケンス図の書き方|記号・alt/loop等と実務3パターン」
株式会社RJCでは、シーケンス図で処理の流れを見える形にし、設計の意図を仲間と共有しながら開発を進めています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。