Open10
[Wip]DDDのメモ
題材
仮想で作成した求人応募・募集を題材に、ドメイン駆動設計で理解した(できていない)ところを残していく。
SpringBootとKotlinについても、同様に記録していく
環境
- SpringBoot (Kotlin)
- 2.5.2
- JVM Target
- 11
ドメインモデル
- ドメイン
- アプリケーションが対象とする業務活動全体
- ドメインモデル
- ドメインの問題を解決するモデル
- 業務データと業務ロジックを1つにまとめてある
境界づけられたコンテキスト
- 特定のモデルを定義・適用する境界を明示的に示したもの
- 例えば、商品は扱う部署によって定義が異なる
- 販売部: 商品
- 商品名、売値、在庫数
- 配送部: 商品
- 商品名、配送先、配送状況
- 販売部: 商品
- 例えば、商品は扱う部署によって定義が異なる
- システムが大規模になるほど、関係者全てで統一したモデルを作ることは難しくなる
- 境界づけられたコンテキストは言語的な境界となる
ユビキタス言語
- 認識の齟齬や翻訳にコストをかけないための共通言語
- 開発者間だけで通じる言葉とかは使わない
- 会話・ドキュメント・コード全てにユビキタス言語は現れる
モデル一覧みたいなのは定義したが、「ユーザ登録」みたいなユースケースも同じドキュメントで管理するのだろうか?
ドメインモデル図
- 簡易化したクラス図のようなもの
- オブジェクトの代表的な属性を描くがメソッドまで書かない
- ルール・制約を吹き出しに書き出す
- オブジェクト同士の関連を示す
- 多重度
- 集約の範囲を定義する
- 複数人で議論しながら、意見をモデルに反映させていく
今回は勉強用なので、特に議論とかはできないが、wipで作成
ユースケース図
- ユーザの要求に対するシスtめうの振る舞いを定義する
- 本来はドメインモデル図の前に作成した方が良かった
- ユースケースが具体化されtないと、モデルが解決するべき問題が明確にならない
アーキテクチャ
参考にした記事
- https://qiita.com/cocoa-maemae/items/e3f2eabbe0877c2af8d0
- https://qiita.com/little_hand_s/items/ebb4284afeea0e8cc752
- https://little-hands.hatenablog.com/entry/2018/12/10/ddd-architecture
SpringbootのDIコンテナも利用できるので、オニオンアーキテクチャをベースに実装していく
- モノレポを想定して、ルートのパッケージをきることにした
- 重複が発生してしまうが、後からリポジトリを分離できるようにするので、許容する
-
config
配下だけ、共通利用になる- beanなどを配置
調べる必要あり
- mybatis Generatorで生成するファイル群を、複数パッケージに配置する方法はあるのだろうか・・
- infraを共通利用にした方がいいかと思ったが、1クラスが肥大化しそう・・・
src/main/kotlin/com/tokorogadokkoi/kotlin/joboffer/
├── JobOfferApplication.kt
├── auth
│ ├── application
│ ├── domain
│ ├── infra
│ └── presentation
├── config
│ └── mybatis
└── infra
Mybatisの主要コンポーネント
-
org.apache.ibatis.session.SqlSession
- SQLの発行やトランザクション制御のAPIを提供するコンポーネント
-
org.apache.ibatis.session.SqlSessionFactory
- SqlSessionを生成するためのコンポーネント
-
org.apache.ibatis.session.SqlSessionFactoryBuilder
- Mybatisの設定ファイルを読み込み、SqlSessionFactoryを生成するためのコンポーネント
Mybatis-Springの主要コンポーネント
-
org.mybatis.spring.SqlSessionFactoryBean
- SqlSessionFactoryを構築し、DIコンテナ上にオブジェクトを登録するコンポーネント
-
org.mybatis.spring.SqlSessionTemplate
- Springのトランザクション管理下で、MyBatisのSqlSessionを扱うためのコンポーネント
- SqlSessionとしての振る舞いも提供する
-
org.mybatis.spring.mapper.MapperFactoryBean
- MapperオブジェクトをBeanとして生成するためのコンポーネント
調査必要そう
- mybatisで、中間テーブルを経由した
1:N
を取得する際のMapperをどう記載するか - N+1が発生しそうな感じがする
XMLで記述するのが無難?