JavaでWebアプリ制作を学習してみよう。- Docker MySQL を H2データベースに変更してみる –

前回は CentOS7 on VirtualBox に Docker を導入し Docker 管理下で「MySQL」「Spring Boot App」「Nginx」を稼働させたWebシステムを作成し、「Spring Boot App」を Windows10上での sts4 で「リモートデバッグ」「ホッドリロード」を行えるWebアプリ開発環境を作成し実際に体験してみました。

今回は CentOS7 on VirtualBox の Dockerで稼働している MySQL を 軽量で手軽なデータベース H2 に変更してみます。

H2データベースはAndroidアプリでよく使う手軽で軽傷なローカルデータベース SqLiteに近いのかな?と考えてしまった。

これを

これに

変えてみます。

sts4(Spring Boot)は  「application.properties」ファイルにデータベースに関する設定を記述するようになっているため「MySQLからH2へデータベースの変更は案外簡単じゃねぇ」と直感的に思い、じゃ試してみるか。ってことでやってみることになりました。

「MySQL->H2」、「H2->MySQL」とデータベースの変更方法を体験しておけば、機能単位の開発では軽量で手軽なH2を使ってプログラムを作成して、その後MySQLを使った実機環境でプログラムの統合テストするような開発を行えば、機能単位のプログラムの開発者は仕様書に基づきPCにsts4さえあればプログラムの作成が行え、あるいは依頼できるようになるのでプログラム開発者の準備時間を減らせて分散開発が行いやすくなるのではないかと思うところもある。
仕様書の他にデータベーススキーマ初期化ファイルと初期レコード追加ファイルも添付しておけばプログラム開発者に親切かも。

データベーススキーマの追加や変更もsts4上で行えるし、「phpMyAdmin」のような「h2-console」というWebブラウザからデータベースのテーブルを表示したり、レコードを操作したりできるツールも提供されているので、これまた便利で手軽にデータベースアプリが作りやすい。

「application.properties」ファイルのデータベース設定を以下のように変更することであっさりとうまく切り替えられました。

変更前:MySQLの設定

# 接続先はDocker Composeのサービス名です。
#spring.datasource.url=jdbc:mysql://db:3306/demo?serverTimezone=JST
#spring.datasource.username=${MYSQL_USER}
#spring.datasource.password=${MYSQL_PASSWORD}
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

変更後:H2の設定

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:./h2db
spring.datasource.username=hoge
spring.datasource.password=pass
spring.jpa.show-sql=true
spring.datasource.sql-script-encoding=UTF-8
spring.h2.console.enabled=true
#初期化しない
spring.datasource.initialization-mode=never
#常にデータソースを初期化する
#spring.datasource.initialization-mode=always

今回は H2データベースはファイル保存型として設定し、最初にWebアプリを起動するときだけ

spring.datasource.initialization-mode=always

を有効にして初期化処理(初期スキーマ(テーブル等)作成「schema.sql」と初期レコードの追加「data.sql」のSQLを実行)を行い

2回目以降は

spring.datasource.initialization-mode=never

を有効にしてデータベースを初期化しない使い方をしました。

サイド初期化したい場合は、h2db.xxx.db ファイル(xxxは任意の文字列)を削除してから

spring.datasource.initialization-mode=always

を有効にしてWebアプリを起動すればよい。

初期スキーマ(テーブル等)作成「schema.sql」は

CREATE TABLE inquiry (
id INT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
mail CHAR(128) NOT NULL,
content TEXT NOT NULL,
PRIMARY KEY (id)
);

初期レコードの追加「data.sql」は

INSERT INTO inquiry (name, mail, content) VALUES 
('鈴木 太郎', 't.suzuki@example.com', '100人くらいで貸し切りできますか?'), 
('佐藤 花子', 'h.sato@example.com', '予算に応じてコースの相談はできますか?');

としました。

また、WebブラウザからH2データベースの操作を行うことが出来る「H2-console」を使用するには

spring.h2.console.enabled=true

を記述してください。phpMyAdminのようなもの。

 

プロジェクトに「H2 Database」を追加することを忘れないようにしてください。