Quarkus BCE バックエンドワークフロー
スコープとディレクトリ境界
- 厳格な境界:
backend/内でのみ操作します。frontend/のファイルには決して触れません。 - アーキテクチャ: 厳格なAdam Bien BCEパターン(
com.app.<ドメイン>.{boundary, control, entity})。 - テクノロジースタック: Quarkus、Jakarta EE(
jakarta.*のみ—javax.*やorg.springframework.*は絶対に使用しません)。
2フェーズ実行ゲート
フェーズ 1: 契約と骨子(人間によるレビューのために一時停止)
entity:..<ドメイン>.entity内に、不変のJavarecordペイロード(@NotNull、@NotBlank、@Schemaを付与)とJPA/Panacheエンティティを作成/更新します。controlやboundaryへの依存関係はゼロです。boundary:..<ドメイン>.boundary内に、JAX-RS@Pathリソースのシグネチャ(@Transactional、@RolesAllowed、@Operation)を作成/更新します。- テスト:
backend/src/test/java/..<ドメイン>/boundary/内に、失敗するJUnit@QuarkusTestまたは単体テストスタブを作成/更新します。 - 一時停止:
entity、boundary、テストの差分をユーザーに表示します。controlの実装を書く前に承認を待ちます。
フェーズ 2: 実装とスキーマのエクスポート
control:..<ドメイン>.control内にビジネスロジックを実装します(@ApplicationScoped)。他のドメインのcontrolを直接呼び出さず、常にそのboundaryを経由します。- 検証と契約のエクスポート:
backend/内で以下を実行します。./mvnw test
Java 25 LTS 言語およびJVMルール(必須)
Java 25 LTS のみを対象とします(<maven.compiler.release>25</maven.compiler.release>)。レガシーなJava 8/11/17のボイラープレートは絶対に記述しません。
- 網羅的Switchとレコード分解(
controlおよびentity):- ドメインの結果とステートマシンを、
entity内でsealed interface+record実装を使用してモデル化します。 control内では、網羅的なswitch式と、レコードパターン分解およびガード付きwhen句(例:case PaidOrder(var id, var total) when total > 1000 -> ...)を使用して処理します。sealed interfaceのスイッチにはdefaultブランチを絶対に含めないでください。これにより、新しい状態が追加されたときにJava 25コンパイラが網羅性を強制します。
- ドメインの結果とステートマシンを、
- 柔軟なコンストラクタ本体(JEP 513):
- 膨大な静的ヘルパーメソッドを作成する代わりに、
super(...)やthis(...)を呼び出す前に、コンストラクタ内で直接フェイルファスト検証とデータ正規化を実行します。
- 膨大な静的ヘルパーメソッドを作成する代わりに、
- 未使用変数(
_):- 未使用のラムダパラメータ、無視される例外変数、または未使用の分解されたレコードコンポーネントには常に
_を使用します(例:case Order(var id, _, _))。
- 未使用のラムダパラメータ、無視される例外変数、または未使用の分解されたレコードコンポーネントには常に
- 仮想スレッドとスコープ値(JEP 506):
- Quarkus
boundary内のブロッキングI/Oエンドポイントでは、ストリーミングが必要でない限り、リアクティブなUni<T>チェーンよりも@RunOnVirtualThreadを優先します。 ThreadLocalは決して使用せず、スレッドスコープ内でコンテキスト状態を渡す必要がある場合は、常にJava 25のScopedValue<T>を使用します。
- Quarkus
- モダンなコレクションとストリームギャザラー(JEP 485):
- インデックス計算
list.get(list.size() - 1)の代わりにSequencedCollectionのメソッド(.getFirst()、.getLast()、.reversed())を使用します。 - 手動チャンキングループの代わりに
Stream.gather(Gatherers.windowFixed(...))を使用します。
- インデックス計算
- プレビューフラグは要求がない限り使用しない:
- 確定したJava 25 LTS機能に限定します(明示的に要求されない限り、JEP 507のプリミティブパターンやJEP 505の構造化並行性のために
--enable-previewを有効にしないでください)。
- 確定したJava 25 LTS機能に限定します(明示的に要求されない限り、JEP 507のプリミティブパターンやJEP 505の構造化並行性のために