UML

UML Webシステムの例 UML SpringBootの例 PlantUML公式

UMLとは

UML=Unified Modeling Language
統一モデリング言語。さまざまな種類があったオブジェクト指向分析・設計を行う上での図表記述方式を統一したもの。 各種の図表の書き方が定められている。

要求図

ユースケース図
システムを使う人とシステムに分け、どのような機能が必要かをまとめる。

構造図

クラス図
クラスの属性や操作、関連、継承を図式化する。

振る舞い図

シーケンス図
オブジェクト間のメッセージのやりとりを時系列に沿って図式化する。
ステートマシン図
オブジェクトの「状態」の移り変わりを図式化する。状態遷移図。
アクティビティ図
処理や手順の流れを図式化する。

実装図

コンポーネント図
ソフトウェアコンポーネントの実装時の構造を図式化する。
配置図
ハードウェア、ソフトウェア、ネットワークなど実装時の配置を図式化する。

PlantUML

テキストで特定書式を書くことでUML図を書くことができるツール。

インストール

Graphviz

まず、PlantUMLが利用する描画ライブラリであるGraphvizをインストールする。

コマンドプロンプトから以下を入力しインストールする。

winget install graphviz

Asciidoctor editor

次にPlantUMLをインストールする。Eclipseの場合、「Asciidoctor editor」プラグインを入れる。

  1. プロジェクト内にUML用のフォルダを作成(exampleを右クリックし、[新規]-[フォルダー]で「uml」と入力)
  2. umlフォルダを右クリックし、[新規]-[ファイル]から sample.pu でファイルを作成
  3. sample.puをダブルクリックで開くと「マーケットプレースで利用可能なエディター」という画面が出る
  4. 「このファイルタイプのIDE拡張を表示してインストールする」を選択した状態でOKボタンを押す、[Eclipseマーケットプレイス]で「Asciidoctor editor」が表示されるので「インストール」を押してインストールを行う。

Asciidoctor editorの設定

Eclipseの[ウィンドウ]-[設定]で[Asciidoctor editor]の一番上「Default preview layout」を「水平方向(Horizontal)」にしておく。

使用方法

Eclipseの場合、[ファイル]-[新規]-[ファイル]から拡張子.pu でファイルを作成。右クリックし[次で開く]-[PlantUML Editor(Asciidoctor)]で開く

@startuml から @enduml の間に書いていく。詳細な記述方法は PlantUML のサイトで。

ユースケース図

外部から見たシステムの機能を表す図。要求・分析モデリングなどの上流工程で使用する。
システムを表す四角形を書き、そのシステムを表すユーザを表すアクター(人の形)を周りに書く。
システム内に楕円でユーザの利用内容(ユースケース)を書き、アクターからこれに線を伸ばす(関連)。

ユースケースはユーザから見た「システムができること」を書く。処理の仕組みには立ち入らない。

PlantUMLでの記述

@startuml
left to right direction
actor 管理者
rectangle 販売管理{
	管理者 -- (商品の一覧)
	管理者 -- (商品の追加)
	管理者 -- (商品の変更)
	管理者 -- (商品の削除)
}
@enduml

アクターが2種類の場合

@startuml
left to right direction
actor 在庫管理者
actor 売上管理者
rectangle 販売管理{
	在庫管理者 -- (商品の一覧)
	在庫管理者 -- (商品の追加)
	在庫管理者 -- (商品の変更)
	在庫管理者 -- (商品の削除)
	(商品の一覧) -- 売上管理者
	(売上の一覧) -- 売上管理者 
}
@enduml

ユースケース記述

ユースケースごとに詳細を書いた文書「ユースケース記述」を作成する。
「ユースケース記述」は本来UMLで定義されるものではないため、書くことが厳密には決まっていないが、そのユースケースはどういうことをユーザが行うかをイメージできるように書く(ユーザ向けのマニュアルのようなイメージ)。

例:
ユースケース名商品の削除
※ユースケース図のユースケースと対応します。
概要商品を削除する
アクター管理者
事前条件商品が登録されている
※このユースケースを実行できるために事前条件。ログインやデータの登録など。「無し」でもよい。
基本フロー1.システムは商品一覧と削除リンクを表示する
2.管理者は削除したい商品の削除リンクをクリックする。
3.システムは確認画面に遷移する。削除対象の商品の商品ID、商品名、単価を表示する。
4.管理者は確認画面の削除ボタンを押す。
5.システムは該当商品を削除し、商品一覧に遷移する。
※システムとユーザがどのように対話していくのかを記述します。「システムは・・」や「ユーザは・・」など主語を明確にします。
代替フロー 3a.削除対象商品が存在しない場合、システムはエラー表示する
※エラー処理など基本フローから分岐するフローがあれば書きます。エラーの条件を明確にしておきます。
事後条件商品が削除されていること
※基本フロー終了時に達成して欲しいことを書きます。データの更新や画面への表示など。
シナリオ1 ※フローの具体的な例を書きます。入力や出力は全て具体的な値で書きます。
  1. システムは画面に商品一覧を表示。
    りんご 削除
    みかん 削除
    いちご 削除
  2. 管理者はいちごの横の削除リンクをクリック
  3. システムは確認画面を表示

    商品ID:3
    商品名:いちご
    単価:200円
    [削除ボタン]
  4. 管理者は削除ボタンを押下する。
  5. システムは削除を行い、商品一覧へ戻る
シナリオ2 ※シナリオは複数書くことが出来ます。
  1. システムは画面に商品一覧を表示。
    りんご 削除
    みかん 削除
    いちご 削除
  2. 管理者はいちごの横の削除リンクをクリック
  3. いちごが既に削除済みだったため、システムはエラー画面を表示。

    エラー
    この商品は存在しません。
    [戻るボタン]
  4. 管理者は戻るボタンを押下する。
  5. システムは商品一覧を表示する

※練習用テキストファイル

※注1:シナリオには具体的に書くこと

良い例
悪い例

※注2:事前条件、事後条件はテストを意識する

システム完成後のテストはユースケース記述を元に行います。事前条件はテストをはじめようとするときに何を準備していないといけないか、事後条件はテストを終えたときに何が達成していないといけないかを定義します。

クラス図

クラスの構造、関連を表す。分析・設計工程で使用する。

この図のPlantUML
@startuml
left to right direction
package model {
	class 商品{
		-商品ID
		-商品名
		-単価
	}
	class 書籍{
		-著者
		-出版社
	}
	class 売上{
		-個数
		-日付
		+金額():金額
	}
	class 商品管理 {
		+全検索():商品リスト
		+検索(商品ID):商品
		+追加(商品)
		+変更(商品)
		+削除(商品ID)
	}
	class 売上管理 {
		+全検索():売上リスト
		+検索(商品ID):売上リスト
	}
}
package control{
	class 商品一覧{
		+表示()
	}
	class 商品別売上{
		+表示()
	}
}
商品一覧 ..> 商品管理
商品別売上 ..> 商品管理
商品別売上 ..> 売上管理

売上->商品
商品管理 "1" o-- "0..*" 商品
売上管理 "1" o-- "0..*" 売上

商品 <|-- 書籍
@enduml

クラス

長方形でクラスを表し、内部を線で区切り、クラス名、属性、操作を書く。
操作には()を付ける。
属性と操作にはpublicの場合 + を、privateの場合- を付ける。

@startuml
class 売上{
	-個数
	-日付
	+金額()
}

@enduml

操作の括弧内には引数を書く。また、後に : を付け戻り値の型を指定する

@startuml
class 商品管理 {
	+全検索() : 商品リスト
	+検索(商品ID) : 商品
	+追加(商品)
	+変更(商品)
	+削除(商品ID)
}
@enduml

詳細設計時には名前は実際にプログラムで使う名前になる。また、属性の後に : を付け型を指定する

@startuml
class Uriage{
	-kosu:int
	-hi:Date
	+kingaku():int
}

@enduml

関連

各クラスに関連があれば実線を引いて表す。線上に関連名を書く。矢印によってどのクラスがどのクラスを参照しているかを示す。

売上 -> 商品

Javaでの実装例としては、インスタンスをフィールドに持つことなどである。

// Javaでの実装例
class Uriage{
	private int kosu;
	private Date hi;
	
	private Shouhin shouhin;	//	インスタンスを持つ

集約

関連の一種で全体と部分の関係。◇と実線で示す。実装では配列やリストで表されることが多い。◆はより強い集約関係を表す「コンポジション」。全体が消えたときにそこに含まれる部分も消える関係。

PlantUML
集約: o--
コンポジション: *--
@startuml
left to right direction
class 商品{
	-商品ID
	-商品名
	-単価
}
class 商品管理 {
	+全検索():商品リスト
	+検索(商品ID):商品
	+追加(商品)
	+変更(商品)
	+削除(商品ID)
}

商品管理 o--  商品
@enduml

実線の端には数字で多重度を書くことができる。多重度に範囲がある場合には 最小値..最大値 のように書く。不特定多数の場合 * を書く。

商品管理 "1" o-- "0..*" 商品

汎化

汎化(継承)は△と実線で表す。
実現(インタフェースの実装)は△と破線で表す。

PlantUML
汎化: <|--
@startuml
class 商品{
	-商品ID
	-商品名
	-単価
}
class 書籍{
	-著者
	-出版社
}
class 期間限定商品{
	-開始日
	-終了日
}
商品 <|--書籍
商品 <|--期間限定商品
@enduml

依存

それ以外の関係は「依存」と呼ばれ、破線で表す。これは何らかの形で別のクラスに依存していることを示す。依存とはクラスに変化があれば、別のクラスに変化が及ぶこと。実装例では他のクラスを引数や戻り値、ローカル変数等で使用することなどが含まれる。

@startuml
class 商品別売上{
	+表示()
}
class 売上管理{
	+売上検索(商品ID):売上リスト
}
商品別売上 ..> 売上管理
@enduml

パッケージ

パッケージを表す場合、package 名前 { } で囲む。

@startuml
package モデル{
	class 商品{
		- 商品ID
		- 商品名
		- 単価
	}
	class 売上{
		- 個数
		- 日付
	}
}

売上 -> 商品
@enduml


シーケンス図

オブジェクト間のメッセージのやりとりを時系列に沿って図式化する。分析・設計工程で使用する。

オブジェクト:四角で囲み、下に破線で生存線を書く。ここにユーザなどのアクターを書くこともできる。

メッセージ:オブジェクト間でやりとりされるメッセージ。具体的にはメソッドの呼び出しやオブジェクトの生成、アクターの操作を表す。生存線を矢印の線で結ぶ。呼ばれる方に矢印を書き、どのようなメッセージかを必ず書く。また、メッセージからの戻り値がある場合は破線で返す。

@startuml
title 商品一覧
autonumber "#."

actor ユーザ
ユーザ -> 商品一覧画面:アクセス
商品一覧画面 -> 商品管理:全検索
商品管理 -> 商品:生成
商品管理 --> 商品一覧画面:商品リスト
商品一覧画面 --> ユーザ:表示
@enduml

詳細設計レベルではプログラミングを前提としたオブジェクトに変化する。

@startuml
title 商品一覧 /slist GET
autonumber "#."

actor ユーザ

ユーザ -> ShouhinListServlet:GETリクエスト
ShouhinListServlet -> ShouhinDAO:生成()
ShouhinListServlet -> ShouhinDAO:findAll()
ShouhinDAO -> Shouhin:リスト生成
ShouhinDAO --> ShouhinListServlet:shouhinリスト
ShouhinListServlet -> Request:shouhinリストセット
ShouhinListServlet -> slist.jsp:フォワード
slist.jsp --> ユーザ:表示
@enduml

活性区間

説明の表示

生存線上に実行していることを表す四角形(活性区間)を書ける。生成時にはその場所からオブジェクトを書くことも出来る。

@startuml
title 商品一覧 /slist GET
autonumber "#."
actor ユーザ

ユーザ -> ShouhinListServlet++:GETリクエスト
ShouhinListServlet -> ShouhinDAO**:生成()
ShouhinListServlet -> ShouhinDAO++:findAll()
ShouhinDAO -> Shouhin**:リスト生成
ShouhinDAO --> ShouhinListServlet:shouhinリスト
ShouhinDAO--
ShouhinListServlet -> Request++:shouhinリストセット
Request--
ShouhinListServlet -> slist.jsp:フォワード
ShouhinListServlet--
slist.jsp --> ユーザ:表示
@enduml

++ 活性区間の開始
-- 活性区間の終了
** 生成

繰り返し・条件分岐

説明の表示

グループ化:繰り返し(loop)や条件分岐(alt/else、opt)がある場合、四角で囲んで何によるグループ化かを書く。

条件分岐(alt/else)の例

@startuml
title 削除確認画面(分析レベル)
actor ユーザ
ユーザ -> 商品一覧:削除クリック
商品一覧 -> 削除画面:遷移
削除画面 -> 商品DB:検索(sid)
商品DB -> 商品:生成
商品DB --> 削除画面:商品
alt 商品が存在
	削除画面 --> ユーザ:確認表示
else
	削除画面 --> ユーザ:エラー表示
end
@enduml

※繰り返しのとき

loop
	// 繰り返しのときの処理
end

アイコン・並び順の変更

各オブジェクトのアイコンを変更することが出来る

アクターactor
画面boundary
コントローラcontrol
データベースdatabase
エンティティ(DTO)entity
四角形participant

アイコンを指定した並び順で左から表示される

@startuml
title 商品一覧
autonumber "#."

actor ユーザ
boundary 商品一覧画面
database 商品管理
entity 商品

ユーザ -> 商品一覧画面:アクセス
商品一覧画面 -> 商品管理:全検索
商品管理 -> 商品:生成
商品管理 --> 商品一覧画面:商品リスト
商品一覧画面 --> ユーザ:表示
@enduml

ステートマシン図

オブジェクトの「状態」の移り変わりを図式化する。状態遷移図。分析・設計工程で使用する。

@startuml
title 画面遷移図

[*]->商品一覧
商品一覧-->追加処理 :追加ボタン
商品一覧-->削除確認 :削除リンク
商品一覧-->変更確認 :変更リンク
削除確認-->削除処理 :削除ボタン
変更確認-->変更処理 :変更ボタン
@enduml

事前に「state 状態名 色」を書くことで背景色を変えることが出来る。以下は実際には表示されない画面(処理後にリダイレクトする画面)を灰色にしている。

@startuml
title 画面遷移図

state 追加処理 #ddd
state 削除処理 #ddd
state 変更処理 #ddd


[*]->商品一覧
商品一覧-->追加処理 :追加ボタン
商品一覧-->削除確認 :削除リンク
商品一覧-->変更確認 :変更リンク
削除確認-->削除処理 :削除ボタン
変更確認-->変更処理 :変更ボタン
@enduml

詳細レベル

@startuml
title ページ遷移図

slist : 商品一覧
insert:POST 追加処理
del:GET 削除確認\nPOST 削除処理
update:GET 変更入力\nPOST 変更処理
suriage:GET 商品別売上

[*]->slist
slist-->insert: 追加ボタン
slist-->del: 削除リンク\nsid
del-->del: POST\n削除ボタン
slist-->update: 変更リンク\nsid
update-->update: POST\n変更ボタン
slist-->suriage: 売上リンク\nsid
@enduml

※改行するには\nを書く

アクティビティ図

処理や手順の流れを図式化する。主に上流工程で要求・分析工程で業務の処理手順などを表す。下流工程ではプログラムの手順などを表す。

@startuml
start
:変更リンククリック<
:変更画面表示;
:商品名、単価入力<
:変更ボタン押下<
if(入力チェック)then(エラー無し)
	:商品リストにリダイレクト;
else(エラー有り)
	:エラー画面表示;
endif
stop
@enduml

コンポーネント図

ソフトウェアコンポーネントの実装時の構造を図式化する。実装工程で使用する。コンポーネントの依存関係を表す。

@startuml
rectangle model{
	[ShouhinDAO]..>[Shouhin]
	[UriageDAO]..>[Uriage]
}
@enduml

配置図

ハードウェア、ソフトウェア、ネットワークなど実装時の配置を図式化する。実装工程で使用する。

@startuml
rectangle クライアント{
	[Webブラウザ] as browser
}
rectangle Webサーバ{
	[Tomcat]
	[サーブレット] as servlet
	[JSP]
}
rectangle データベース{
	[MySQL]
}

browser <-> http:use
http <-> Tomcat
Tomcat -> servlet
servlet --> JSP
servlet <-> MySQL
JSP -> Tomcat
@endum

ノート

コメント(注釈)を表す。

@startuml
title 追加確認画面 /insert GET
actor ユーザ
ユーザ -> "/slist":追加フォーム入力
note right:	商品名、単価
ユーザ -> "/slist":追加ボタンクリック
"/slist" -> InsertServlet:POSTリクエスト
InsertServlet -> Shouhin:生成
note left:	商品IDは0
InsertServlet -> ShouhinDAO:insert(shouhin)
InsertServlet -> "/slist" : リダイレクト
"/slist" --> ユーザ:表示
@enduml
@startuml
[*]->商品一覧
商品一覧-->追加確認 :追加ボタン
追加確認-->追加 :追加ボタン
note bottom of 追加 :リダイレクトで\n商品一覧へ
@enduml

PlantUML 共通記法

基本設定

# フォント指定
skinparam DefaultFontName メイリオ

title タイトル
caption キャプション

# 拡大率
scale 1.5

位置

@startuml
クラス1 -> クラス2
クラス2 -up-> クラス3
クラス2 -down-> クラス4
クラス2 -right-> クラス5
クラス4 -left-> クラス6
@enduml

red,blue,greenなどHTML/CSSでの色の名前が使用可能

@startuml
クラス1 -> クラス2
クラス2 -[#blue]> クラス3
クラス3 -[#ff00ff]-> クラス2
@enduml

コメント

シングルクォーテーション以降はコメント

@startuml
' シーケンス図

クラス1 -> クラス2
@enduml

ER図

ER図はUMLの一部ではないが、PlantUMLで記述できる。
基本的にクラス図と同じだが class を entityに変え、以下の端子を使用する。

0か1|o--
1のみ||--
0以上}o--
1以上}|--

また、主キーは -- の上に書く。

@startuml
entity 商品{
	商品ID
	---
	商品名
	単価
	カテゴリID
}
entity 売上{
	売上ID
	---
	商品ID
	個数
	日付
}
entity カテゴリ{
	カテゴリID
	--
	カテゴリ名
}
商品 ||--o{ 売上
商品 }o-||カテゴリ
@enduml