かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Gradle で Multi-project を作成する ( その7 )( doma2lib+cmdapp+webapp編、Multi-project の設定ファイルと docker-compose.yml を作成する )

概要

記事一覧はこちらです。

Gradle で Multi-project を作成する ( その6 )( Multi-project は settings.gradle に include を書くだけでもよいのでは? ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Doma 2 の Entity、Dao を提供するライブラリ+Spring Boot ベースのコマンドラインアプリケーション+Spring Boot ベースの Web アプリケーションの Multi-project を作成します。
    • Web とバッチで Doma 2 の Entity と Dao を共有したい場合を想定してみました。
    • 6~8回程度で書ければいいかな。。。

参照したサイト・書籍

  1. dockerhub - mysql https://hub.docker.com/_/mysql

  2. dockerhub - adminer https://hub.docker.com/_/adminer/

  3. MySQL8.0ではGRANT構文でユーザを作成できない
    https://www7390uo.sakura.ne.jp/wordpress/archives/456

  4. MySQL Innovation Day Tokyo で MySQL 8 の文字コードについて話した
    https://tmtms.hatenablog.com/entry/201805/mysql-innovation-day-tokyo

  5. ユーザーを作成する(CREATE USER文)
    https://www.dbonline.jp/mysql/user/index1.html

  6. MySQL 8.0 の AUTO_INCREMENT について
    https://www.s-style.co.jp/blog/2018/08/2284/

  7. MySQL入門】CREATE TABLE文でテーブルを作成する方法
    https://www.sejuku.net/blog/82708

  8. MySQL data types
    http://zetcode.com/databases/mysqltutorial/datatypes/

目次

  1. 方針
  2. gradle-multiprj-doma2lib-cmdwebapp ディレクトリ作成+Gradle Wrapper コピー+Gradle 5.4.1 バージョンアップ+gradlew init
  3. IntelliJ IDEA で gradle-multiprj-doma2lib-cmdwebapp プロジェクトをオープンする
  4. Spring Initializr で doma2-lib プロジェクトを作成する
  5. MySQL と Flyway を起動するための docmer-compose.yml を作成した後、サーバを起動してデータベースとテーブルを作成する

手順

方針

  • 以下のディレクトリ構成(必要最低限のディレクトリ・ファイルのみ記述しています)の Multi-project を作成します。
gradle-multiprj-doma2lib-cmdwebapp
├ doma2-lib    <-- Doma 2 の Entity、Dao を提供するライブラリの Project
│ ├ src
│ │ ├ main
│ │ │ └ java
│ │ │   └ ksbysample
│ │ │     └ lib
│ │ │       └ doma2lib
│ │ │         ├ dao
│ │ │         └ entity
│ │ └ resources
│ │   ├ db
│ │   │ ├ init
│ │   │ │ └ create_database.sql
│ │   │ └ migration
│ │   │   └ V1__create_table.sql    <-- Flyway 用 SQL ファイル
│ │   ├ db-develop.properties    <-- develop profile 用 DB 設定ファイル
│ │   └ db-product.properties    <-- product profile 用 DB 設定ファイル 
│ └ build.gradle
├ sample-cmdapp    <-- Spring Boot ベースのコマンドラインアプリケーションの Project
│ ├ src
│ │ ├ main
│ │ │ └ java
│ │ │   └ ksbysample
│ │ │     └ app
│ │ │       └ samplecmdapp
│ │ └ resources
│ └ build.gradle
├ sample-webapp    <-- Spring Boot ベースの Web アプリケーションの Project
│ ├ src
│ │ ├ main
│ │ │ └ java
│ │ │   └ ksbysample
│ │ │     └ app
│ │ │       └ samplewebapp
│ │ └ resources
│ └ build.gradle
├ build.gradle
└ settings.gradle
  • 今回は全てのプロジェクトを Spring Initializr で作成します。
  • develop と product の2つの Profile を作成・使用します。
  • テスティングフレームワークは全ての Project で JUnit 5 と Spock を使用できるようにします。
  • checkstyle, spotbugs, pmd, error-prone は導入しません。
  • Spring Boot ベースの Web アプリケーションでは 8080番ポートを使用します。
  • Spring Boot ベースのアプリケーションの build.gradle の共通の設定は各サブプロジェクトの build.gradle ではなく gradle-multiprj-doma2lib-cmdwebapp の build.gradle に記述します。
  • DB は MySQL のバージョン 8 を docker-compose で起動して利用します(これまで使ったことがなかったので)。
  • DB へのデータ投入には Flyway を使用します。Flyway に必要なファイルは doma2-lib プロジェクトの下に配置します。
  • コマンドラインアプリケーションでは CSV ファイルを読み込んで DB のテーブルにデータを登録し、Web アプリケーションでは DB のテーブルに登録されたデータを取得して表示します。
  • 最初に doma2-lib-1.0.0-RELEASE.jar を sample-cmdapp-1.0.0-RELEASE.jar、sample-webapp-1.0.0-RELEASE.jar の中に入れる方式(JarLauncher による起動)で一通り書いてから、doma2-lib-1.0.0-RELEASE.jar を外に出す方式(PropertiesLauncher による起動)を書くつもりです。
  • draw.io で全体図を描いてみました。

f:id:ksby:20190422070428p:plain

gradle-multiprj-doma2lib-cmdwebapp ディレクトリ作成+Gradle Wrapper コピー+Gradle 5.4.1 バージョンアップ+gradlew init

ksby/ksbysample-boot-miscellaneous の repository を checkout している D:\project-springboot\ksbysample-boot-miscellaneous の下に gradle-multiprj-doma2lib-cmdwebapp ディレクトリを作成します。

f:id:ksby:20190429010538p:plain

gradle-multiprj-lib-webapp2 プロジェクトから Gradle Wrapper のファイルをコピーします。

f:id:ksby:20190429010921p:plain

コマンドプロンプトから gradlew wrapper --gradle-version=5.4.1gradlew --versiongradlew wrapper コマンドを実行して Gradle を 5.4 → 5.4.1 へバージョンアップします。

f:id:ksby:20190429011306p:plain

gradle/wrapper/gradle-wrapper.properties を見ると 5.4.1 になっています。

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

gradlew init コマンドを実行します。選択肢は 1: basic1: groovy を選択し、Project name は何も入力せずに Enter キーを押します。

f:id:ksby:20190429011701p:plain f:id:ksby:20190429011756p:plain

IntelliJ IDEA で gradle-multiprj-doma2lib-cmdwebapp プロジェクトをオープンする

gradle-multiprj-doma2lib-cmdwebapp プロジェクトをオープンします。

f:id:ksby:20190429140849p:plain

f:id:ksby:20190429141235p:plainf:id:ksby:20190429141319p:plain

Spring Initializr で doma2-lib プロジェクトを作成する

Flyway で使用する SQL ファイルを doma2-lib プロジェクトの下に配置するので、最初に IntelliJ IDEA から Spring Initializr を利用して doma2-lib プロジェクトを作成しておきます。

f:id:ksby:20190429194516p:plainf:id:ksby:20190429194722p:plain
f:id:ksby:20190429194808p:plainf:id:ksby:20190429194858p:plain

※dependencies のダイアログでは何もチェックしません。

f:id:ksby:20190429195017p:plain

作成後 IntelliJ IDEA のウィンドウが開きますが、何もせずに閉じます。

src ディレクトリと build.gradle だけ残して、それ以外のディレクトリファイルは全て削除します。gradle-multiprj-doma2lib-cmdwebapp プロジェクトの settings.gradle にはまだ include 文は追加しません。

MySQL と Flyway を起動するための docmer-compose.yml を作成した後、サーバを起動してデータベースとテーブルを作成する

MySQL のデータファイルをローカルディレクトリに保存するために docker/mysql/data を作成します。

doma2-lib/src/main/resources の下に db/init、db/migration の2つのディレクトリを作成します。

doma2-lib/src/main/resources/db/init の下に create_database.sql を新規作成し、以下の内容を記述します。

create database if not exists sampledb character set utf8mb4 collate utf8mb4_ja_0900_as_cs_ks;

create user 'sampledb_user'@'%' identified by 'xxxxxxxx';
grant all privileges ON sampledb.* to 'sampledb_user'@'%' with grant option;
flush privileges;

doma2-lib/src/main/resources/db/migration の下に V1__create_table.sql を新規作成し、以下の内容を記述します。

create table employee (
    id int(11) not null auto_increment,
    name varchar(128) not null,
    age int(3) not null,
    sex enum('男', '女'),
    update_time datetime default current_timestamp,
    primary key (id)
);
insert into employee (name, age, sex) values ('田中 太郎', 20, '男');
insert into employee (name, age, sex) values ('鈴木 花子', 18, '女');

ルートディレクトリの下に .env を新規作成し、以下の内容を記述します。

MYSQL_VERSION=8.0.16
ADMINER_VERSION=4.7.1

FLYWAY_VERSION=5.2.4
FLYWAY_URL=jdbc:mysql://mysql/sampledb
FLYWAY_USER=sampledb_user
FLYWAY_PASSWORD=xxxxxxxx

ルートディレクトリの下に docker-compose.yml を新規作成し、以下の内容を記述します。

version: '3'

services:
  # 起動したコンテナに /bin/sh でアクセスする場合には以下のコマンドを実行する
  # docker exec -it mysql bash
  mysql:
    image: mysql:${MYSQL_VERSION}
    container_name: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    ports:
      - 3306:3306
    environment:
      - TZ=Asia/Tokyo
      - MYSQL_ROOT_PASSWORD=xxxxxxxx
    volumes:
      - ./docker/mysql/data:/var/lib/mysql
      - ./doma2-lib/src/main/resources/db/init/create_database.sql:/docker-entrypoint-initdb.d/create_database.sql

  # URL
  # http://localhost:9080/
  adminer:
    image: adminer:${ADMINER_VERSION}
    container_name: adminer
    restart: always
    ports:
      - 9080:8080
    environment:
      - TZ=Asia/Tokyo
      - ADMINER_DEFAULT_SERVER=mysql

  flyway:
    image: boxfuse/flyway:${FLYWAY_VERSION}-alpine
    container_name: flyway
    environment:
      - TZ=Asia/Tokyo
    volumes:
      - ./doma2-lib/src/main/resources/db/migration:/flyway/sql
    command: -url=${FLYWAY_URL} -user=${FLYWAY_USER} -password=${FLYWAY_PASSWORD} -connectRetries=60 migrate
    depends_on:
      - mysql
    # 下の3行は debug 用
    # うまく動かない時はコメントアウトを解除した後、
    # docker exec -it flyway /bin/sh
    # で接続してから
    # flyway <command に記述した文字列>
    # を実行してみる
    #
    # entrypoint: /bin/sh
    # stdin_open: true
    # tty: true

これで必要なファイルを一通り作成しましたので、コマンドラインから docker-compose up -d コマンドを実行します。

f:id:ksby:20190429221827p:plain f:id:ksby:20190429222726p:plain

http://localhost:9080/ にアクセスして sampledb が作成されていること、emplayee テーブルにデータが登録されていることを確認します。

f:id:ksby:20190429222025p:plain f:id:ksby:20190430135340p:plain f:id:ksby:20190430111405p:plain f:id:ksby:20190430111441p:plain

履歴

2019/04/29
初版発行。
2019/04/30
* 「参照したサイト・書籍」に MySQL data types を追加した。
* V1__create_table.sql の create table employee 文に age, sex, update_time のカラムを追加し、投入するデータを日本語のものに変更した。
* create database の collate を utf8mb4_0900_as_cs → utf8mb4_ja_0900_as_cs_ks に変更した。