(第2回) DB(H2)の接続設定とSQLログ出力の設定【Spring Boot2で日記投稿ウェブアプリ】

Spring Boot2.3,2.4で日記投稿ウェブアプリ入門の第2回です。DBの接続設定とSQLログ出力の設定をします。DBはH2を使用し、SQLログ出力はLog4jdbc-log4j2を使用します。Spring Bootの初心者・入門者の方は、参考にしてみてください。

動作環境と今回の目的

最終更新日:2021/5/19

前回はSpring Bootで日記投稿ウェブアプリを開発するスタートとして、Eclipseでプロジェクト作成までやりました。
(第1回) Spring Boot2で日記ウェブアプリの開発入門スタート

今回は、ウェブアプリの開発に入る前に、SQLロギングの設定とDBの接続設定をやっていきます。DBはH2を使用します。また、SQLログ出力にはLog4jdbc-log4j2を使用します。

◾️動作環境やバージョンは以下の通りです。
OS:macOS Catalina(バージョン10.15.5)
開発環境:Eclipse(Pleiades All in One、4.16(2020-06)、Java Full Edition版)
Spring Bootバージョン:2.3.3、2.4.0
Java:11
データベース:H2

今回作成するファイル

今回作成するファイルを先に書いておきます。
DB接続設定とSQLロギング設定【Spring Boot】

今回新規に作成するファイルは「log4jdbc.log4j2.properties」の1つで、編集するファイルは「pom.xml」「application.properties」の2つです。

Log4jdbc-log4j2でSQLログの出力

DBを使用するウェブアプリを開発する場合、プログラマにとってアプリ内で実行されるSQLのログは重要な情報です。SQLログを見れれば開発効率が良くなりますし、開発速度もアップします。と言うより、SQLログがないとデバッグすらまともにできません。

と言う事でまずは、SQLログの出力設定をやっていきます。ゴールはEclipseのコンソールビューにSQLログが出力される事です。

今回のSpring BootアプリのSQLロギングにはLog4jdbc-log4j2を使用します。Log4jdbc-log4j2を使用する事で、JDBCドライバ経由のSQLログを出力可能になります。

Log4jdbc-log4j2のSQLロギングの設定に関しては別ページでも説明していますので、そちらも参考にしてみてください。
(H2データベース入門 第5回) log4jdbc-log4j2でSQLログの出力設定【 Spring Boot2】

pom.xmlでLog4jdbc-log4j2ライブラリを読み込む

Log4jdbc-log4j2を使用するために、pom.xmlファイルの<dependencies>タグ直下に<dependency>タグを追加します。

<dependency>
  <groupId>org.bgee.log4jdbc-log4j2</groupId>
  <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
  <version>1.16</version>
</dependency>

log4jdbc.log4j2.propertiesファイルの新規作成

次に、src/main/resourcesディレクトリ下にlog4jdbc.log4j2.propertiesファイルを新規作成して、1行コードを書きます。

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

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

application.propertiesでDB接続設定とSQLログ出力レベルの設定

そして次はsrc/main/resourcesディレクトリ下のapplication.propertiesファイルを編集します。

#DB接続
spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:h2:mem:diarydb

#SQLロギング出力の設定
logging.level.jdbc.sqlonly=info
logging.level.jdbc.resultsettable=info
logging.level.jdbc.connection=off
logging.level.jdbc.sqltiming=off
logging.level.jdbc.audit=off
logging.level.jdbc.resultset=off

最初の2行はDB接続の設定です。

"spring.datasource.driverClassName"は、DB接続のためのドライバクラスを指定しています。
H2のドライバクラスは他に"org.h2.Driver"がありますが、Log4jdbc-log4j2を使用する場合は"net.sf.log4jdbc.sql.jdbcapi.DriverSpy"を指定します。

"spring.datasource.url"は、DBの接続URLです。
"jdbc:log4jdbc:h2:mem:diarydb"のうち、"h2"はデータベースがH2であることを意味し、"mem"はH2をメモリベースで使うことを意味しています。"diarydb"は適当なデータベース名です。

◾️H2のデータの保存先
H2データベースはデータの保存先として、メモリとファイルがあります。メモリはアプリを起動するたびにデータは初期化されます。一方、データを保存して永続化したい場合はファイルベースで使用します。
今回は起動時にデータが初期化しても特に問題ないので、メモリベースでやっていきます。

H2をファイルベースで利用する時の方法や設定については別ページで説明していますので、そちらを参考にしてください。
H2のデータ保存先をファイルに設定、データの永続化【Spring Boot2】

◾️DBのユーザ名とパスワード
今回、DBに接続するユーザ名とパスワードは無しにします。もし指定したい場合、下のようにユーザ名は"spring.datasource.username"、パスワードは"spring.datasource.password"で指定します。

spring.datasource.username=hogeuser
spring.datasource.password=pass

そして、application.propertiesファイルの後半の"logging.level.jdbc.****"の6行は、SQLログ出力の設定です。

これを書かなくてもSQLログは出力されますが、必要のないDB接続などのログも一緒に出力されて、コンソールビューがDB関連のログで汚染されてしまうため、SQLログ(logging.level.jdbc.sqlonly)とSQLの取得結果(logging.level.jdbc.resultsettable)のみを"info"にして出力するようにしています。

それぞれの項目の意味については以下に示しておきます。

logging.level.jdbc.sqlonly 実行するSQLログを出力。info,debug,traceで出力してくれる。
logging.level.jdbc.resultsettable select SQLのレコード取得結果をテーブル形式で出力。
logging.level.jdbc.connection JDBCコネクション(オープン・クローズ)ログを出力。
logging.level.jdbc.sqltiming 各SQLの実行時間を出力。処理に時間がかかる場合、どのSQLで時間がかかっているかがわかる。info,debug,traceで出力してくれる。
logging.level.jdbc.audit ResultSet(SQL取得結果)以外の全てのJDBC呼び出しログを出力。このログを出力すると膨大になるので、通常はoffにしてJDBC周りのトラブルシューティング時はdebug,infoにすべき。
logging.level.jdbc.resultset ResultSet(SQL取得結果)ログを出力。SQL取得結果レコードを1フィールドずつ出力するので、これもログが膨大になる。

もしSQLログだけで十分でSQLの取得結果はいらないなら、"logging.level.jdbc.resultsettable=off"でいいと思います。

最後に、次回

以上今回は、DB(H2)の接続設定とSQLログ出力の設定をしました。これでアプリを起動すればH2データベースに接続して、SQLログが出力されるようになっているはずですが、まだDBのテーブルすら作っていないので出力されるSQLログはありません。

ですので次回は、日記ウェブアプリで使用するテーブル設計、エンティティクラスの作成、そして初期データの作成をやっていきたいと思います。それができたら、SQLログの確認もしていきます。

(第3回) DBのテーブル設計、エンティティクラスと初期データの作成【Spring Boot2で日記投稿ウェブアプリ】
Spring Bootの日記投稿ウェブアプリ開発入門トップ