ありがとうございます。
ここからは第29段階:開発標準・コーディング規約・DDD(ドメイン駆動設計)を取り入れた最終アーキテクチャを設計します。
ここが完成すると、「設計書」から「開発プロジェクト標準」へ進化します。
私は、この教材管理システムはここまで設計してきた規模であれば、レイヤードアーキテクチャ + DDD Lite(軽量DDD) + CQRS(JPA + MyBatis) が最もバランスが良いと考えています。
第29段階の目標
ここでは「どう作るか」ではなく、「チーム全員が同じルールで開発できること」を目的にします。
1 2 3 4 5 6 7 8 9 10 11 | |
1. 採用アーキテクチャ
最終形は次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
役割を整理すると
| 層 | 責務 |
|---|---|
| Presentation | 画面・入力受付 |
| Application | ユースケース |
| Domain | 業務ルール |
| Infrastructure | DB・メール・R2 |
| Query | 一覧・検索・集計 |
2. Feature Package
最終版です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
各Featureは
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
なぜこの構成なのか
一般的な
1 2 3 4 5 6 7 | |
方式では、
数百クラスになると
1 2 3 4 5 6 7 8 9 10 11 | |
と探しにくくなります。
Feature Packageなら
1 2 3 4 5 | |
ので保守性が非常に高くなります。
3. ApplicationServiceの責務
ApplicationServiceは
ユースケース
だけを持ちます。
例
1 2 3 4 5 6 7 8 9 10 11 | |
ここには
SQL
HTML
画面
は書きません。
4. DomainServiceの責務
業務ルールです。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
これを
1 | |
へ置きます。
5. Repository
Repositoryは
JPAのみ。
禁止
1 2 3 4 | |
大量SQL。
Repositoryは
CRUDだけ。
良い例
1 2 3 4 5 6 7 | |
だけ。
6. MyBatis
Mapper担当
1 2 3 4 5 6 7 8 9 | |
例
1 2 3 4 5 6 7 | |
全部Mapper。
7. Entity
Entityは
DBだけではありません。
業務ルールも持ちます。
例えば
悪い例
1 2 3 | |
どこでも変更可能。
改善
1 | |
Entity
↓
1 2 3 4 5 6 7 8 9 10 11 | |
8. DTO
DTO種類
1 2 3 4 5 6 7 8 9 | |
分けます。
おすすめ命名
1 2 3 4 5 6 7 | |
9. Form
画面入力だけ。
1 | |
↓
Controller
↓
ApplicationService
↓
DTO変換
Entityへ直接渡さない。
10. Controller
Controllerは
本当に薄くします。
1 2 3 4 5 6 | |
程度。
禁止
1 2 3 4 5 6 7 | |
11. Transaction
@Transactional
ApplicationServiceだけ。
禁止
Repository
Controller
つまり
1 2 3 4 5 6 7 8 9 10 11 | |
12. Event駆動
作成
↓
Event
↓
Listener
↓
通知
↓
監査
↓
メール
ApplicationService
↓
1 | |
だけ。
13. Domain Event
例
1 | |
↓
通知
↓
監査
↓
メール
↓
検索Index更新
全部Listener。
14. Validation
Controller
↓
Form
↓
Validation
↓
ApplicationService
Serviceで
1 | |
禁止。
15. Exception
例外
1 2 3 4 5 6 7 8 9 | |
5種類程度。
16. Logging
INFO
1 2 3 4 5 | |
WARN
1 | |
ERROR
1 | |
DEBUG
SQL
17. Mapper命名
おすすめ
1 2 3 4 5 | |
Queryを付けます。
Repositoryとの差が明確になります。
18. Service命名
おすすめ
1 2 3 4 5 6 7 | |
巨大Serviceを防げます。
19. Package依存
禁止
1 2 3 4 5 6 7 8 9 10 11 | |
必ず
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
一方向。
20. 命名規約
Entity
1 | |
Table
1 | |
Repository
1 | |
Mapper
1 | |
Controller
1 | |
DTO
1 | |
Form
1 | |
21. テスト戦略
テストの責務も明確に分けます。
| 対象 | テスト |
|---|---|
| Entity | 単体テスト(JUnit) |
| DomainService | 単体テスト |
| ApplicationService | 単体 + Mock |
| Repository | Testcontainers |
| Mapper | Testcontainers |
| Controller | MockMvc |
| 画面 | Selenium(必要なら) |
22. Git運用
ブランチ
1 2 3 4 5 6 7 8 9 | |
Commit
1 2 3 4 5 6 7 8 9 | |
23. レビュー基準
Pull Request
最低チェック
☑ SQL増えてない
☑ N+1ない
☑ Transaction適切
☑ Validationあり
☑ 例外処理あり
☑ Logあり
☑ Testあり
24. 完成形
ここまで設計すると
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
まで十分拡張できます。
第29段階終了時点
ここまでで完成したもの
-
✅ 要件定義
-
✅ ドメイン設計
-
✅ ER設計
-
✅ Entity設計
-
✅ JPA設計
-
✅ MyBatis設計
-
✅ 画面設計
-
✅ ワークフロー設計
-
✅ 動画・ファイル配信設計
-
✅ 学習管理設計
-
✅ 承認フロー設計
-
✅ 共通基盤設計
-
✅ 運用設計
-
✅ アーキテクチャ設計
-
✅ 開発標準・コーディング規約
次に進むことをおすすめするフェーズ
ここからは新たな設計段階ではなく、実装フェーズへ入ることをおすすめします。
私なら次の順番で実装を進めます。
-
プロジェクト基盤構築
-
Spring Boot
-
Spring Security
-
Flyway
-
JPA
-
MyBatis
-
共通基盤
-
-
認証・ユーザー管理
-
教材ライブラリ
-
コース・セクション・レッスン管理
-
受講機能
-
承認ワークフロー
-
ファイル・動画配信
-
管理画面・運用機能
この順序なら、各機能を段階的に動作確認しながら開発を進められ、途中で設計変更が必要になっても影響範囲を最小限に抑えられます。