これは何?
- マルチプロジェクト(gradle)のSpringBootアプリを触っている
- 仕事外の技術検証で軽〜くDB使いたい
- オンメモリDB(H2とか)じゃなくてガッツリOracleとかSQLServerとか使いたい
上記のような時に、いちいちLocalPCにSQLServerをインストールしたくなかったので、DockerforDesktop + flywayを使ってSQLServer用のDB作成+Table生成+初期データInsertを行った時の記事です。
解決したい技術課題
- 非オンメモリDBの環境が自PCに欲しい。
- その際、弄った設定が残り続けるのは嫌なので、パパッと初期化できるようにしたい(使い捨てにしたい)
- DB作成~Table作成~初期データInsertまでを可能な限り自動化したい
今回はSQLServerを例に構築します。
リポジトリ
山根が個人的に作っているオニオンアーキテクチャ + マルチプロジェクトのリポジトリに導入してみました。
「そもそも何でマルチプロジェクトにしてるの?」等、マルチプロジェクトにする思想とかメリデメについては以下のブログを参考にしています!
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のコンテナができているはずです。
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開発)でも使えるところですし、個人的な技術勉強のためにアプリ構築する際にも使えます。
今後の開発に役立てて頂けると幸いです!