PlantUMLでシーケンス図、クラス図、ER図などを作成するための環境設定

## はじめに
今回、Visual Studio Codeを使って、PlantUMLでシーケンス図、クラス図、ER図を書く方法を書きました。

なお、本記事の作成にあたって
[PlantUML公式](https://plantuml.com/ja/)
を参考にしています。

## この記事の読者対象
- Macを使用している方
- シーケンス図、クラス図、ER図などを簡単に書きたい人
- PlantUMLの環境構築がよく分からない人


今回、PlantUMLの図の書き方の説明は省略いたします。
詳しくは、[公式サイト](https://plantuml.com/ja/)を確認してください。

## 環境
```
Mac: Ventura
Visual Studio Code
Java version 20
```
※Windowsでは動作確認していないため、今回は省略してます。

## PlantUMLとは
PlantUMLは、簡単なテキスト記述でUML図や様々な図を生成することができるオープンソースのツールです。テキストベースの記述により、バージョン管理が容易になり、コードのように変更履歴を追跡することができます。

以下のテキストを素早く作成きます。
- シーケンス図 / Sequence diagram
- アクティビティ図 / Activity diagram
- コンポーネント図 / Component diagram
- クラス図 / Class diagram
- 状態遷移図 / State diagram
- ユースケース図 / Usecase diagram
- オブジェクト図 / Object diagram


オンラインで[PlantUML](https://www.plantuml.com/plantuml)も使うことができます。


## 環境構築(Mac)
PlantUMLを使うために必要なものをインストールしましょう。

### Javaのインストール
1: Oracleの公式サイトからJavaをダウンロードしてインストールします。

[Javaダウンロード](https://www.java.com/en/download/)

2: ターミナルを開き、以下のコマンドを実行して、環境変数JAVA_HOMEを設定し、PATHに追加します。

```
echo 'export JAVA_HOME=$(/usr/libexec/java_home)' >> ~/.zshrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.zshrc
source ~/.zshrc
```

完了したら、実際にインストールされているか確認しましょう。
```
echo $JAVA_HOME
echo $PATH 
java -version
```
``echo $JAVA_HOME``は、環境変数JAVA_HOMEの設定確認
``echo $PATH``は、PATHにJAVA_HOMEが追加されているかどうかを確認
``java -version``は、JavaのVersion確認

### Graphvizのインストール

**※シーケンス図とアクティビティ図（新構文）のみ使用するのであれば、これは不要です。**

Macではbrewをインストールすることで簡単にGraphVizをインストールすることができます。これにより、GraphVizを.dmgパッケージでインストールする際に発生する問題を回避することができます。
```
brew install libtool
brew link libtool
brew install graphviz
brew link --overwrite graphviz
```

``libtool``は、Homebrewを使ってlibtoolというパッケージをインストールするためのものです。  
プログラムのビルドやインストールをサポートするツールです。これは、Graphvizのインストールに必要な依存パッケージです。

``link libtool``は、libtoolパッケージをシステムにリンクするためのものです。  
これにより、libtoolがシステム全体で利用できるようになります。  

``install graphviz``は、graphvizというパッケージをインストールするためのものです。  
graphvizは、グラフィカルなネットワーク図を生成するためのツールセットです。

``link --overwrite graphviz``は、graphvizパッケージをシステムにリンクするためのものです。  
``--overwrite``オプションを使用することで、既存のリンクがある場合でも強制的に上書きされます。  
これにより、graphvizがシステム全体で利用できるようになります。

**環境変数の設定とPATHの追加**
```
echo 'export GRAPHVIZ_DOT="$(brew --prefix)/bin/dot"' >> ~/.zshrc
echo 'export PATH=$GRAPHVIZ_DOT:$PATH' >> ~/.zshrc
source ~/.zshrc
```


インストールされているか確認しましょう。
```
dot -V
```

インストールされているなら以下のような出力になります。
```
dot - graphviz version 8.0.5 (20230421.1958)
```

この例では、20230421.1958がビルド情報です。これは通常、ビルド日時を表しています。この場合、2023年4月21日に19時58分にビルドされたバージョンであることを示しています。ビルド情報は、バージョン番号だけでは識別できない細かな違いや、特定のビルドに関連する問題を特定する際に役立ちます。



### PlantUMLのインストール
1: PlantUMLの公式サイトから[PlantUMLのjarファイル](https://sourceforge.net/projects/plantuml/files/plantuml.jar/download)をダウンロードします。

2: 設定したい場所に``plantuml.jar``ファイルを配置する


このファイルは、あなたがアクセスしやすい場所に配置してください。例えば、/usr/local/binディレクトリや、$HOME/binディレクトリに配置することができます。これにより、ターミナルから簡単にPlantUMLを実行することができます。

**/usr/local/binに配置する場合**
ターミナルで以下のコマンドを実行し、``plantuml.jar``を``/usr/local/bin``にコピーしてください。
```
sudo cp plantuml.jar /usr/local/bin/
```
このコマンドにより、plantuml.jarファイルが/usr/local/bin/ディレクトリに配置されます。/usr/local/binは、macOSで一般的に使用される実行可能ファイルのデフォルトのインストール場所です。このディレクトリは、通常PATH環境変数に含まれているため、ここに配置されたファイルはターミナルから簡単に実行することができます。

3: ターミナルで、以下のコマンドを実行して、PlantUMLをインストールします。

```
java -jar /usr/local/bin/plantuml.jar
```
``/usr/local/bin/``に``plantuml.jar``を配置することで、システム全体でアクセス可能になります。どのユーザーアカウントからでもターミナルでPlantUMLを実行できるようになります。

配置されているか確認しましょう。
```
java -jar /usr/local/bin/plantuml.jar -version
```

## ファイルの作成

### クラス図

クラス図は、システム内のクラスとその関連性を表します。

1: ``classDiagram.txt``というファイルを作成し、以下の内容を記述します。

```
@startuml
class クラス1 {
  +属性1: 型
  +メソッド1(): 戻り値の型
}

class クラス2 {
  +属性2: 型
  +メソッド2(): 戻り値の型
}

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

2: 作成しているシーケンス図の確認
``option + D``
で、作成中の図を確認できます。

3: ターミナルで次のコマンドを実行して、画像ファイル（classDiagram.png）を生成します。
```
java -jar /usr/local/bin/plantuml.jar classDiagram.txt
```

```plantuml
@startuml
class クラス1 {
  +属性1: 型
  +メソッド1(): 戻り値の型
}

class クラス2 {
  +属性2: 型
  +メソッド2(): 戻り値の型
}

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

### シーケンス図
シーケンス図は、システムのオブジェクト間のメッセージのやりとりを表します。

1: ``sequenceDiagram.txt``というファイルを作成し、以下の内容を記述します。

```
@startuml
participant A
participant B

A -> B: メッセージ1
B --> A: メッセージ2
@enduml
```

2: 作成しているシーケンス図の確認
``option + D``で、作成中の図を確認できます。

3: ターミナルで次のコマンドを実行して、画像ファイルを生成します。
```
java -jar /usr/local/bin/plantuml.jar sequenceDiagram.txt
```

これで、同じディレクトリ内にファイルが作成されます。

```plantuml
@startuml
participant A
participant B

A -> B: メッセージ1
B --> A: メッセージ2
@enduml
```

### ER図

ER図（エンティティ-リレーションシップ図）は、データベースのエンティティ（テーブル）とその関連性を表します。

1: ``erDiagram.txt``というファイルを作成し、以下の内容を記述します。

```
@startuml
!define Table(name,desc) class name as "desc" << (T,#FFAAAA) >>
!define primary_key(x) <u>x</u>
!define foreign_key(x) <#u>x</#u>

Table("テーブル1","テーブル1の説明") {
  primary_key(主キー1)
  属性1
  属性2
}

Table("テーブル2","テーブル2の説明") {
  primary_key(主キー2)
  foreign_key(外部キー)
  属性3
}

テーブル1 --|> テーブル2: 関連性
@enduml
```

2: 作成しているER図の確認
``option + D``で、作成中の図を確認できます。

3: ターミナルで次のコマンドを実行して、画像ファイル（erDiagram.png）を生成します。

```
java -jar /usr/local/bin/plantuml.jar erDiagram.txt
```

以上で、それぞれの図が作成されます。生成された画像ファイルを開いて、図が正しく作成されたことを確認してください。

```plantuml
@startuml
!define Table(name,desc) class name as "desc" << (T,#FFAAAA) >>
!define primary_key(x) <u>x</u>
!define foreign_key(x) <#u>x</#u>

Table("テーブル1","テーブル1の説明") {
  primary_key(主キー1)
  属性1
  属性2
}

Table("テーブル2","テーブル2の説明") {
  primary_key(主キー2)
  foreign_key(外部キー)
  属性3
}

テーブル1 --|> テーブル2: 関連性
@enduml
```