SpringBoot を利用したマルチモジュールのボイラープレート

SpringBoot を利用したマルチモジュールのボイラープレート

最近の主流な Javaのフレームワークを厳選しながら大規模なプロジェクトでも利用できるようなSpringBoot のボイラープレートを作成しました。フロント、管理画面、バッチ、検索エンジン、会員登録 などのよくある構成を最低限必要な機能に絞ってコンパクトに纏めています。

利用している技術

インフラ編

開発に必要なデータベースなどのインフラ周りはDockerを利用しました。GitHubからダウンロードしたファイルのルートディレクトリに docker ディレクトリがあり、ここに各種デーモンの設定ファイルを纏めています。

Dockerで起動するデーモン

  • NginX 1.15 ・・・ WebサーバーとしてNginXを採用しました。自己証明書を設定済みなので開発環境でSSLとして動作可能です。
  • MySQL 5.7 ・・・ DBサーバーにはMySQLを採用しました。データファイルや設定ファイル、 ログなどはコンテナの外に出して 開発時に参照出来るようにしています。
  • Solr 8.4 ・・・ フロント表示はSolrからデータ取得表示、また、バッチでDB取得したデータをインデックス生成させています。
  • Minio ・・・ 画像のアップロード先にS3を想定している為、ローカル環境でS3のオブジェクトストレージを再現する為に利用しています。
  • phpMyAdmin ・・・ 起動したMySQLのデータを参照・編集するためのツールです。
  • MailHog  ・・・ ダミーのSMTPサーバーです。送信したメールをブラウザで閲覧することが可能です。実際にはメールは送信されないので開発時の誤送信してしまう心配がありません。

フロント画面編

フロント画面では、 APIベースのRestアプリケーションにする為、 React.js を採用しました。フロントエンドはTypescript・Next.js を採用したSSR となる為、submoduleとして別アプリケーションにしています。

https://github.com/isystk/isystk-frontend-sample

フロント 画面で利用している技術

  • Next.js(React)
  • Typescript
  • React Redux

フロント (API)で利用している技術

  • SpringBoot 2.2.5
  • Doma2
  • Spring Data Solr

管理画面編

管理画面では、 AdminLTE を採用しました。 AdminLTE は、Bootstrapをベースにした管理画面等の雛形を作成します。 Webを受託制作する現場においてフロントのデザイン制作をする場合は、クライアントのニーズに柔軟に対応する為、デザインカンプを一から構築するのが主となりBootstrapのようなCSSフレームワークはあまり利用されませんが、管理画面の場合はデザイン作成に不慣れなエンジニアが作成することが多く、また複数の開発者が制作に携わるので チームとして永続的に一定のクオリティの制作物を作り続ける為に、ある程度の「無駄」を許容してでも統一したルールと堅牢性を持ったCSSフレームワークを利用するということには十分なメリットがあると言えます。

管理画面で利用している技術

  • AdminLTE3
  • SpringBoot 2.2.5
  • Doma2
  • ログイン/ログアウト
  • 一覧検索・登録/更新/削除
  • CSV/Excel/PDFダウンロード

バッチ編

バッチアプリケーションでは、SpringBatch を採用しました。サンプルアプリケーションとして、Solrにインデックスを生成するバッチ処理と、CSVファイルからマスタデータをDBにインポートするアプリケーションを追加しています。

  • Spring Batch
  • SpringBoot 2.2.5
  • Doma2
  • Spring Data Solr インデックス生成処理
  • CSV読み込み/DBインポート処理

Github

https://github.com/isystk/java-springboot-boilerplate

細かな不具合はありますが、システム開発する上で必要最低限な機能と基盤の構築は概ね出来ていると思います。時間のあるときに少しつづ機能追加や不具合を修正して行く予定です。

ディレクトリ構造

.
├── docker
│ ├── mysql (DBサーバー)
│ │ ├── conf.d (mysqlの設定ファイル)
│ │ ├── data (mysqlのデータファイル)
│ │ ├── doma-gen (doma2のジェネレータ)
│ │ ├── init (mysqlの初期DDL)
│ │ ├── logs (mysqlのログ)
│ │ ├── script (mysql関連のスクリプト)
│ │ └── sample.a5er (ER図)
│ ├── nginx (Webサーバー)
│ │ ├── conf.d (nginxの設定ファイル)
│ │ ├── logs (nginxのログ)
│ │ └── ssl (SSL自己証明書)
│ ├── phpmyadmin (DB管理コンソール)
│ ├── s3(Minio)
│ │ └── data (オブジェクトストレージ)
│ ├── solr (検索エンジン)
│ │ ├── data (solrのデータファイル)
│ │ └── logs (solrのログ)
│ ├── .env
│ └── docker-compose.yml
├── batch (バッチ)
├── business (共通ロジック)
├── static (フロントエンドモジュール)
│ └── public (WEB公開ディレクトリ)
│ └── thumb (アップロードした写真)
├── web (Web共通ロジック)
├── web-admin (管理画面)
├── web-front (フロント画面)
├── dc.sh (Dockerの起動用スクリプト)
└── build.gradle (Gradle用設定ファイル)

データ設計

フロントの認証管理用として T_USER テーブルがありユーザーが投稿したデータを保存するための T_POST テーブルが紐付いています。また、管理画面用の認証間利用として T_STAFF テーブルが存在しています。

ER図

推奨する開発環境

  1. JDK バージョン 11以上
  2. Eclipse または、InteliJ IDEA

使い方

Dockerの起動

NginX、MySQL、Solrなどの各種デーモンを起動する。

./gradlew composeUp

各種アプリケーションを実行する。

# 管理画面を起動する
./gradlew web-admin::bootRun
# フロントエンドを起動する
./gradlew web-front::bootRun
# インデックス生成バッチを実行する
./gradlew batch::bootRun -Pargs=--job=solrRegistJob

接続先情報

テストユーザー test@sample.com / password
接続先URL
管理側画面https://localhost/admin/
フロント側https://localhost/
フロントAPIhttps://localhost/api/v1/post/
phpMyAdminhttp://localhost:8888/
Solrhttp://localhost:8983/solr/
MailHoghttp://localhost:8025/

開発環境構築

ソースのダウンロード

$ git clone https://github.com/isystk/java-springboot-boilerplate.git

必要な設定(Eclipseの場合)

businessプロジェクトの「プロパティ」-「Javaコンパイラ」-「注釈処理」を有効にする ファクトリーパスで「JARの追加」を選択後に以下のJARを追加する docker\mysql\doma2\lib\doma-2.27.0.jar “business\target\classes\com\isystk\sample\domain\dao” 以下に “XXImpl.class”が追加されていれば成功です。

参考

プロジェクト概要
Lombok Project定型的なコードを書かなくてもよくする
SpringframeworkSpring Framework
Spring Securityセキュリティ対策、認証・認可のフレームワーク
Doma2O/Rマッパー
spring-boot-doma2Doma2とSpring Bootを連携する
FlywayDBマイグレーションツール
Thymeleafテンプレートエンジン
Thymeleaf Layout Dialectテンプレートをレイアウト化する
WebJarsjQueryなどのクライアント側ライブラリをJARとして組み込む
ModelMapperBeanマッピングライブラリ
Ehcacheキャッシュライブラリ
Spockテストフレームワーク
Mockitoモッキングフレームワーク

コメントを残す

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。