2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

spring.sql.init.modeの詳細機能

Last updated at Posted at 2024-10-29

 SpringBootのJUnitによるテスト設定で、「spring.sql.init.mode=alwaysって設定する必要あるの?、@Transactionalがあれば不要じゃない?」と思っていたのが完全に間違いであったので、その詳細を解説する。

 結論としては、(私のプロジェクト内では)

  • spring.sql.init.mode=alwaysは不要
  • spring.sql.init.mode@Transactionalは無関係

前提条件

環境

IDE 言語 APPフレームワーク テストフレームワーク SQL制御 SQL
IntelliJ IDEA 2024.1.4 java 21.0.4 Spring Boot 3.3.3 JUnit 5 MyBatis 3.0.3 MySQL 8.0.39

インメモリDBと組み込みDB

 後のテスト用データベース設定の話をする前に、この2つの違いを把握しておく必要がある。
 また、この記事内では以降データベースが下記の各状態になっていることをそれぞれインメモリモード、組み込みモードと呼ぶこととする。

インメモリデータベース

 データをメモリ上に保持するデータベースであり、メモリから直接アクセスするため、通常のディスクベースのデータベースよりも高速にデータを読み書きできる。
 ただし、メモリ上にしかデータを保存しないため、アプリケーションが終了したりシステムが再起動されたりすると、データが失わる。

組み込みデータベース

 アプリケーション内部に組み込まれ、アプリケーションと一緒に実行されるデータベースであり、アプリケーションから直接アクセス可能である。
 通常、永続的なストレージ(ディスクやファイル)にデータを保存する機能を持っている。

spring.sql.init.modeの機能

 Spring Boot公式ドキュメント(使い方一覧-データの初期化)にはデータベースの初期化に関して以下の記載がある。

デフォルトでは、SQL データベースの初期化は、組み込みのメモリ内データベースを使用する場合にのみ実行されます。SQL データベースをその型に関係なく常に初期化するには、spring.sql.init.mode を always に設定します。同様に、初期化を無効にするには、spring.sql.init.mode を never に設定します。

 また、Spring Boot公式ドキュメント(API一覧)で以下のように記載がある。

image.png

 抽出したので分かりづらいが、spring.sql.init.modeのデフォルトはembeddedであり、組み込みデータベースに対してはSQLスクリプト(私の環境ではschema.sqldata.sql)による初期化を実施するということを意味していると思われる。

H2DBのモード設定

 H2DBではモード指定がない場合、デフォルトではインメモリモードで設定される。組み込みモードで使用する場合には、application.propertiesにてJDBC URLにファイルパスを指定する必要がある。具体的には以下の検証を参照されたい。

実例での検証

 私のあるプロジェクトでは以下のような設定でテストを実施している。

application.properties
spring.sql.init.mode=always
spring.datasource.url=jdbc:h2:~/test;MODE=MySQL
spring.datasource.username=sa
spring.datasource.password=sa
spring.datasource.driver-class-name=org.h2.Driver
spring.h2.console.enabled=true

 冒頭で記載したように、spring.sql.init.mode=alwaysがあってもなくても関係ないと勘違いしたのは下記の理由による。

 H2DBのモード設定で述べた通り、
spring.datasource.url=jdbc:h2:~/test;MODE=MySQLで、H2DBを組み込みモードに設定しているため、spring.sql.init.mode=alwaysがない場合でもspring.sql.init.mode=embeddedが設定されているためにH2DBの初期化が毎回行われていたということである。
 ちなみに、spring.datasource.url=jdbc:h2:~/test;MODE=MySQLでは、CドライブのUSERディレクトリにtest.dbというファイルが作成される(エクスプローラで確認済)。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?