SchemaSpyを使ってデータベースの中身をまとめたかった

こんにちは！

ふるさとチョイス事業部のプロダクト開発チームの @kazuyaseo です。
去年に引き続きで恐縮ですが、Trustbank Advent Calendar 2023 の１日目の記事を書かせていただきます。
今年のスタートは少し力を抜いた記事にしようと思いますので、よろしくお願いします。

## 担当サービスの紹介

最初に自分が担当している（その中でもお気に入り）のサービスを紹介させて下さい :muscle:

担当しているサービスは「[ふるさとチョイス](https://www.furusato-tax.jp/)」というサービスになります。

ふるさとチョイスの説明は他の方も行っていただいているので、今回は自分のお気に入りでもある[ふるさとチョイスGCF](https://www.furusato-tax.jp/gcf)を簡単に紹介させて頂きたいと思います。

![スクリーンショット 2023-11-30 8.34.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69338/6ca45039-5a3c-ad25-0199-f779ddd2d636.png)

### ふるさとチョイスGCF(ガバメントクラウドファンディング)

GCFはふるさと納税にとって一番重要である寄付の<font color="Orange">「使い道」</font>をより具体的にしてプロジェクト化したものに対し、
クラウドファンディング形式で寄付を募る事ができるサービスです。

自治体の思いを形にするために寄付ができる、とても好きなサービスです。
立ち上がっているプロジェクトも思いの強いものが多く、見ていると色々なプロジェクトを応援したくなっちゃいます！

ちなみに、今年の５月に[プロジェクトに対して「拍手」や「コメント」が送れる機能](https://www.furusato-tax.jp/feature/a/communication_gcf)が付きましたので告知とさせて頂きます！

## 記事の概要

そんなふるさとチョイスの運用を担当していますが、先程の[GCF](https://www.furusato-tax.jp/gcf)の他にも[災害支援](https://www.furusato-tax.jp/saigai)や[きふたび](https://www.furusato-tax.jp/kifutabi/)など複数ありまして、「ふるさとチョイス」と一言で言っても多くのサービスがあります。

それらのサービスで使っているDBのテーブルを合わせると全部で４７０テーブルほどテーブルがあり、なかなか量が多いです。

それだけテーブルがあると管理するのも大変ですし、どういったテーブルがあるのか開発メンバー以外にも把握したい人が出てきます。

弊社はテーブル定義書を作成していますが、テーブル追加やカラム変更の頻度も高いです。
これらを簡略化するために、SchemaSpyを使って<font color="green">「ちょっとテーブル多めのサービスでもHTML出力できるのか？」</font>を少し検証してみたので書かせて頂きます。

## SchemaSpyとは

https://schemaspy.org/ 

SchemaSpyはデータベース内のテーブル構成をHTML形式で出力してくれるツールです。
Javaで出来ており、jarファイル(MySQLの場合はMySQLドライバーも必要)をダウンロードして実行する事が出来ます。

https://hub.docker.com/r/schemaspy/schemaspy/

Dockerのイメージもあるため、CDにも組み込みやすいです。
次回はGithub Actionsに組み込んだ記事も書きたいですね。



## 実行方法

今回はjarファイルをダウンロードして使った時の流れを記載していきます。
チョイスのデータベースはMySQLとなっているため、ドライバーもMySQLのものを使いました。

### jarファイルのダウンロード

本家のサイトよりSchemaspyのjarファイル、
[MySQL](https://dev.mysql.com/downloads/connector/j/)より、 mysqlのドライバーファイルをダウンロードしてきます。

###  設定ファイルの作成

その次に設定ファイルを作成し、以下の項目を埋めます

```schemaspy.properties
schemaspy.dp=./mysql-connector-j-8.0.31.jar
schemaspy.o=./output

schemaspy.t=mysql
schemaspy.host=｛接続ホスト｝
schemaspy.port=｛接続ポート｝
schemaspy.db=｛DB名｝
schemaspy.u={DB接続ユーザー名}
schemaspy.p={DB接続パスワード}
```

### コマンドを実行

設定ファイルを設置したら、以下のコマンドを実行してみましょう。

```
java -jar schemaspy-6.1.0.jar -configFile schemaspy.properties -vizjs
```




## 結果

SchemaSpyの良いところは、ER図をHTMLで出してくれる所ですよね。
`output` ディレクトリの中に `inex.html`ファイルが作成されているのでその中を見てみると。。。

### TABLESページ

![スクリーンショット 2023-11-30 16.05.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69338/8283cf00-0056-a1fe-0751-b0675a8042be.png)

お、Tablesを参照する事ができました！！！
テーブル数も正しく出ているし、隣のページのER図なども見れたので満足度高いです。（ER図はキャプチャ無しですいません）

### ANOMALIESページ

あと、地味に楽しみにしていた ANOMALIES も作成されていたのが嬉しいです。

![スクリーンショット 2023-11-30 16.08.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69338/a0f6303b-8e01-e7cd-4f18-e12d102d6058.png)

ANOMALIESは不整合のテーブルを出してくれます。今回の結果でも

 * Tables without indexes (インデックスのないテーブル)
 * Tables with incrementing column names, potentially indicating denormalization （カラム多くない）

などでテーブル名が出ていたので、後で眺めてみたいと思います。


## 結構テンションが上がりました

動くことがわかると、今後の使い方が見えてちょっとテンションが上りますね。
あとは以下の流れをCDに組み込めば、自動的に履歴付きで最新のテーブル構成図がHTMLで見れるので不要なファイルの共有とかもなくなります。

1. schemaspy のコマンドをrunさせる
1. 出力されたHTMLをチョイスのリポジトリ内にコミットする
1. schemaspy の出力htmlファイルのみ内部から参照可能にする


## 最後に

データベースの中身を把握しやすい状態にしておくことは、より長くサービスの開発・運用していくにあたりとても重要だと思います。
とはいえ、開発している間はどうしてもDB仕様書とかのメンテっておろそかになりがちですよね。
自動化も進めてレッツ見える化頑張ろうと思います！

明日は @noritakaIzumi さんが「Web エンジニアが Android アプリをささっと作れた話」について話してくれます。
乞うご期待下さい！