(第13回) Spring Bootで使うDBをMariaDBに変更【Spring Boot2で日記ウェブアプリ】

Spring Boot2で日記投稿ウェブアプリ入門の第13回です。今回はSpring BootでMariaDBデータベースを使用する設定方法について説明しています。

※ 本ページはプロモーションが含まれています。

動作環境と今回の目的

最終更新日:2023/5/23

前回は、Spring Boot日記ウェブアプリで使用するDBをH2からMySQLヘ変更して、Spring BootアプリのMySQL接続設定について説明しました。
(第12回) DBをMySQLに変更する【Spring Boot2で日記ウェブアプリ】

今回は、Spring Bootアプリで使用するDBをMariaDBにしてみます。

◾️動作環境やバージョンは以下の通りです。
(Spring BootアプリのホストとMariaDBのホストは別々の環境です。)

・Spring Bootアプリの環境
OS:macOS Big Sur(バージョン11.7.2)
開発環境:Eclipse(Pleiades All in One、4.16(2020-06)、Java Full Edition版)
Spring Bootバージョン:2.7.6
Java:11
Bootstrap5.2.2

・データベースの環境
OS:仮想マシン(Vagrant)のLinux CentOS7.9
DBバージョン:MariaDB10.6

$ mariadb -V
mariadb  Ver 15.1 Distrib 10.6.11-MariaDB, for Linux (x86_64) using readline 5.1

本記事では、MariaDBのインストールについては説明していません。MariaDB環境がある事を前提に説明をしていきます。MariaDBのインストールについては別ページで説明していますので(OSはLinux)、良ければ参考にしてください。
MariaDB10.6(10.5)のインストール(Amazon Linux2(ec2),CentOS7)、WordPressの環境構築

Spring Bootで、MySQLの接続設定のままでMariaDBが使える事について

まず、前回の記事でも書きましたが、MariaDBはMySQLと互換性があるようで、Spring BootからMySQL Driver(ドライバー)ライブラリを使用してMySQLへの接続設定のままで、Spring BootアプリからMariaDBを使う事ができました(私の動作環境だけで、動作環境によってはダメかも)。
Spring BootからMariaDBを使う

ただ、Spring BootにはMariaDB Driverライブラリもあるので、せっかくなのでちゃんとMariaDB Driverライブラリを使ってSpring BootとMariaDBの接続設定について説明していきます。

Spring Bootで使用するMariaDBのDB、テーブル、ユーザを作成する(事前準備)

MySQLの時と同様に、Spring Bootアプリで使用するMariaDBのDB、テーブル、ユーザを先に作成しておきます。(MySQLの時と同じSQLが使えます。)

MariaDBプロンプト上でdiarydbという名前のデータベースを作成して、diarydbデータベースにdiaryテーブルを作成します(rootユーザで実行する)。

> create database diarydb;
Query OK, 1 row affected (0.000 sec)

> use diarydb;
Database changed

> create table diary (id integer auto_increment, bodytext varchar(255), create_datetime timestamp not null, primary key (id));

そして、diarydbデータベースを操作するためのMariaDBユーザを新規作成します。(ユーザ名はdiarydbuser、パスワードはdiarydbpassにする。)

> CREATE USER 'diarydbuser'@'%' IDENTIFIED BY 'diarydbpass';
> GRANT ALL PRIVILEGES ON `diarydb`.* TO "diarydbuser"@"%";

今回の環境は、Spring Bootアプリの環境とMariaDBの環境が別ホスト(PC)なので、作成するユーザは「'diarydbuser'@'%'」にしています。ホスト名を'%'にする事で、全てのホストのdiarydbuserユーザからMariaDBに接続できるようになります。

また、「'diarydbuser'@'%'」ユーザに付与した権限は、diarydbデータベースに対する全ての操作です(このSQL。GRANT ALL PRIVILEGES ON `diarydb`.* TO "diarydbuser"@"%")。

MariaDBのユーザ一覧は、mysql.user(MySQLデータベースのuserテーブル)で確認できます。

> select user, host from mysql.user;
+-------------+-----------+
| User        | Host      |
+-------------+-----------+
| diarydbuser | %         |
| mariadb.sys | localhost |
| mysql       | localhost |
| root        | localhost |
+-------------+-----------+

もしも、全てのホストからMariaDBへ接続できるのはセキュリティ的に問題がある場合、Spring Bootアプリのホスト(PC)からの接続のみ許可するのが良いと思います。(例えば、Spring BootアプリのホストのIPアドレスが”192.168.33.1”なら「'diarydbuser'@'192.168.33.1'」というユーザを作成する。)

> CREATE USER 'diarydbuser'@'192.168.33.1' IDENTIFIED BY 'diarydbpass';
> GRANT ALL PRIVILEGES ON `diarydb`.* TO "diarydbuser"@"192.168.33.1";
ただこれだとMariaDB環境のシェル上でmysql(mariadb)コマンドでMariaDBにログインできないという面倒な事になるので、同時に「'diarydbuser'@'localhost'」というユーザも作成した方が良いです。
> CREATE USER 'diarydbuser'@'localhost' IDENTIFIED BY 'diarydbpass';
> GRANT ALL PRIVILEGES ON `diarydb`.* TO "diarydbuser"@"localhost";

MariaDBのユーザ一覧です。(diarydbuserユーザが2つ追加されているのがわかる。)

> select user, host from mysql.user;
+-------------+--------------+
| User        | Host         |
+-------------+--------------+
| diarydbuser | 192.168.33.1 |
| diarydbuser | localhost    |
| mariadb.sys | localhost    |
| mysql       | localhost    |
| root        | localhost    |
+-------------+--------------+

ちなみに同じホスト(PC)にSpring BootアプリとMariaDBがあるなら、作成するユーザは「'diarydbuser'@'localhost'」だけでいいと思います。

今回作成したユーザ「"diarydbuser"@"%"」に付与した権限はdiarydbデータベースに対する全ての操作ですが、もしもdiaryデータベースに対する操作がSELECT, INSERT, UPDATE, DELETEの4つのSQLだけで十分なら、付与する権限もそうした方がセキュリティ的には良いと思います。

> GRANT SELECT, INSERT, UPDATE, DELETE ON `diarydb`.* TO "diarydbuser"@"%";

最後に、作成したMariaDBユーザ(diarydbuser)でmariadb(mysql)コマンドでログインできるかを確認しておきます。

$ mysql -udiarydbuser -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
〜
そして、ログインしたMariaDBユーザが自分に付与されている権限を知りたい場合、MariaDBプロンプト上でSHOW GRANTSコマンドで確認できます。
> SHOW GRANTS;
+------------------------------------------------------------------------------------------------------------+
| Grants for diarydbuser@%                                                                                   |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `diarydbuser`@`%` IDENTIFIED BY PASSWORD '*9AA6032E6A53EC6F7A81E0F102367A4FC93FEABD' |
| GRANT ALL PRIVILEGES ON `diarydb`.* TO `diarydbuser`@`%`                                                   |
+------------------------------------------------------------------------------------------------------------+

これでMariaDB側の準備は完了です。

Spring Bootのpom.xml。MariaDB Driverライブラリを追加する

次に、Spring Bootプロジェクトのpom.xmlファイルで、MariaDB Driverライブラリを利用できるようにdependencyタグを追加します。

<dependency>
	<groupId>org.mariadb.jdbc</groupId>
	<artifactId>mariadb-java-client</artifactId>
	<scope>runtime</scope>
</dependency>
これは直接編集してもいいし、Eclipse上でSpring Bootプロジェクトを右クリック->Spring->スターターの編集を選択してSpring Bootスターター画面を開いて、そこからMariaDB Driverを追加してもいいです。

これでpom.xmlの準備は完了です。もしもMySQL DriverやH2 Databaseのライブラリの設定が残っているなら、削除したおいた方が良いでしょう。

Spring Bootのapplication.properties。MariaDB接続設定

次に、Spring Bootアプリのプロパティファイルのapplication.propertiesについてです。

application.propertiesを次にように編集します。

#DB接続(MariaDB)
spring.datasource.url=jdbc:mariadb://192.168.33.10:3306/diarydb
spring.datasource.username=diarydbuser
spring.datasource.password=diarydbpass
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.jpa.hibernate.ddl-auto=none

#HibernateのSQLログの出力。SQLロギング。
spring.jpa.show-sql=true

#DBの初期データを設定したい場合はコメントアウトを外す
#spring.sql.init.mode=always
#spring.sql.init.data-locations=classpath:data.sql

MariaDBの接続設定の他に、SQLロギング設定のspring.jpa.show-sqlプロパティも設定しています。
あと、Spring Bootアプリ起動時にDBの初期データを作成したいなら、"spring.sql.init.*"の2つのプロパティを有効にして、src/main/resourcesディレクトリにdata.sqlファイルを作成して、初期データ生成のINSERT SQLを書いておけばできます。

設定は以上です。Spring Bootアプリを起動して動作確認してみましょう。

Spring Bootアプリ起動時に「Access denied for user ~」というエラーが出た場合

Spring Bootアプリを起動した時に、Eclipseのコンソール上に「Access denied for user 'diarydbuser'@'192.168.33.1'」みたいなエラーログが出力された時についてです。

2023-01-25 06:07:23.147  WARN 50826 --- [  restartedMain] o.m.jdbc.message.server.ErrorPacket      : Error: 1698-28000: Access denied for user 'diarydbuser'@'192.168.33.1'
2023-01-25 06:07:24.161 ERROR 50826 --- [  restartedMain] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.

java.sql.SQLInvalidAuthorizationSpecException: (conn=83) Access denied for user 'diarydbuser'@'192.168.33.1'
〜

もしもこのエラーログが出力された場合、Spring BootのホストからMariaDBサーバへのリモート接続が許可されていない可能性が考えられます。

MariaDBにリモート接続できない理由は色々と考えらますが、MariaDBサーバがlocalhostのユーザからしか接続を許可していない場合があります。なので、Spring BootアプリからMariaDBに接続しているMariaDBユーザを再度確認しましょう。

使っているMariaDBユーザがMariaDBへのリモート接続が許可されていない場合、MariaDBへのリモート接続可能なユーザを作成する必要があります。MariaDBユーザの作成方法については上記の「Spring Bootで使用するMariaDBのDB、テーブル、ユーザを作成する」を参考にしてください。

Spring Boot + MariaDBの実行環境を構築する

macやLinuxサーバ上でMariaDBと連携したSpring Bootアプリの実行環境を構築したい場合、Java(JRE)とMariaDBのインストールが必要です。

別ページでOpenJDK(JRE)とMariaDBをインストールしてSpring Bootの実行環境を作る手順について説明しているので参考にしてください(OS環境はmac、AWSのec2、CentOS7)。
Spring Boot + MySQL(MariaDB)の実行環境を作る

OpenJDKとMariaDBはどちらもオープンソースでライセンスに従えば無償(フリー)で使う事ができます。

最後に

以上今回は、Spring Bootで使用するDBをMariaDBに設定しました。MySQLの時と同じで、pom.xmlとapplication.propertiesの2つのファイルを少し編集するだけで、Spring BootアプリからMariaDBから接続する事ができました。

仕事でSpring Bootを使うからもっとしっかり勉強しておきたい、Spring Bootのログイン認証周りやセキュリティ面なども抑えておきたい、JavaプログラマになりたいからそのためにJavaで人気のフレームワークのSpring Bootの知識とスキルを身につけたい方は、体系的に学習できる本を読んで学習するのが良いと思います。

(広告)Spring BootのKindleや本をアマゾンで探す!本でSpring Bootプログラミング開発を体系的に勉強する!

EclipseでSpring BootのWebアプリを開発する場合、Eclipse上でWebアプリを起動して動作確認をすると思います。ただWebアプリを使える段階になってくると、毎回Eclipseを起動してWebアプリを起動するのは手間なので、コマンドラインから簡単にSpring BootのWebアプリを起動して使いたくなります。

別ページでjavaコマンドでSpring BootのWebアプリを起動する方法について説明しているので、よければ参考にしてください。
Spring Bootをjavaコマンドで起動する