Open34

『ドメイン駆動設計入門』のコードを SpringBoot x Java で実装する

anfangdanfangd

目標

以下の記事で作成した Laravel x PHP のコードを SpringBoot x Java で実装し直す。

https://qiita.com/anfangd/items/fea7735a9c81983b5426

Layered Architecture については、以下の記事を参考にする。

https://qiita.com/anfangd/items/85409cfae73c45eaaf16#レイヤードアーキテクチャ--layered-architecture

やりたいこと

  1. 以前作成したコードを Spring x Java で実装し直す
  2. Layered Architecture での実装
  3. 今後、 Port & Adapter や Clean でも実装してみたい

Code

anfangd/java-springboot-ddd-sample
https://github.com/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

anfangdanfangd

DDD 関連リンク

Books

https://amzn.to/3j7AV4v

https://amzn.to/2YyNKLC

https://amzn.to/3tlsqYj

https://booth.pm/ja/items/1835632

Reference

Microsoft Word - pdf version of final doc - Mar 2015.docx
https://www.domainlanguage.com/wp-content/uploads/2016/05/DDD_Reference_2015-03.pdf

実装サンプル

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
https://github.com/VaughnVernon/IDDD_Samples

citerus/dddsample-core: This is the new home of the original DDD Sample app (previously hosted at sf.net)..
https://github.com/citerus/dddsample-core

参考記事

「実践ドメイン駆動設計」を読んだので、実際にDDDで設計して作ってみた! - Qiita
https://qiita.com/APPLE4869/items/d210ddc2cb1bfeea9338

コードで学ぶドメイン駆動設計入門 〜エンティティとバリューオブジェクト編〜 - かとじゅんの技術日誌
https://blog.j5ik2o.me/entry/20101228/1293551861

anfangdanfangd

主要な概念・方針のメモ

anfangdanfangd

Package 構成

Layered Architecture の採用にあたり、以下の Package 構成にする予定

PackageArchitrecture
.
├── 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 の構成は下図を参照にする。

anfangdanfangd

Assertion Library

  • JUnit
  • Hamcrest
  • AssertJ
  • Truth

JUnitのアサーションライブラリHamcrest,AssertJ比較 - Qiita
https://qiita.com/disc99/items/31fa7abb724f63602dc9

anfangdanfangd

(アサーションライブラリという概念自体を身近に感じたことなかった。)

anfangdanfangd

JpaRepository

Issue

  1. どうやったら、JpaRepository のメソッドをカスタム出来る?

memo

java - How to add custom method to Spring Data JPA - Stack Overflow
https://stackoverflow.com/questions/11880924/how-to-add-custom-method-to-spring-data-jpa

anfangdanfangd

5.2. データベースアクセス(JPA編) — TERASOLUNA Global Framework Development Guideline

JPA(Java Persistence API)は、リレーショナルデータベースで管理されているレコードを、Javaオブジェクトにマッピングする方法と、 マッピングされたJavaオブジェクトに対して行われた操作を、リレーショナルデータベースのレコードに反映するための仕組みをJavaのAPI仕様として定義したものである。

1.0.0.publicreview documentation
https://terasolunaorg.github.io/guideline/public_review/ArchitectureInDetail/DataAccessJpa.html

anfangdanfangd

カスタムすると面倒なので、 RepositoryService クラスを作ってそこでうまいことやる

anfangdanfangd

Spring Boot の application.properties と application.yaml

Spring Boot は、アプリケーションの起動時に、次の場所から application.properties ファイルと application.yaml ファイルを自動的に検索してロードします。

https://spring.pleiades.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config-files

anfangdanfangd

DTO とエンティティのマッピング

DDDの文脈の Entity と DBアクセス文脈の Entity の値を変換する方法を整理する。
特に、DBから値を取得したあとに、 DDD の文脈の Entity に詰め替える方法について整理する。

Mapping Library

  • FasterXML ObjectMapper
  • ModelMapper
  • MapStruct
  • Dozer
anfangdanfangd

UnitTest

Spring Bootとユニットテスト環境の設計について - Qiita
https://qiita.com/rubytomato@github/items/0baf1df5b3eb7094cc41

anfangdanfangd

マルチモジュール構成でアプリケーション実装したい

anfangdanfangd

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
https://www.javadevjournal.com/spring-boot/multi-module-project-with-spring-boot/