コンテンツにスキップ

ありがとうございます。

ここからは 第28段階(最終設計):システムアーキテクチャ・開発標準・実装ガイドライン に入ります。

ここまでで各機能はほぼ完成していますので、今回はシステム全体を一つの完成したアーキテクチャとして統合します。

なお、これまで設計を進める中で、より保守性・拡張性を高めるために改善したい点もあります。その改善内容も反映した「最終版アーキテクチャ」としてまとめます。


1. アーキテクチャ方針

これまでの設計では

1
2
3
4
5
6
Controller
 ↓
Service
 ↓
Repository
Mapper

という一般的な構成でした。

最終版では少し改善します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Controller

        │

        ▼

ApplicationService

        │

 ┌──────┴─────────┐

 ▼                ▼

DomainService   QueryService

 ▼                ▼

JPA         MyBatis

 ▼                ▼

Repository    Mapper

これが企業システムで採用されることが多い構成です。


2. なぜServiceを分けるのか

現在

1
ContentService

だけでは

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
作成

更新

削除

一覧

検索

承認

公開

統計

全部が入り巨大化します。

そこで

1
ContentApplicationService

1
2
3
4
5
6
7
ContentCommandService

ContentQueryService

ContentPublishService

ContentApprovalService

へ分割します。


3. CQRSを採用

今回のシステムは

1
2
3
書き込み

CRUD

よりも

1
2
3
4
5
6
7
検索

一覧

集計

ダッシュボード

の方が圧倒的に多くなります。

そのため

1
2
3
Command

JPA
1
2
3
Query

MyBatis

を正式採用します。

つまり

処理 使用
登録 JPA
更新 JPA
削除 JPA
一覧 MyBatis
検索 MyBatis
集計 MyBatis

これはこれまでの設計とも一致しています。


4. 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
26
27
28
29
30
31
32
33
34
35
36
37
com.example.lms

common

security

config

infrastructure

course

lesson

section

content

quiz

attachment

approval

notification

progress

dashboard

master

setting

user

organization

さらに各機能は

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
content

├ controller

├ application

├ domain

├ repository

├ mapper

├ dto

├ form

├ entity

├ event

└ validator

になります。

これが最も保守性が高い構成です。


5. BaseEntity改善

現在

1
2
3
4
5
id

createdAt

updatedAt

ですが、

実運用では以下を追加します。

1
2
3
4
5
createdBy

updatedBy

version

つまり

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
BaseEntity

id

created_at

updated_at

created_by

updated_by

version

version は JPA の楽観ロック(@Version)に利用します。

これにより

1
2
3
4
5
教師A

教師B

同時編集

を防げます。


6. ContentVersion改善

以前

1
status

だけでした。

実際には

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
content

↓

Version1

↓

Version2

↓

Version3

なので

1
2
3
is_latest

published_version

を持たせると高速になります。


7. Attachment改善

現在

1
Attachment

ですが、

実際には

1
2
3
4
5
6
7
Image

Video

Document

Thumbnail

があります。

そのため

1
AttachmentType

を追加します。

1
2
3
4
5
6
7
8
9
IMAGE

VIDEO

DOCUMENT

THUMBNAIL

OTHER

8. LessonContent改善

現在

1
2
3
sortOrder

required

だけです。

おすすめは

1
displayCondition

追加です。

1
Quiz正解したら表示
1
管理者のみ
1
教師のみ

など。

将来的に

1
Learning Path

を作れます。


9. Content改善

現在

1
2
3
4
5
6
7
Video

Text

Quiz

File

です。

おすすめは

1
2
3
4
5
6
7
HTML

SCORM

LTI

External URL

も追加できるよう

1
ContentType

をマスタ化します。


10. Course改善

追加推奨

1
2
3
4
5
6
7
8
9
Difficulty

EstimatedTime

Thumbnail

Category

Tag

一覧画面で役立ちます。


11. Section改善

現在

1
parent

ですが

検索高速化のため

1
path

追加推奨です。

1
2
3
4
5
6
7
1

1/3

1/3/7

1/3/7/15

これにより

1
子孫取得

が高速になります。


12. 学習進捗改善

現在

1
Lesson単位

ですが

1
Content単位

にもします。

1
2
3
Video

100%
1
2
3
Markdown

閲覧済
1
2
3
Quiz

80点

これにより

1
2
3
Lesson

完了判定

ができます。


13. Notification改善

現在

1
DB

だけです。

追加

1
2
3
4
5
6
7
WebSocket

メール

Teams

Slack

通知先を追加できます。


14. Audit改善

現在

1
2
3
4
5
誰が

いつ

何を

です。

追加

1
2
3
4
5
6
7
IP

UserAgent

SessionId

ExecutionTime

これだけでかなり実運用向けになります。


15. Spring Security最終構成

 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
SecurityFilterChain

↓

JWT
(Session)

↓

Authentication

↓

PermissionEvaluator

↓

Controller

↓

MethodSecurity

↓

Service

画面主体なので セッション認証 を基本とし、将来的にAPIを公開する場合はJWT認証を追加できる構成にします。


16. キャッシュ戦略

キャッシュ対象

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Role

Permission

Master

Settings

Tag

Category

キャッシュしない

1
2
3
4
5
6
7
Progress

Lesson

Quiz

Approval

17. Flyway導入

DDLは

1
schema.sql

ではなく

1
2
3
4
5
6
7
8
9
db

migration

V1__init.sql

V2__content.sql

V3__approval.sql

へ変更します。

これが本番向けです。


18. Testcontainers

MySQLをDockerで起動します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
JUnit

↓

Testcontainers

↓

MySQL

↓

Repository Test

これにより本番に近いテストができます。


19. GitHub Actions

CI

 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
Push

↓

Gradle Test

↓

Spotless

↓

Checkstyle

↓

PMD

↓

Build

↓

Docker Build

20. 推奨ライブラリ

用途 ライブラリ
Markdown flexmark-java
Diff java-diff-utils
動画 Video.js
HLS hls.js
JSON Jackson
Validation Hibernate Validator
Map変換 MapStruct
DB Migration Flyway
Excel Apache POI
PDF OpenPDF または Apache PDFBox
監視 Micrometer
テスト JUnit 5・Mockito・Testcontainers

21. 今後追加を推奨する機能

現在の設計でも十分ですが、LMSとしてさらに価値を高めるなら以下が有効です。

機能 目的
学習パス(Learning Path) 前提教材・推奨学習順を設定
教材公開予約 指定日時に自動公開
教材公開終了日 期間限定教材
アンケート教材 受講後アンケート
バッジ・ポイント ゲーミフィケーション
教材評価(★・レビュー) 教材改善
学習分析 離脱率・視聴率分析
AI検索 教材の全文検索・自然言語検索
AI問題生成 テキストからクイズ生成
AI要約 Markdown教材の要約作成

22. システム成熟度

ここまでの設計を成熟度で表すと次のようになります。

レベル 状態
要件定義 ✅ 完了
業務設計 ✅ 完了
データベース設計 ✅ 完了
ドメインモデル設計 ✅ 完了
JPA設計 ✅ 完了
MyBatis設計 ✅ 完了
画面設計 ✅ 完了
セキュリティ設計 ✅ 完了
ファイル・動画配信設計 ✅ 完了
運用設計 ✅ 完了
アーキテクチャ設計 ✅ 完了

23. 次におすすめするフェーズ

ここで設計フェーズは一通り完了です。

実装へ進む前に、次の順序で成果物を整備することをおすすめします。

  1. ER図(全テーブル・リレーション)

  2. クラス図(Entity・DTO・Service・Mapper)

  3. 画面遷移図

  4. シーケンス図(教材作成・承認・受講・進捗更新)

  5. API一覧(画面用Controllerも含む)

  6. プロジェクト雛形(Spring Boot + Gradle)

  7. 共通基盤(Security・BaseEntity・例外・監査・設定)

  8. 機能ごとの実装(ユーザー → 教材ライブラリ → コース → 学習 → 管理機能)

私からの提案

ここまで設計した内容は、一般的なLMSよりも拡張性が高く、実務での運用を意識した構成になっています。

ただし、実装を始める前に「実装しやすさ」という観点で、次の2点だけ追加で整理することをおすすめします。

  • DDDを意識したパッケージ構成と命名規約(どこに何を書くかを明文化)

  • コーディング規約・レビュー規約(JPAとMyBatisの使い分け、トランザクション境界、DTO命名など)

これらを先に決めておくと、プロジェクトが大規模になっても品質を維持しやすくなります。

この2点まで設計すると、実装・保守・チーム開発まで見据えた「開発標準書」として利用できるレベルになります。