/rms

RentalManagementSystem is MicroProfile's experimental reference application with Helidon

Primary LanguageJavaMIT LicenseMIT

build-all Maintainability Rating Lines of Code BCH compliance

Rental Management System Application

Rental Management SystemはHelidonを用いてMicroProfileの利用法や効果を確認することを目的としたリファレンス的なアプリケーションです

Table of Contents

アプリケーションの説明

アプリケーション機能

会員がレンタル品を予約するアプリケーションで管理機能としてマスターデータをメンテナンスする機能を持っています。なお、実装している機能は予約まででレンタルを行う機能はまだ持っていません

分類 機能 内容
会員機能 レンタル品検索 レンタル品を検索し予約状況の確認ができます
レンタル品予約 予約したいレンタル品を選択しレンタル期間を指定した予約ができます
予約確認 自分の予約を確認したりキャンセルしたりすることができます
管理機能 レンタル品管理 レンタル品の登録や更新などを行うことができます
予約管理 登録されたレンタル予約の削除や変更を行うことができます
ユーザ管理 ユーザの登録や更新、削除などを行うことができます

UIはコンソールUIとなりますが別途ReactによるSPAなUIもあります。興味があるかたはこちら

ビルドと動作方法

手っ取り早くアプリで動かす

All In OneでLocal&JPAで起動するアプリケーションを用意しています。jpackageでOSごとの実行形式に変換しているためzipファイルを解凍するだけで実行可能です

解凍後、実行ファイル(.exeまたは.app)をダブルクリックするとSwingのコンソールアプリが起動します。プロンプトが現れたらデフォルトで用意しているこちらのID/passwordを使ってログインできます

Dockerでサーバアプリとクラアントアプリを動かす

実行可能imageをDocker Hubに登録しています。Docker Composeを使ってコマンド一発でサーバーとコンソールアプリを起動できます。

# Clone this repository
git clone https://github.com/extact-io/rms.git
# Go into the repository
cd rms
# Run the app
docker-compose run rms-client

コンソールアプリが起動しますので、プロンプトが現れたらデフォルトで用意しているこちらのID/passwordを使ってログインできます

自分でビルドして動かす

cloneもしくはzipで取得したrepositoryのコードをビルドして実行します。JDK SE 11以上とMavenが前提となります。上記のAll In Oneアプリとは異なりこちらはRemote&JPAで動作させます

  1. dependencyのローカルインストール
# Clone this repository
git clone https://github.com/extact-io/rms.git
# Go into the repository
cd rms
# Run the app
mvn -Pcli,all clean install -DskipTests=true
  1. サーバ側(RESTリソースアプリ)のビルドと起動
# Go into the app directory
cd rms-server
# Build the app
mvn -Pcli,copy-libs clean package -DskipTests=true
# Run the app
java -Drms.h2.script=classpath:init-rms-demo.ddl -jar target/rms-server.jar
  1. クライアント側(コンソールアプリ)のビルドと起動 *サーバを起動しているコンソールとは別のコンソールで行う
# Go into the app directory
cd /path/to/your/rms_dir
cd rms-client-ui-console
# Build the app
mvn -Pcli,copy-libs clean package -DskipTests=true
# Run the app
java -jar target/rms-client-ui-console.jar

クライアントアプリを起動するとログインを求められますのでデフォルトで用意しているID/passwordを入力してください

デフォルトで用意しているID/password

種別 ID password
会員 edamame edamame
管理者 admin admin

アプリケーションアーキテクチャ

論理アーキテクチャ

論理アーキテクチャはCleanArchitectureでもヘキサゴナルでもなんでもありません。 Domainレイヤをリラックスレイヤにした一般的なレイヤーアーキテクチャになります

レイヤ

  • UIレイヤ・・言わずもがなUI
  • APIレイヤ・・レンタル予約システムに対するClient側の公開JavaAPI
  • Adoptorレイヤ・・Client側の公開JavaAPIに対する実装。接続方式の違いを吸収する
  • WebAPIレイヤ・・レンタル予約システムアプリをRESTで外部に公開する
  • Serivceレイヤ・・レンタル予約システムのアプリケーション実装
  • Domainレイヤ・・エンティティや制約
  • Persistenceレイヤ・・データの永続化
  • Platformレイヤ・・業務依らない基盤的な仕組み

なお、レイヤ間やパッケージや他ライブラリへの依存関係のルールはArchUnitの実装で定義しています

📌 POINT レンタル予約システムのアプリケーションの実体であるServiceレイヤへの接続は利用するAPIレイヤの実装を切り替えるだけでRemoto/Localのどちらでも動作するようになっています。また、Persistenceレイヤも設定を切り替えるだけでFileによる永続化とJPAを使ったRBDへの永続化のどちらでも使えるようにしています

物理構造

application.jarはserviceレイヤ、persistenceレイヤ、Domainレイヤのモジュールを格納し、server.jarにはWebAPIレイヤのモジュールを格納しています

全体物理配置

配置構造

レンタル予約システムはLocal接続とRemote接続の2つをサポートし、接続形態ごとに配置に必要となるモジュールは異なります

Local接続時の物理配置

シングルプロセスで動作しapi-local.jarのアダプタ実装からレンタル予約システムアプリの実体であるapplication.jarへ直接依存依存させています

Local接続時の物理配置

Remote接続時の物理配置

Client/Sever方式で動作しClientからSeverモジュールへの直接的な依存はなくserver.jarによるWebAPIを経由しapplication.jarの機能提供を受けます。また、別リポジトリのReactUIもコンソールUIと同じserver.jarのWebAPIと連携します

Remote接続時の物理配置

利用ライブラリと準拠API

*カッコ内は利用している実装

主な仕組みと実現方式

仕組み 方式
認証 独自認証+JTW Bearer Token(MicroProfile JTW Authentication)
認可 MicroProfile JTW RBAC+JakartaEE Security API(JSR 375)
API定義 MiciroProfile OpenAPIによるOAS出力

platformモジュールの提供機能

業務依らない基盤的な仕組みとしてplatformモジュールが提供する機能 (platformモジュールのコメントを1部英語で記載しているためOSSのコードをパクったように見える箇所がありますが全てスクラッチから作成しています😅)

パッケージ 機能 主要クラス 実装API
config システムプロパティで指定された設定ファイルの読み込み ExternalPathConfigProvider MicroProfile Config
特定のリソースパス配下に配置されている設定ファイルの自動読み込み ResourcePathUnderConfigProvider MicroProfile Config
evn MANIFEST.MFなどから取得した環境情報の提供 MainJarInfo
extension CDIExtensions
・設定ファイルで指定されたクラスをCDIBeanとして登録する
・アノテーションと設定ファイルの情報からCDIBeanの有効/無効化を行う
ApplicationInitializerCdiExtension JakartaEE CDI
health メモリ状況をもとにlivenessとreadnessの応答を返す MemoryHealthCheck MicroProfile Health
jwt 認証情報をJsonWebTonkenにする Jose4jJwtGenerator MicroProfile JWT
受け取ったJsonWebTokenを検証する Jose4PrivateSecretedTokenValidator MicroProfile JWT
log 優先度と上書き設定が解決済みの設定情報を一覧でログ出力する MpConfigDump
RESTリソースに対するリクエストのヘッダ情報をログ出力する ServerHeaderDumpFilter
EclipseLinkログのSLF4Jブリッジ SessionLogBridge (EclipseLink)
provider JSON変換時に適用するアプリ独自のコンバータ JsonbRmsConfig JakartaEE JSONB
リクエストパラメータに適用するアプリ独自のコンバータ ParamRmsConverterProvider JakartaEE JAX-RS
ステータスコード404に対する例外ハンドラ PageNotFoundExceptionMapper JakartaEE JAX-RS
未捕捉例外をハンドルしてログ出力する例外ハンドラ UnhandledExceptionMapper JakartaEE JAX-RS
role RESTリソースに対するRoleベースの認可制御 RoleSecurityDynamicFeature JakartaEE Security API
util クラスパスリソースの検索ユーティリティ ResourceUtils
validate バリデーショングループも指定可能なメソッドバリデーションの仕組み ValidateParamInterceptor JakartaEE Bean Validation

利用ツール

プロセス 利用ツール
build Maven
CI GitHub Actions
CD GitHub Actions + AWS CodeDeploy
Static analysis SonarClooud, Mave Site Generator
API Doc Redoc