Skip to content

Commit

Permalink
Merge pull request #20 from jkazama/v3.1
Browse files Browse the repository at this point in the history
v3.1.1
  • Loading branch information
jkazama authored Jun 30, 2023
2 parents fd70d0f + 310d483 commit 8c14c75
Show file tree
Hide file tree
Showing 100 changed files with 1,488 additions and 2,301 deletions.
14 changes: 3 additions & 11 deletions .devcontainer/compose.yml
Original file line number Diff line number Diff line change
@@ -1,19 +1,11 @@
services:
workspace-backend:
build: .
image: jkazama/ddd-java
command: sleep infinity
image: mcr.microsoft.com/vscode/devcontainers/java:17-jdk-bullseye
init: true
command: /bin/sh -c "while sleep 1000; do :; done"
extra_hosts:
- 'host.docker.internal:host-gateway'
volumes:
- ..:/home/vscode/workspace:cached
- ~/.ssh:/home/vscode/.ssh
- backend-gradle-cache:/home/vscode/.gradle
- backend-extensions:/home/vscode/.vscode-server/extensions
- backend-extensions-insiders:/home/vscode/.vscode-server/-extensions-insiders
working_dir: /home/vscode/workspace

volumes:
backend-gradle-cache:
backend-extensions:
backend-extensions-insiders:
43 changes: 23 additions & 20 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,31 @@
],
"service": "workspace-backend",
"shutdownAction": "stopCompose",
"settings": {
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"java.jdt.ls.java.home": "/docker-java-home",
"java.format.settings.profile": "Google",
"java.format.settings.url": "https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml"
"customizations": {
"vscode": {
"settings": {
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"java.jdt.ls.java.home": "/docker-java-home",
"java.format.settings.profile": "Google",
"java.format.settings.url": "https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml"
},
"extensions": [
"mhutchie.git-graph",
"mikestead.dotenv",
"EditorConfig.EditorConfig",
"vscjava.vscode-lombok",
"vscjava.vscode-java-pack",
"vscjava.vscode-gradle",
"vscjava.vscode-spring-boot-dashboard",
"pivotal.vscode-spring-boot",
"pivotal.vscode-boot-dev-pack"
]
}
},
"workspaceFolder": "/home/vscode/workspace",
"extensions": [
"mhutchie.git-graph",
"eamodio.gitlens",
"mikestead.dotenv",
"EditorConfig.EditorConfig",
"vscjava.vscode-lombok",
"vscjava.vscode-java-pack",
"vscjava.vscode-gradle",
"vscjava.vscode-spring-boot-dashboard",
"pivotal.vscode-spring-boot",
"pivotal.vscode-boot-dev-pack"
],
"forwardPorts": [
8080
],
Expand Down
200 changes: 86 additions & 114 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,166 +1,138 @@
[English Version](https://github.com/jkazama/ddd-java/tree/en)

ddd-java
---

## はじめに

JSUG(日本Springユーザ会)の下記勉強会向けのサンプル実装です。

- 2014/11/27 「SpringBootを用いたドメイン駆動設計」
### Preface

> Spring Boot 3 の利用に伴い実装コードを Java17 へ切り替えています。 Java7 での実装コードを確認したいときは 1.x ブランチを参照してください。
It is DDD sample implementation from [Spring Boot](http://projects.spring.io/spring-boot/).
It is not a framework, This is a simple example of the implementation based on Evans's DDD.

本サンプルでは[SpringBoot](http://projects.spring.io/spring-boot/)[Lombok](http://projectlombok.org/)を利用してドメインモデリングの実装例を示します。実際に2007年くらいから現在に至るまで現場で利用されている実装アプローチなので、参考例の一つとしてみてもらえればと思います。
※JavaDocに記載をしていますが、サンプルに特化させているので実際の製品コードが含まれているわけではありません。

認証含む、より実践的な実装サンプルについては[sample-boot-hibernate](https://github.com/jkazama/sample-boot-hibernate)を参照してください。
またUI側の実装サンプルについては[sample-ui-vue](https://github.com/jkazama/sample-ui-vue) / [sample-ui-react](https://github.com/jkazama/sample-ui-react)を参照してください。
#### Concept of Layering

### レイヤリングの考え方
It is three levels of famous models, but considers the infrastructure layer as cross-sectional interpretation.

オーソドックスな三層モデルですが、横断的な解釈としてインフラ層を考えます。
| Layer | |
| -------------- | ----------------------------------------------------------- |
| UI | Receive use case request |
| Application | Use case processing (including the outside resource access) |
| Domain | Pure domain logic (not depend on the outside resource) |
| Infrastructure | DI container and ORM, various libraries |

- UI層 - ユースケース処理を公開(必要に応じてリモーティングや外部サイトを連携)
- アプリケーション層 - ユースケース処理を集約(外部リソースアクセスも含む)
- ドメイン層 - 純粋なドメイン処理(外部リソースに依存しない)
- インフラ層 - DIコンテナやORM、各種ライブラリ、メッセージリソースの提供
Usually perform public handling of UI layer using Thymeleaf, but this sample assume use of different types of clients and perform only API offer in RESTfulAPI.

UI層の公開処理は通常Thymeleafを用いて行いますが、本サンプルでは異なる種類のクライアント利用を想定してRESTfulAPIでの公開を前提とします。(API利用前提のサーバ解釈)
#### Use policy of Spring Boot

### SpringBootの利用方針
Spring Boot is available for various usage, but uses it in the following policy with this sample.

SpringBootは様々な利用方法が可能ですが、本サンプルでは以下のポリシーを用います。
- Use standard definitions as much as possible, such as DB settings.
- The configuration file uses yml. do not use xml files for Bean definition.
- The exception handling defines it in a endpoint (RestErrorAdvice).

- DBの設定等、なるべく標準定義をそのまま利用する。
- 設定ファイルはymlを用いる。Bean定義にxml等の拡張ファイルは用いない。
- ライブラリ化しないので@Beanによる将来拡張性を考慮せずにクラス単位でBeanベタ登録。
- 例外処理は終端(RestErrorAdvice/RestErrorCotroller)で定義。
- サンプル用途
#### Use policy of Java coding

### Javaコーディング方針
- Java17 over
- Use Lombok positively and remove diffuseness.
- The name as possible briefly.
- Do not abuse the interface.
- DTO becoming a part of the domain defines it in an internal class.

Java17以上を前提としていますが、従来のJavaで推奨される記法と異なっている観点も多いです。
以下は保守性を意識した上で簡潔さを重視した方針となっています。
#### Resource

- Lombokを積極的に利用して冗長さを排除
- 名称も既存クラスと重複しても良いのでなるべく簡潔に
- インターフェースの濫用をしない
- ドメインの一部となるDTOなどは内部クラスで表現

### パッケージ構成

パッケージ/リソース構成については以下を参照してください。
Refer to the following for the package / resource constitution.

```
main
java
sample
context … インフラ層
controller … UI層
model … ドメイン層
usecase … アプリケーション層
util … 汎用ユーティリティ
- Application.java … 実行可能な起動クラス
context … Infrastructure Layer
controller … UI Layer
model … Domain Layer
usecase … Application Layer
util … Utilities
- Application.java … Bootstrap
resources
- application.yml … 設定ファイル
- messages-validation.properties … 例外メッセージリソース
- messages.properties … メッセージリソース
- application.yml … Spring Boot Configuration
- messages-validation.properties … Validation Message Resources
- messages.properties … Label Message Resources
```

## サンプルユースケース

サンプルユースケースとしては以下を想定します。

- **口座残高100万円を持つ顧客**が出金依頼(発生 T, 受渡 T + 3)をする。
- **システム**が営業日を進める。
- **システム**が出金依頼を確定する。(確定させるまでは依頼取消行為を許容)
- **システム**が受渡日を迎えた入出金キャッシュフローを口座残高へ反映する。

## 動作確認

サンプルはGradleを利用しているので、IDEやコンソールで動作確認を行うことができます。

### VSCode

開発IDEである[VSCode](https://code.visualstudio.com)で本サンプルを利用するには、事前に以下の手順を行っておく必要があります。
## Use Case

- Java17以上のインストール
- DevContainer 利用時は不要
- Java / Lombok / Gradle の Extension 追加
Consider the following as a sample use case.

次の手順で本サンプルをプロジェクト化してください。
- A customer with an account balance requests withdrawal. (Event T, Delivery T + 3)
- The system closes the withdrawal request. (Allows cancellation of request until closing)
- The system sets the business day to the forward day.
- The system reflects the cash flow on delivery date to the account balance.

1. ダウンロードした*java-ddd*ディレクトリ直下へコンソールで移動
1. 「code .」で起動
### Getting Started

次の手順で本サンプルを実行してください。
This sample uses [Gradle](https://gradle.org/), you can check the operation without trouble with IDE and a console.

1. 左サイドメニューの「Run And Debug」で *Run ddd-java* を選択肢て実行
1. *DEBUG CONSOLE*タブに「Started Application」という文字列が出力されればポート8080で起動が完了
#### Server Start (VSCode DevContainer)

> Linux や WSL 上で DevContainer を立ち上げて確認することも可能です。 Open Container のダイアログが出たらOKを押下してください。
> DevContainer の起動に失敗する時はポート重複が無いか、vscode-remote-release の [#7303](https://github.com/microsoft/vscode-remote-release/issues/7303) の問題を踏んでいないか確認してください。 #7303 の問題だった時は Extension の DevContainers を `v0.251.0` へ下げることでうまくいくことがあります。
It is necessary to do the following step.

### STS(Eclipse)
- Check Instablled Docker.
- Check Instablled VSCode with DevContainer Extension.

開発IDEである[STS](https://spring.io/tools/sts)で本サンプルを利用するには、事前に以下の手順を行っておく必要があります。
※EclipseにSpringIDEプラグインを入れても可
Do the preparations for this sample in the next step.

- Java17以上のインストール
- [Lombok](http://projectlombok.org/download.html)のパッチ当て(.jarを実行してインストーラの指示通りに実行)
1. You move to the cloned *ddd-java* directory.
1. Run command `code .`.
1. Choose *Open Container*

次の手順で本サンプルをプロジェクト化してください。
※コンパイルエラーになる時は、Javaコンパイラの設定が17以上になっているかを確認してください。
Do the server start in the next step.

1. パッケージエクスプローラから「右クリック -> Import」で*Exsisting Project into Workspace*を選択して*Next*を押下
1. *Root folder:*にダウンロードした*ddd-java*ディレクトリを指定して*Build Model*を押下
1. *Project**ddd-java*を選択後、*Finish*を押下(依存ライブラリダウンロードがここで行われます)
1. Open VSCode "Run And Debug".
1. Choose `Run ddd-java`.
1. If console show "Started Application", start is completed in port 8080.
1. Run command `curl http://localhost:8080/actuator/health`

次の手順で本サンプルを実行してください。
#### Server Start (Console)

1. *Application.java*に対し「右クリック -> Run As -> Java Application」
1. *Console*タブに「Started Application」という文字列が出力されればポート8080で起動が完了
Run application from a console of Windows / Mac in Gradle.

### コンソール
It is necessary to do the following step.

Windows/Macのコンソールから実行するにはGradleのコンソールコマンドで行います。
※事前にJava17以上のインストールが必要です。
- Check Instablled JDK17+.

1. ダウンロードした*java-ddd*ディレクトリ直下へコンソールで移動
1. 「gradlew bootRun」を実行
1. コンソールに「Started Application」という文字列が出力されればポート8080で起動が完了
Do the server start in the next step.

1. You move to the cloned *ddd-java* directory.
1. Run command `gradlew bootRun`.
1. If console show "Started Application", start is completed in port 8080
1. Run command `curl http://localhost:8080/actuator/health`

### ブラウザ
### Check Use Case

STSまたはコンソールで8080ポートでサーバを立ち上げた後、ブラウザから下記URLへアクセスする事でRESTfulAPIの実行テストを実施可能です。
※本来なら情報更新系処理はPOSTで取り扱うべきですが、UIの無いデモ用にGETでのアクセスを許容しています。
※パラメタは?key=valueで繋げて渡してください。
After launching the server on port 8080, you can test execution of RESTful API by accessing the following URL from console.

顧客向けユースケース
#### Customer Use Case

- http://localhost:8080/asset/cio/withdraw
- 振込出金依頼 [accountId: sample, currency: JPY, absAmount: 出金依頼金額]
- http://localhost:8080/asset/cio/unprocessedOut
- 振込出金依頼未処理検索
- `curl -X POST -H "Content-Type: application/json" -d '{"accountId" : "sample" , "currency" : "JPY", "absAmount": 1000}' http://localhost:8080/asset/cio/withdraw`
- Request for withdrawal.
- `curl 'http://localhost:8080/asset/cio/unprocessedOut'`
- Search for outstanding withdrawal requests

社内向けユースケース
#### Internal Use Case

- http://localhost:8080/admin/asset/cio
- 振込入出金依頼検索 [updFromDay: 更新From(yyyyMMdd), updToDay: 更新To(yyyyMMdd)]
- `curl 'http://localhost:8080/admin/asset/cio?updFromDay=yyyy-MM-dd&updToDay=yyyy-MM-dd'`
- Search for deposit and withdrawal requests.
- Please set real date for upd\*Day

バッチ向けユースケース
#### Batch Use Case

- http://localhost:8080/system/job/daily/processDay
- 営業日を進める(単純日回しのみ)
- http://localhost:8080/system/job/daily/closingCashOut
- 当営業日の出金依頼を締める
- http://localhost:8080/system/job/daily/realizeCashflow
- 入出金キャッシュフローを実現する(受渡日に残高へ反映)
- `curl -X POST http://localhost:8080/system/job/daily/closingCashOut`
- Close the withdrawal request.
- `curl -X POST http://localhost:8080/system/job/daily/processDay`
- Set the business day to the next day.
- `curl -X POST http://localhost:8080/system/job/daily/realizeCashflow`
- Realize cash flow. (Reflected to the balance on the delivery date)

> Please execute according to the business day appropriately
## License
### License

本サンプルのライセンスはコード含めて全て*MIT License*です。
Spring Bootを用いたプロジェクト立ち上げ時のベース実装サンプルとして気軽にご利用ください。
The license of this sample includes a code and is all *MIT License*.
Use it as a base implementation at the time of the project start using Spring Boot.
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.1'
id 'org.springframework.boot' version '3.1.1'
id 'io.spring.dependency-management' version '1.1.0'
}

version = "3.0.1"
version = "3.1.1"

javadoc {
options.addBooleanOption('Xdoclint:none', true)
Expand Down Expand Up @@ -38,5 +38,5 @@ dependencies {
}

wrapper {
gradleVersion = "7.6"
gradleVersion = "8.1.1"
}
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
11 changes: 6 additions & 5 deletions gradlew
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,6 @@ done
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum

Expand Down Expand Up @@ -144,15 +141,15 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
# shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
# shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
Expand Down Expand Up @@ -197,6 +194,10 @@ if "$cygwin" || "$msys" ; then
done
fi


# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'

# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
Expand Down
Loading

0 comments on commit 8c14c75

Please sign in to comment.