H2データベースを開発環境で使うための設定

H2データベースとは

H2データベースはJavaで書かれた軽量なデータベースで、インメモリDB(アプリ終了でデータ消える)/ファイルDB(永続化)を選択可能で動作します。簡単にセットアップできるため、開発・テスト向けに多くのプロジェクトで利用されています。

今回はそんなH2データベースの設定の仕方をまとめます。

メモリ上にDBを作成するとは

H2の jdbc:h2:mem:~ は、DBをディスクではなくメモリ(RAM)上に作ります。

メリット

  • 非常に高速
  • セットアップが簡単
  • テストや検証で「毎回まっさらなDB」を作りやすい

デメリット

  • アプリ停止・再起動でデータが消える(メモリなので保持されない)

利用シーン

  • 開発中の軽い動作確認
  • 単体テスト / 結合テストのDBとしての利用

H2データベースの依存関係を追加

Mavenの場合の依存関係の追加

まず、Spring BootプロジェクトにH2データベースを追加します。Eclipseでプロジェクトを開き、pom.xmlファイルを開きます。以下の依存関係を追加します。

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

この依存関係を追加することで、プロジェクトにH2データベースが組み込まれます。

Gradleの場合の依存関係の追加

Gradleの場合、H2データベースの依存関係を追加するには、build.gradleファイルに以下の設定を追加します。

dependencies {
    implementation 'com.h2database:h2'
}
  • implementation 'com.h2database:h2': これがH2データベースの依存関係を追加するための設定です。
  • implementation: Gradleに対してこの依存関係が実行時に必要であることを伝えます。
  • 'com.h2database:h2': H2データベースのグループIDとアーティファクトIDを示しています。

build.gradleファイルにこの依存関係を追加した後、Gradleをリフレッシュすることで、H2データベースがプロジェクトに組み込まれます。

H2コンソールの有効化

H2データベースのWebコンソールを使用すると、データベースの内容を簡単に確認できます。application.propertiesに以下の設定を追加して、H2コンソールを有効化します。

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

これで、H2コンソールにアクセスできるようになります。

H2コンソールへのアクセス

プロジェクトを実行し、ブラウザで http://localhost:8080/h2-console にアクセスします。

JDBC URLjdbc:h2:mem:testdb と入力し、Connectボタンをクリックします。これで、H2データベースのコンソールにアクセスできます。

application-test.yml と application.properties の使い分け

H2の設定を「どこに書くか」は、H2を使いたい範囲で決めます。

application-test.yml に書く場合

  • テスト実行時だけH2に切り替えられるので安全で一般的。
  • 通常起動(開発)はMySQLなど、テストはH2という分離ができます。

例:開発では本番相当DBで確認しつつ、テストは高速に回したい場合。

application.properties に書く場合

  • 全環境(通常起動も含む)がH2になります。
  • 意図的に「常にH2で動かす」ならOK。

注意点:通常起動もH2になるため、本番DB(MySQL/PostgreSQLなど)との差(型・制約・SQL方言)を見落としやすいです。


application-test.yml でH2を使う設定(テスト時だけ切り替え)

ファイルの配置

テスト用の設定ファイルを以下に作成します。

  • src/test/resources/application-test.yml

application-test.yml の例

spring:
  datasource:
    url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    driver-class-name: org.h2.Driver
    username: sa
    password:

  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true
    properties:
      hibernate:
        format_sql: true

  h2:
    console:
      enabled: true
      path: /h2-console

この設定の意図

  • DB_CLOSE_DELAY=-1:テスト中に接続が閉じてもDBが消えにくくするため
  • ddl-auto: create-drop:テスト開始で作って、終了で消す(テスト向け)
  • show-sql / format_sql:SQL確認用(必要なければ削除してOK)
  • console:テスト中も確認したい場合に有効(不要なら無効でOK)

テストで application-test.yml を有効化する

テストクラスに @ActiveProfiles("test") を付けます。

@ActiveProfiles("test")
class SampleTest {
}

これでテスト実行時に application-test.yml が読み込まれ、H2へ切り替わります。


application.propertiesに書く場合

application.propertiesにデータベース接続の設定を追加します。

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

この設定では、メモリ上にtestdbという名前のデータベースを作成し、H2ドライバを使用して接続します。

設定項目の説明

以下の設定項目について、それぞれの役割を説明します。

  • spring.datasource.url=jdbc:h2:mem:testdb: データベースに接続するためのURLです。memはメモリ内データベースを意味し、testdbはデータベースの名前です。
  • spring.datasource.driverClassName=org.h2.Driver: データベースに接続するためのドライバクラスです。
  • spring.datasource.username=sa: データベースに接続する際のユーザー名です。
  • spring.datasource.password=: データベースに接続する際のパスワードです。今回は空欄で、デフォルトのユーザー設定を使用します。
  • spring.jpa.database-platform=org.hibernate.dialect.H2Dialect: JPAを使う際に、H2データベース用の方言(ダイアレクト)を指定します。

テーブルの作成とデータの挿入

@EntityクラスからDBの自動生成

@Entityアノテーションを使ってクラスを定義すると、Spring Bootがデータベースに対応するテーブルを自動的に作成します。

これは、Spring Bootのspring.jpa.hibernate.ddl-autoプロパティによって制御されます。このプロパティは、データベースのテーブルを自動的に生成したり、既存のテーブルを更新したりするための設定です。

例えば、application.propertiesに以下のように設定すると、アプリケーションの起動時にデータベースのテーブルが自動で更新されます。

spring.jpa.hibernate.ddl-auto=update

ddl-autoの値には他にもcreatecreate-dropvalidateなどがあり、データベースのテーブルをどのように扱うかを制御します。

コンソールからDB作成

コンソールからSQLを使ってテーブルを作成し、データを挿入してみましょう。例えば、以下のSQLを実行してテーブルを作成します。

CREATE TABLE sample_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255)
);

次に、データを挿入します。

INSERT INTO sample_table (name) VALUES ('Test Data');

SELECT文でデータが挿入されているか確認しましょう。

SELECT * FROM sample_table;

ログにSQLを表示する

下記設定をapplication.propertiesなどの設定ファイルに追記する。

spring.jpa.show-sql=を記述する

役割: JPA が生成する SQL クエリをコンソールに表示するかどうかを制御します。

  • true: SQLクエリをコンソールに表示します。
  • false: SQLクエリをコンソールに表示しません(デフォルト)。

用途: 開発中に実行されるSQLを確認するために利用されます。

spring.jpa.show-sql=true

spring.jpa.properties.hibernate.format_sql=を記述する

役割: Hibernate が生成する SQL クエリを整形(インデントや改行の追加)して表示します。

  • true: 整形されたSQLクエリを出力します。
  • false: 整形せず、そのまま出力します(デフォルト)。

用途: SQLの可読性を向上させ、開発者が理解しやすい形で表示するために使います。

注意: この設定は spring.jpa.show-sql=true と一緒に使う必要があります。

spring.jpa.properties.hibernate.format_sql=true

まとめ

これで、H2データベースを開発環境で使用するための設定が完了しました。H2を使うことで、開発中のデータベース操作が容易になり、素早くテストを行うことができます。