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

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

動作環境と今回の目的

最終更新日:2023/1/25

前回は、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入門書をアマゾンで探す!本でSpring Bootプログラミング開発を体系的に勉強する [広告]

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で使用するDBをMariaDBに設定しました。MySQLの時と同じで、pom.xmlとapplication.propertiesの2つのファイルを少し編集するだけで、Spring BootアプリからMariaDBから接続する事ができました。

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

Kindle Unlimitedなら対象の本が定額で読み放題 [広告]
対象本には、プログラミングなどのIT関連本、マンガ、雑誌、ビジネス書などがたくさんあります!