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ファイルを解凍するだけで実行可能です
- Windows版はこちらから
Mac版はこちらから※準備中
解凍後、実行ファイル(.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で動作させます
- 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
- サーバ側(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
- クライアント側(コンソールアプリ)のビルドと起動 *サーバを起動しているコンソールとは別のコンソールで行う
# 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の実装で定義しています
物理構造
application.jarはserviceレイヤ、persistenceレイヤ、Domainレイヤのモジュールを格納し、server.jarにはWebAPIレイヤのモジュールを格納しています
配置構造
レンタル予約システムはLocal接続とRemote接続の2つをサポートし、接続形態ごとに配置に必要となるモジュールは異なります
Local接続時の物理配置
シングルプロセスで動作しapi-local.jarのアダプタ実装からレンタル予約システムアプリの実体であるapplication.jarへ直接依存依存させています
Remote接続時の物理配置
Client/Sever方式で動作しClientからSeverモジュールへの直接的な依存はなくserver.jarによるWebAPIを経由しapplication.jarの機能提供を受けます。また、別リポジトリのReactUIもコンソールUIと同じserver.jarのWebAPIと連携します
利用ライブラリと準拠API
- ランタイム系
- Java17(OpenJDK v17.0.3)
- Bean Validation 3.0(Hibernate Validator 7.0.2)
- MicroProfile 5.0
- Server(Netty 4.1)
- CDI 3.0(Weld 3.1)
- JAX-RS 3.0(Jersey 3.0)
- MicroProfile Rest Client 3.0
- MicroProfile Config 3.0.1
- MicroProfile JWT-AUTH 2.0
- MicroProfile Health 4.0
- MicroProfile OpenAPI 3.0
- Helidon MP v2.5.0
- ReactiveWebserver
- Helidon MP JPA (EclipseLink 3.0.2)
- CDI extension for HikariCP (HikariCP 5.0)
- CDI extension for JTA (Weld 4.0)
- CORS in Helidon MP
- Configuration Secrets in Helidon Config
- JWT
- H2 Database
- Text-IO 3.4.1 -> コンソールアプリ向けのframework
- テスト系
- JUnit 5.7
- ArchUnit 0.23
- Helidon MP Testing with JUnit5
*カッコ内は利用している実装
主な仕組みと実現方式
仕組み | 方式 |
---|---|
認証 | 独自認証+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 |