Spring

マルチプロジェクトのSpringBootで、Docker + Flywayによる使い捨てDB環境を作る

2023年4月8日

  • マルチプロジェクト(gradle)のSpringBootアプリを触っている
  • 仕事外の技術検証で軽〜くDB使いたい
  • オンメモリDB(H2とか)じゃなくてガッツリOracleとかSQLServerとか使いたい

上記のような時に、いちいちLocalPCにSQLServerをインストールしたくなかったので、DockerforDesktop + flywayを使ってSQLServer用のDB作成+Table生成+初期データInsertを行った時の記事です。

ITエンジニア6年目の山根です。X(Twitter)やってます。自己紹介,お問い合わせはこちらまで!

解決したい技術課題

  • 非オンメモリDBの環境が自PCに欲しい。
  • その際、弄った設定が残り続けるのは嫌なので、パパッと初期化できるようにしたい(使い捨てにしたい)
  • DB作成~Table作成~初期データInsertまでを可能な限り自動化したい

今回はSQLServerを例に構築します。

リポジトリ

github.com

山根が個人的に作っているオニオンアーキテクチャ + マルチプロジェクトのリポジトリに導入してみました。

「そもそも何でマルチプロジェクトにしてるの?」等、マルチプロジェクトにする思想とかメリデメについては以下のブログを参考にしています!

GradleのマルチプロジェクトによるKotlin、Spring Bootでのオニオンアーキテクチャの実現 - タケハタのブログ

手順

Docker for Desktop導入

Download Docker Desktop | Docker

こちらサイトからDocker for Desktopをインストールしてください!

docker-compose.yml生成~コンテナ生成

以下、docker-compose.yml例です。

version: '3' 
services: 
  mssql: 
  image: mcr.microsoft.com/mssql/server:2017-latest 
  container_name: mssql_container 
  environment: 
    - ACCEPT_EULA=Y 
    - SA_PASSWORD=HogeHoge123 
  ports: 
    - '1433:1433' 
  restart: always

こちらをルートディレクトリに配置し、docker-compose up -dコマンドを叩くと、SQLServerのコンテナができているはずです。

compose up成功ログ

DB作成

コンテナの中に入ってCREATE DATABASEコマンドを叩くのが面倒なので、以下のようにgradleタスク化しています。

task<Exec>("createSqlServerDb") { 
    commandLine ("docker", "exec", "-i", "mssql_container", "/opt/mssql-tools/bin/sqlcmd", "-U", "sa", "-P", "HogeHoge123", "-Q", "CREATE DATABASE sampleDb;") 
}

gradle createSqlServerDbコマンドを叩くとsampleDbというDBができているはずです。

flyway導入

plugins {
    ...(略)
    id("org.flywaydb.flyway") version "7.5.2" //flyway導入
}

flywayはpluginで提供されているため、build.gradle.kts(Javaの場合はbuild.gradle)に指定して導入します。

こちらを入れて

SQLServer接続用Driver導入

dependencies {
    implementation("com.microsoft.sqlserver:mssql-jdbc:11.2.1.jre8") //SQLServerDriver導入
}

FlywayがSQLServerに接続するためにはDriverが必要です。上記を指定して、SQLServer接続用のDriverを導入します。
Versionは適宜修正してください!

Flyway用設定

flyway {
    url = "jdbc:sqlserver://localhost:1433;database=sampleDb;TrustServerCertificate=True"
    user = "sa"
    password = "HogeHoge123"
    locations = arrayOf("filesystem:${project.projectDir}/presentation/src/main/resources/db/migration")
    //マルチプロジェクトのどこかを指定する
}

locationsには、後ほど配置していくテーブル作成、初期データ挿入用のファイルを置いておくディレクトリを指定します。filesystem:${project.projectDir}はプロジェクトのルートディレクトリ直下のパスを指定しています。以降のパスはお好きなディレクトリを指定してください。

テーブル生成用ファイル作成

上記のflyway.locationsで指定したパスに、CREATE TABLE文を記載したsqlファイルと、INSERT INTO文を記載したsqlファイルをそれぞれ配置します。

Flywayの規則で、sqlファイルには命名規則があるため参考にしてみてください。

Flyway: Naming Patterns Matter | Redgate

gradle flywayMigrateコマンドを叩くと、これらのファイルをFlywayが読み込んでくれます。

確認できた初期データ

環境を捨てる時は?

docker-compose downによりコンテナ環境ごと削除してみてください。

再度立ち上げたい時は、docker-compose up -d gradle createSqlServerDb gradle flywayMigrateで初期データ導入まで完了します。

便利!

DBは使い捨てにして、綺麗に使おう

今回はDB環境を使い捨てにするための一手について解説してみました。

実際の開発(Local開発)でも使えるところですし、個人的な技術勉強のためにアプリ構築する際にも使えます。

今後の開発に役立てて頂けると幸いです!

-Spring