ドメイン駆動設計とクリーンアーキテクチャです。Backlog、BacklogItem、Task の3つの集約構造を目指します。
まずは ToDo アプリを作り、その後、バックログ管理アプリに成長させる予定です。
- Docker v28.1
- Docker Compose v2.35
| カテゴリ | 名前 | バージョン | 用途 |
|---|---|---|---|
| ランタイム | Bun | 1.2 | JavaScript/TypeScript ランタイム・パッケージマネージャー |
| フロントエンド | Next.js | 15.4 | React フレームワーク |
| TanStack Query | 5.84 | データフェッチ・キャッシュ管理 | |
| Tailwind CSS | 4 | CSS フレームワーク | |
| バックエンド | Hono | 4.9 | 軽量 Web フレームワーク |
| Drizzle ORM | 0.44 | TypeScript ORM | |
| Supabase | 2.44 | 認証・データベースサービス | |
| スキーマ | Zod | 4.1 | TypeScript スキーマ検証 |
| drizzle-zod | 0.8 | Drizzle と Zod の統合 | |
| @hono/zod-openapi | 1.1 | Hono + Zod + OpenAPI 統合 | |
| js-yaml | 4.1 | YAML パーサー・生成 | |
| 型安全性 | openapi-typescript | 7.10 | OpenAPI から TypeScript 型定義生成 |
| openapi-fetch | 0.15 | 型安全な API クライアント | |
| 開発ツール | TypeScript | 5 | 型安全性 |
| Biome | 2.1 | リンター・フォーマッター | |
| uuid | 11.1 | UUID 生成 |
クラスメソッド社の AI駆動開発支援フレームワーク tsumiki を前提とした AI 駆動開発と、ドメイン駆動設計 + クリーンアーキテクチャを中核に据えた開発。
- 開発効率を重視して Bun を採用。
- 本番環境は安定性を最優先に Node.js で運用した。
- CI では E2E を Playwright 公式コンテナを使って Node で回すことで、Bun 開発環境と本番環境の差異を事前に検知できるようにした。この戦略で、開発体験と本番安定性の両立を実現。
- コード自動生成を前提にしたためシンプルなユーティリティフレームワークである Tailwind CSS を優先。
- fetch API 準拠・軽量・高速で、AWS Lambda や Cloudflare Workers へそのままデプロイ可能、どちらにも公式対応している Hono を選択。
- バックエンドとフロントエンドともに TypeScript を採用、Zod ライブラリを導入し、スキーマ駆動開発と型安全性をもとに、AI に伝わりやすいコードを目指すことで、開発効率を向上。
- Prisma より薄い抽象で DDD の分離を阻害しにくく、Zod とも親和性の高い Drizzle を採用。
- 運用コスト削減だけでなく、Auth と RLS を統合しアプリ側の認可処理を最小化できるため Supabase を選んだ。
AI にコードを書かせることで「新しいことを学ぶきっかけが失われるのではないか?」という懸念があったが、むしろ知らないことを知ることができるいいきっかけが生まれた。 とくに実装の説明をおこなわせるカスタムスラッシュコマンドを作成したことで、知らなかった技術を深く知ることができた。 semgrep や Single Source of Truth というキーワードを得ることができ、学びの幅が広がった。
仕様がコードレベルで固まりやすいドメイン駆動設計に対して、Tsumiki の仕様駆動 + AI 駆動が非常にマッチしているのが身を持って感じることができた。コーディング中の Claude Code の脱線はほとんどなかった。
gh コマンドで Claude Code からプルリクを作成できるカスタムスラッシュコマンドを作って diff の確認まで任せたことでテンプレートに則ったプルリクをシームレスに出すことができた。
Terraform を使ったのは初めてで、とくにロールの取り扱いに苦戦した。作成・削除といった強めの権限が必要になるため、ポリシーのリソースの制限などのセキュリティのベストプラクティスを模索した。結果、ロールが何も紐つけられていない IAM ユーザを作成してアクセスキーを発行し、このプロジェクトでのみ利用するリソースのプレフィックスがついた操作ができるロールを引き受けることで、セキュリティリスクの最小化を目指した。しかし、それでもロールの作成などの権限がついてしまうとリスクがついてくると考えたため、作成は手動でおこない、 terraform に import して更新していく形に落ち着いた。
Cloudflare Pages のトークンの権限についても同様で、DNS が編集できる権限はリスクが高すぎると考えたため、プロジェクトの作成や DNS 設定は手動でおこない、他の部分を更新できるトークンにとどめた。
コンテナをビルド
make buildコンテナを起動
make upサーバーからフェッチした文字列で、鮮やかな Hello World が表示されます。
コンテナを終了
make down