🐕
Next.js 15プロジェクト向けDDD AIコーディングルール設定ガイド
Next.js 15プロジェクト向けDDD AIコーディングルール設定ガイド
はじめに
Next.js 15の新機能や変化点(@next/codemod、Async Request APIによる非同期データ取得、fetchやRoute Handlerのキャッシュ非デフォルト化など)を踏まえ、AIエージェントにドメイン駆動設計(DDD)を理解させることで、より高品質なコードを自動生成できます。本記事では、プロのプログラマの観点からNext.js 15プロジェクトに適したDDDルールの設定方法と実践手順を解説します。
Next.js 15のポイントとDDDの必要性
Next.js 15では、@next/codemodによるアップグレード自動化やAsync Request APIなど多くの新機能が追加され、React 19対応やServer Actionsの強化など開発体験が向上しました。しかし、機能が増えるほど設計が複雑になりやすく、ビジネスロジックとUIロジックが混在すると保守性が低下します。DDDを採用することで、エンティティ・ドメインサービス・リポジトリといった概念に沿って責務を分離し、コードベースを健全に保つことができます。
AIエージェントに教えるべきルールのポイント
AIがNext.js 15プロジェクト向けにコード生成する際に考慮すべきポイントをまとめました。
-
ディレクトリ構成と責務分離:
src/appやsrc/domains等の各フォルダの役割を明確にし、どこにどのコードを置くべきかを指定します。 - エンティティとバリューオブジェクト: 一意性や不変性の概念を定義し、ビジネスルールをドメイン層に集約します。
- 集約とドメインサービス: 複数エンティティに跨る整合性や横断的なビジネスロジックを適切に配置します。
- リポジトリと非同期処理: インフラ層での実装とインターフェイスの分離、Async Request APIを用いた非同期I/Oとキャッシュの扱いを明示します。
- アプリケーションサービス: ユースケースごとのオーケストレーションとエラーハンドリング。
- Next.js 15固有の機能: キャッシュセマンティクス変更やReact 19、Server Actions、Streamingなどの新機能に合わせてコード生成するよう教えます。
実践手順
- 共通ルールファイルの作成: 下記のようなYAML形式でプロジェクト構造、DDD概念、Next.js 15の機能を定義します。各用語には意味と例示を付け、AIが誤解なく理解できるようにします。
- AIツールへの読み込み: YAMLファイルをAIエージェントのプロンプトや設定ファイルとして読み込み、生成前に基準を伝えます。
- サンプル生成とレビュー: AIが生成したコードがルールに沿っているか確認し、必要に応じてルールを追加・修正します。
- 継続的な改善: Next.jsのアップデートやチームのフィードバックに合わせてルールファイルを更新します。
コピペで使える共通ルールファイル(定義と例付き)
以下は、Next.js 15 + DDDプロジェクト向けにAIエージェントへ与えるルールファイルの例です。各項目の意味と具体例を併記しています。プロジェクトに応じて編集して利用してください。
# ai_rules_nextjs15_ddd.yaml
meta:
version: 1.1
description: "Next.js 15 + DDD プロジェクト向けAIコーディングガイドライン(用語定義付き)"
rules:
project_structure:
description: "プロジェクト構造"
guidelines:
- term: "src/app/"
meaning: "Next.js の App Router 用ディレクトリ。各サブフォルダがルートに対応し、page.tsx がページエントリポイントです。"
example: "例: src/app/dashboard/page.tsx は /dashboard ページを表します。"
- term: "src/app/api/"
meaning: "API ルート用ディレクトリ。Server Actions や REST/GraphQL エンドポイントを定義するサーバーレス関数を配置します。"
example: "例: src/app/api/users/route.ts でユーザー一覧を返すエンドポイントを実装します。"
- term: "src/middleware.ts"
meaning: "全リクエストに対する共通処理を記述するミドルウェアファイル。認証やアクセス制御などを実装します。"
example: "例: 未ログインユーザーを /login にリダイレクトするミドルウェアを定義します。"
- term: "src/ui/components/"
meaning: "見た目のみを担当する再利用可能なプレゼンテーションコンポーネントや UI ライブラリ部品を配置します。"
example: "例: Button.tsx や Header.tsx などの共通 UI 部品。"
- term: "src/ui/layouts/"
meaning: "ヘッダーやフッターなど、ページ全体の枠組みを提供するレイアウトコンポーネントをまとめます。"
example: "例: DefaultLayout.tsx が共通レイアウトを提供し、各ルートの layout.tsx から利用します。"
- term: "src/ui/lib/"
meaning: "UI 関連のヘルパー関数やカスタムフックを置く場所です。"
example: "例: useMediaQuery.ts などのカスタムフック。"
- term: "src/domains/"
meaning: "ビジネスドメインのエンティティ、値オブジェクト、ドメインサービスを配置するディレクトリです。"
example: "例: User.ts(エンティティ)、EmailAddress.ts(値オブジェクト)、UserService.ts(ドメインサービス)。"
- term: "src/application/"
meaning: "ユースケースやアプリケーションサービスを定義し、ドメインオブジェクトを組み合わせてビジネスロジックを実装する層です。"
example: "例: CreateUserService.ts でユーザー登録ユースケースの処理をまとめます。"
- term: "src/infrastructure/"
meaning: "リポジトリ実装や外部 API との接続、データ永続化などを担当するインフラ層のコードを配置します。"
example: "例: UserRepositoryPrisma.ts で Prisma を用いた DB 操作を実装します。"
- term: "src/lib/"
meaning: "ドメインに依存しない共通ユーティリティやヘルパー関数を置く場所です。"
example: "例: dateUtils.ts、stringHelpers.ts など。"
- term: "src/styles/"
meaning: "グローバル CSS やテーマ設定をまとめるディレクトリです。"
example: "例: globals.css で Tailwind 設定や CSS 変数を定義します。"
entity_and_value_object:
description: "エンティティとバリューオブジェクト"
meaning: "エンティティは一意の ID とライフサイクルを持つオブジェクトであり、バリューオブジェクトは属性の集合として不変です。"
examples:
- "エンティティ例: User は id・name・email を持ち、ID で識別されます。"
- "バリューオブジェクト例: EmailAddress はメールの正規表現検証を行う不変オブジェクトです。"
guidelines:
- "エンティティには ID やライフサイクルを持たせ、バリューオブジェクトは不変にします。"
- "ドメインロジックは可能な限りエンティティやバリューオブジェクトに閉じ込めます。"
aggregates_services:
description: "集約とドメインサービス"
meaning: "集約は複数のエンティティや値オブジェクトを一貫した単位としてまとめ、集約ルートを通じて操作します。ドメインサービスは複数エンティティにまたがる横断的なビジネスロジックを提供します。"
examples:
- "集約例: Order 集約は Order エンティティをルートとし、その子として OrderItem 値オブジェクトを持ちます。"
- "ドメインサービス例: PaymentService は複数集約をまたいで支払い処理を行います。"
guidelines:
- "関連エンティティを集約し、一貫性を保つために集約ルートを通じて操作します。"
- "エンティティ間の協調や横断的なビジネスロジックはドメインサービスに実装します。"
repository:
description: "リポジトリ"
meaning: "エンティティの永続化を抽象化するインターフェースであり、ドメイン層からデータストアの詳細を隠します。"
examples:
- "UserRepository インターフェースを定義し、Prisma 用や MongoDB 用など複数の実装を作成できます。"
guidelines:
- "リポジトリはインターフェースのみをドメイン層に置き、実装はインフラ層に持たせます。"
- "非同期 I/O には Next.js 15 の Async Request API を使用し、キャッシュや revalidate の設定を適切に行います。"
application_service:
description: "アプリケーションサービス"
meaning: "ユースケースのオーケストレーションを担当し、ドメインオブジェクトとインフラ操作を調整するサービスです。"
examples:
- "CreateOrderService が OrderRepository と PaymentService を組み合わせて注文作成ユースケースを完了させます。"
guidelines:
- "ユースケースごとにサービスを設計し、ドメインオブジェクトを操作して結果を返します。"
- "トランザクションや認可、エラーハンドリングなどアプリケーション層の責務を実装します。"
nextjs_features:
description: "Next.js 15 の新機能"
meaning: "Next.js 15 で追加・変更された主要な API やツール。"
examples:
- "@next/codemod: Next.js と React のバージョンアップを自動化する CLI"
- "Async Request API: fetch や Route Handler のキャッシュがデフォルトで無効になるため、revalidate オプションを明示的に指定する必要がある"
- "React 19 & Server Actions: ストリーミングやサーバー処理を強化する次世代機能"
guidelines:
- "@next/codemod を用いて自動アップグレードを適用し、最新の React や Next.js API に対応させます。"
- "Async Request API で非同期データ取得を行い、キャッシュの無効化に対応するため revalidate を指定します。"
- "React 19 や Server Actions、Streaming など Next.js 15 の強化機能に合わせてコードを生成します。"
終わり。
Discussion