Skip to content

backend: feature 内クリーンアーキ 4 層パッケージ雛形 + shared Open module 新設 (N4 / A-1) #86

Description

@win2cot

設計規約 §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 sharedOpen 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 では対象外)

受け入れ条件

  • security / task / tenant / user の各 feature 配下に domain / usecase / adapter / adapter/web / adapter/persistence パッケージ + @NullMarked 付き package-info.java 配置(task/domain は既存スキップ)
  • shared feature 新設、shared/package-info.java@ApplicationModule(type = Type.OPEN) 設定済
  • 既存クラス(task/Task.java / task/TaskController.java / task/TaskRepository.java 等)は移動・変更されていない(A-1 範囲外)
  • ApplicationModules.verify() が CI で green
  • ArchUnit を導入していない(webapi/build.gradlearchunit-* 依存が無い)
  • CI green、UT カバレッジ 80%+

参照

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/backendJava / Spring バックエンド実装変更claude:ready実装着手 OK のサイン。人が付与すると実装 Claude が起動priority/p1High。現スプリント内で完了必須

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions