『ドメイン駆動設計入門』のコードを SpringBoot x Java で実装する
目標
以下の記事で作成した Laravel x PHP のコードを SpringBoot x Java で実装し直す。
Layered Architecture については、以下の記事を参考にする。
やりたいこと
- 以前作成したコードを Spring x Java で実装し直す
- Layered Architecture での実装
- 今後、 Port & Adapter や Clean でも実装してみたい
Code
anfangd/java-springboot-ddd-sample
Step
- Spring Initializer でベースプロジェクトの作成
- InteliJ IDEA にコードの取り込み
- InteliJ IDEA の関連プラグインの導入
- 参考リンクを元に実装し直す
Software Versions
- OS: macOS Big Sur 11.1
- IDE: InteliJ IDEA 2020.3.2 ( Community Edition )
- WAF: Spring Boot
- Java:
Index
DDD 関連リンク
Books
Reference
Microsoft Word - pdf version of final doc - Mar 2015.docx
実装サンプル
VaughnVernon/IDDD_Samples: These are the sample Bounded Contexts from the book "Implementing Domain-Driven Design" by Vaughn Vernon: http://vaughnvernon.co/?page_id=168
citerus/dddsample-core: This is the new home of the original DDD Sample app (previously hosted at sf.net)..
参考記事
「実践ドメイン駆動設計」を読んだので、実際にDDDで設計して作ってみた! - Qiita
コードで学ぶドメイン駆動設計入門 〜エンティティとバリューオブジェクト編〜 - かとじゅんの技術日誌
主要な概念・方針のメモ
Package 構成
Layered Architecture の採用にあたり、以下の Package 構成にする予定
.
├── java
│ └── com
│ └── example
│ └── demo
│ ├── DemoApplication.java
│ ├── userinterface # Layer: UserInterface
│ │ ├── batch
│ │ └── http
│ │ ├── api
│ │ │ └── controllers
│ │ └── page
│ │ └── controllers
│ ├── application # Layer: Application
│ ├── domain # Layer: Domain
│ │ ├── patterninterfaces
│ │ │ ├── ValueObject.java
│ │ │ └── Entity.java
│ │ ├── exceptions
│ │ │ └── ArgumentNullException.java
│ │ └── models
│ │ └── user
│ └── infrastructure # Layer: Infrastructure
│ ├── hibernate
│ └── mybatis
└── resources
├── application.properties
├── static
└── templates
Layered Architecture の構成は下図を参照にする。
ドメイン駆動設計の共通概念をまとめるパッケージについて
Layered Architecture の実装サンプル。
IDDD本のサンプルコード。Port&Adapterによる実装。
JavaにおけるequalsとhashCodeを理解する - Qiita
Assertion Library
- JUnit
- Hamcrest
- AssertJ
- Truth
JUnitのアサーションライブラリHamcrest,AssertJ比較 - Qiita
JpaRepository
Issue
- どうやったら、JpaRepository のメソッドをカスタム出来る?
memo
java - How to add custom method to Spring Data JPA - Stack Overflow
[Spring Boot] JPAでデータベースに接続 | Developers.IO
Spring Data JPA - Reference Documentation
5.2. データベースアクセス(JPA編) — TERASOLUNA Global Framework Development Guideline
JPA(Java Persistence API)は、リレーショナルデータベースで管理されているレコードを、Javaオブジェクトにマッピングする方法と、 マッピングされたJavaオブジェクトに対して行われた操作を、リレーショナルデータベースのレコードに反映するための仕組みをJavaのAPI仕様として定義したものである。
1.0.0.publicreview documentation
カスタムすると面倒なので、 RepositoryService クラスを作ってそこでうまいことやる
Spring Boot の application.properties と application.yaml
Spring Boot は、アプリケーションの起動時に、次の場所から application.properties ファイルと application.yaml ファイルを自動的に検索してロードします。
DTO とエンティティのマッピング
DDDの文脈の Entity と DBアクセス文脈の Entity の値を変換する方法を整理する。
特に、DBから値を取得したあとに、 DDD の文脈の Entity に詰め替える方法について整理する。
Mapping Library
- FasterXML ObjectMapper
- ModelMapper
- MapStruct
- Dozer
JPA と Entity
java - @UniqueConstraint and @Column(unique = true) in hibernate annotation - Stack Overflow
UnitTest
Spring Bootとユニットテスト環境の設計について - Qiita
DAO またはリポジトリインターフェースをスタブまたはモックすることにより、単体テストの実行中に永続データにアクセスする必要なく、サービスレイヤーオブジェクトをテストできます。
Spring テスト - リファレンスドキュメント
@DataJpaTest
@DataJpaTestでRepositoryのテスト|りょ|note
マルチモジュール構成でアプリケーション実装したい
Spring Bootアプリケーションをmavenのmulti moduleで構成する - Qiita
Springプロジェクトをマルチモジュールで構成する方法(Maven編) | Casual Developers Note
Spring Boot マルチモジュールプロジェクトの作成 - 公式サンプルコード
Mavenプロジェクトをモジュール化する | Java好き
(16) What are advantages/disadvantages of creating multi-module projects with Spring Boot + Maven/Gradle? - Quora
Before we get into more details, let’s try to answer a simple question “What are the benefits of multi-module projects in Spring Boot“?. Here are some benefits of multi-module project with Spring Boot:
Provide the ability to build all module with a single command. Run the build command from parent module.
Build system take care of the build order.
Make it easy and flexible to deploy the application.
You can re-use the code from the modules across different projects.
Multi-Module Project With Spring Boot | Java Development Journal