設計規約 §1.1(2026-05-14 PR #135 で確定)の Spring Modulith feature-by-package + 各 feature 内クリーンアーキ 4 層ハイブリッド構成 の パッケージ雛形(package-info.java + shared Open module) を整える。
本 Issue は元 N4 (#86) の 5 項目を 4 分割した A-1 スコープ(2026-05-29 PR #269 が 52 files / +1085 / -177 まで肥大化したため分割):
A-2/B/C は別 Issue で順次着手(blocks/blocked-by 関係を設定)。
規約準拠の前提
| 規約 / ADR |
内容 |
| 設計規約 §1.1 |
外側 = feature-by-package(xyz.dgz48.tasks.webapi.<feature>、Spring Modulith)。内側 = 各 feature 内に domain / usecase / adapter.{web,persistence,external} / infra の 4 層 |
| ADR-0002 |
ArchUnit 採用は当面保留。依存方向検証は Spring Modulith ApplicationModules.verify() に集約 |
| ADR-0003 |
shared は Open module(@ApplicationModule(type = Type.OPEN))、@NamedInterface 不要 |
やること
1. 既存 4 feature 配下に 4 層パッケージ + package-info.java を配置
security / task / tenant / user の各 feature 配下に以下を配置:
xyz.dgz48.tasks.webapi.<feature>/
├─ domain/ POJO、Spring 非依存、JPA アノテーション禁止
├─ usecase/ ユースケース・Port 定義・@Transactional 境界
├─ adapter/
│ ├─ web/ REST Controller
│ └─ persistence/ JPA Entity・Repository
各パッケージに @NullMarked 付き package-info.java を配置(既存 task/domain/package-info.java と同形式)。
A-1 段階の調整:
adapter.external / infra は本 Issue では作らない(必要 feature が出た Issue 着手時)
task/domain/package-info.java は main 既存、対象外
adapter 直下の親 adapter/package-info.java(@NullMarked)も配置
2. shared feature を Open module として新設(ADR-0003)
xyz.dgz48.tasks.webapi.shared/package-info.java:
@NullMarked
@ApplicationModule(type = Type.OPEN)
package xyz.dgz48.tasks.webapi.shared;
import org.jspecify.annotations.NullMarked;
import org.springframework.modulith.ApplicationModule;
import org.springframework.modulith.ApplicationModule.Type;
A-1 では shared 直下の package-info.java のみ。shared/exception/ などのサブパッケージ + DomainException 等は B (#273) で同梱。
3. ModularityTests.verify() が green を維持
既存 webapi/src/test/java/xyz/dgz48/tasks/webapi/ModularityTests.java を維持。A-1 でパッケージ構造を整えた後も ApplicationModules.verify() が CI で green であること。
やらないこと(A-1 では対象外)
受け入れ条件
参照
設計規約 §1.1(2026-05-14 PR #135 で確定)の Spring Modulith feature-by-package + 各 feature 内クリーンアーキ 4 層ハイブリッド構成 の パッケージ雛形(
package-info.java+sharedOpen module) を整える。本 Issue は元 N4 (#86) の 5 項目を 4 分割した A-1 スコープ(2026-05-29 PR #269 が 52 files / +1085 / -177 まで肥大化したため分割):
package-info.java配置 +shared新設(既存クラス無変更)GET /api/tasks/{id}の 4 層実証 + DB マイグレーション + 共通例外基底docs/dev/feature-template.md整備A-2/B/C は別 Issue で順次着手(blocks/blocked-by 関係を設定)。
規約準拠の前提
xyz.dgz48.tasks.webapi.<feature>、Spring Modulith)。内側 = 各 feature 内にdomain/usecase/adapter.{web,persistence,external}/infraの 4 層ApplicationModules.verify()に集約sharedは Open module(@ApplicationModule(type = Type.OPEN))、@NamedInterface不要やること
1. 既存 4 feature 配下に 4 層パッケージ +
package-info.javaを配置security/task/tenant/userの各 feature 配下に以下を配置:各パッケージに
@NullMarked付きpackage-info.javaを配置(既存task/domain/package-info.javaと同形式)。A-1 段階の調整:
adapter.external/infraは本 Issue では作らない(必要 feature が出た Issue 着手時)task/domain/package-info.javaは main 既存、対象外adapter直下の親adapter/package-info.java(@NullMarked)も配置2.
sharedfeature を Open module として新設(ADR-0003)xyz.dgz48.tasks.webapi.shared/package-info.java:A-1 では shared 直下の package-info.java のみ。
shared/exception/などのサブパッケージ +DomainException等は B (#273) で同梱。3.
ModularityTests.verify()が green を維持既存
webapi/src/test/java/xyz/dgz48/tasks/webapi/ModularityTests.javaを維持。A-1 でパッケージ構造を整えた後もApplicationModules.verify()が CI で green であること。やらないこと(A-1 では対象外)
task/usecase/GetTaskUseCase.java等の新規 UseCase 実装 → B (backend: 基盤(shared/exception + Task POJO/JPA Entity 分離 + Repository ポート) (N4 / B-1) #273)tasksテーブル列追加等) → B (backend: 基盤(shared/exception + Task POJO/JPA Entity 分離 + Repository ポート) (N4 / B-1) #273) または N8 (docs(spec)+impl: 既存usersテーブル記述補正 + ADR-0006 派生スコープ(users 列追加 + JPA + 匿名化 service)(N8) #90)docs/dev/feature-template.md整備 → C (docs(dev): 新 feature 追加時のテンプレ手順書 docs/dev/feature-template.md 整備 (N4 / C) #274)shared/exception/DomainException.java共通例外基底 → B (backend: 基盤(shared/exception + Task POJO/JPA Entity 分離 + Repository ポート) (N4 / B-1) #273)domain/usecase/adapter/infrastructureパッケージ作成 → 設計規約 §1.1 違反受け入れ条件
security/task/tenant/userの各 feature 配下にdomain/usecase/adapter/adapter/web/adapter/persistenceパッケージ +@NullMarked付きpackage-info.java配置(task/domainは既存スキップ)sharedfeature 新設、shared/package-info.javaに@ApplicationModule(type = Type.OPEN)設定済task/Task.java/task/TaskController.java/task/TaskRepository.java等)は移動・変更されていない(A-1 範囲外)ApplicationModules.verify()が CI で greenwebapi/build.gradleにarchunit-*依存が無い)参照
docs/reviews/2026-05-10-scaffold-vs-design-gap-analysis.md§G-5(2026-05-25 docs(reviews): 2026-05-10 gap analysis に規約成立後の方針更新ディスクレーマ追記 #249 でディスクレーマ追記済)docs/specs/設計規約.md§1.1 ハイブリッド構成 / §1.5 shared モジュールdocs/adr/0002-defer-archunit-adoption.md/docs/adr/0003-shared-package-as-open-module.md