新現場,Tips

H2 database Engineにおけるテストデータの準備等

■Autowiredされる側のクラスに設定するには?

@Componentを追加し、このクラスをDIコンテナに登録してくれと印をつける必要がある。

■Spring Bootではクラスパス直下にSQLファイルを配置することで自動的に読み込む。

「src/main/resoures」

DDL : schema.sql

DML : data.sql

■InMemoryとFileの違いって何

どちらもメモリ上にDBを作成し、JDBCを通してデータにアクセスする点は同じ。

ファイルの場合はアプリケーション起動時にデータベースに相当するファイルを作成する。(永続化する。)

インメモリの場合はファイルを作成せず、アプリケーション終了と同時にデータは破棄される。(永続化しない。)

【ファイル】

jdbc:h2:./testXX

jdbc:h2:file:./testXX

【インメモリ】

jdbc:h2:mem:testXX

■組み込みにおけるJDBC接続指定子

http://h2database.com/html/features.html#database_url

■毎回schema.sqlを実行した場合、すでにあるテーブルを作成しようとするが

定義済みのため例外が発生する。

それを回避するには

「CREATE TABLE」ではなく「CREATE TABLE IF NOT EXISTS」を用いる。

[例外メッセージ]

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: テーブル "CUSTOMER" はすでに存在します

■単体テストを実施するにあたっての使い分け

ファイルの場合、単体テスト実施前後で状態が変わってしまうため、

テストの再現性が保てない。

インメモリの場合、毎回1からスキーマ、データを作成するため、

再現性は保てるが、規模が大きいと時間がかかる。

インメモリかつテーブルを絞り込む方法もあるそうなのでよかったら調べること。

■互換モード

H2では各サードパーティ製のDB固有の仕様を再現することができる。

(例. Oracle : jdbc:h2:{接続子};MODE=Oracle)

⇒ 空白文字列はNullとして扱われる。

本番で使用するDBをあらかじめ設定することで

H2 -> 本番DBへ変更した際の変化により発生する問題を事前に防ぐことができる。