第9部:実践プロジェクト Step 32 / 36

アーキテクチャ決定

AIと技術選定を行い、プロジェクトのアーキテクチャを決定します。

Claude Codeでプロジェクト初期化

まずはプロジェクトフォルダを作成し、Claude Codeを起動します。ターミナルで以下を実行してください。

Step 1: フォルダ作成とClaude Code起動

# プロジェクトフォルダを作成して移動
mkdir taskflow
cd taskflow

# Claude Codeを起動
claude

Claude Codeが起動したら、以下の指示でプロジェクトの骨組みを一括作成します。

Step 2: プロジェクトのスキャフォールド

Claude Codeへの指示

TaskFlowプロジェクトのスキャフォールドを作成してください。

【プロジェクト概要】
カンバン形式のプロジェクト管理ツール。リアルタイム同期対応。

【技術スタック】
- Frontend: Next.js 14(App Router, TypeScript, Tailwind CSS)
- Backend: FastAPI(Python 3.11+)
- DB: MySQL 8
- キャッシュ/WebSocket: Redis
- コンテナ: Docker Compose

【作成してほしいもの】
1. frontend/ - Next.jsプロジェクト(create-next-app)
2. backend/ - FastAPIプロジェクト(ディレクトリ構成のみ)
3. docker-compose.yml - 全サービスの定義
4. .gitignore - Python, Node.js, Docker用

まずディレクトリ構成だけ作成し、
中身の実装は次のステップで行います。

Claude Codeが npx create-next-app などのコマンドを実行しようとします。内容を確認して「y」で許可してください。

技術選定の理由

アーキテクチャの各決定には明確な理由があります。「なぜこれを選ぶのか」を理解しておくことで、AIへの指示もより的確になります。

✓ リアルタイム通信: WebSocket

双方向通信が必要なため、WebSocketを採用。FastAPIの組み込みWebSocketを使用します。

なぜこれを選ぶ?

  • SSE(Server-Sent Events) - サーバーからクライアントへの一方向通信のみ。タスクの移動やコメントなど、クライアントからの送信も即時反映したいため不向き。
  • ポーリング - 定期的にAPIを叩く方式。リアルタイム性が低く、同時接続100人規模ではサーバー負荷が大きい。
  • WebSocket - 双方向・低レイテンシ。カンバンのドラッグ&ドロップをリアルタイムで他ユーザーに反映するのに最適。

✓ 状態管理: Zustand + TanStack Query

サーバー状態はTanStack Query、UI状態はZustandで分離管理します。

なぜこれを選ぶ?

  • TanStack Query - APIデータのキャッシュ・再取得・楽観的更新を自動化。タスク一覧やプロジェクト情報などサーバーから取得するデータの管理に最適。
  • Zustand - モーダルの開閉、ドラッグ中の状態など、サーバーと同期不要なUI状態を軽量に管理。Redux比でボイラープレートが大幅に少ない。
  • React Contextは避ける - 再レンダリングの制御が難しく、状態が増えるとパフォーマンスが劣化しやすい。

✓ バックエンド構成: モノリス + レイヤードアーキテクチャ

規模的にモノリスで十分。API / Service / Repository層で責務を分離します。

なぜこれを選ぶ?

  • マイクロサービスは避ける - 同時接続100人規模のアプリにマイクロサービスはオーバーエンジニアリング。サービス間通信、分散トランザクション、デプロイの複雑さが不要な負担になる。
  • レイヤード構成を採用 - API層(エンドポイント定義)→ Service層(ビジネスロジック)→ Repository層(データアクセス)の3層構造。テストが書きやすく、将来の分割も容易。
  • FastAPI - Python製で学習コストが低く、非同期処理・WebSocket・自動APIドキュメント生成を標準サポート。

CLAUDE.mdの作成

CLAUDE.md は、Claude Codeがプロジェクトのコンテキストを理解するための設定ファイルです。プロジェクトのルールやアーキテクチャをここに書いておくと、Claude Codeが毎回のセッションで自動的に読み込み、一貫性のあるコードを生成してくれます。

Claude Codeへの指示

プロジェクトルートにCLAUDE.mdを作成してください。
以下の内容を含めてください:

1. プロジェクト概要(TaskFlowの説明)
2. 技術スタック一覧
3. 開発コマンド(frontend, backend, Docker)
4. ディレクトリ構成のルール
5. コーディング規約(命名規則、ファイル配置)
6. API設計のルール(RESTful、エラーレスポンス形式)

生成されるCLAUDE.mdの例

# CLAUDE.md

## プロジェクト概要
TaskFlow - カンバン形式のプロジェクト管理ツール。
リアルタイム同期対応。複数ユーザーが同時に共同作業可能。

## 技術スタック
- Frontend: Next.js 14 (App Router, TypeScript, Tailwind CSS)
- Backend: FastAPI (Python 3.11+)
- DB: MySQL 8
- Cache/PubSub: Redis
- Container: Docker Compose

## 開発コマンド
```bash
# 全サービス起動
docker compose up -d

# フロントエンドのみ(ホットリロード)
cd frontend && npm run dev

# バックエンドのみ(ホットリロード)
cd backend && uvicorn app.main:app --reload

# テスト実行
cd backend && pytest
cd frontend && npm test
```

## アーキテクチャ
- バックエンドはレイヤードアーキテクチャ(API → Service → Repository)
- フロントエンドはfeatureベースのディレクトリ構成
- サーバー状態: TanStack Query / UI状態: Zustand
- リアルタイム通信: WebSocket (Redis PubSub経由)

## コーディング規約
- Python: snake_case(関数・変数)、PascalCase(クラス)
- TypeScript: camelCase(関数・変数)、PascalCase(コンポーネント・型)
- APIエンドポイント: /api/v1/ プレフィックス、RESTful設計
- エラーレスポンス: {"detail": "エラーメッセージ"} 形式

ポイント:CLAUDE.mdがあると、Claude Codeは「このプロジェクトではFastAPIを使っている」「レイヤード構成に従うべき」といったコンテキストを自動的に把握します。新しいファイルを作るときも、既存のパターンに合わせたコードを生成してくれます。

初期設定ファイル

依存パッケージを定義するファイルを作成します。Claude Codeに指示すれば自動生成されますが、ここでは内容を理解しておきましょう。

backend/requirements.txt

バックエンドのPythonパッケージ一覧です。

# Web framework
fastapi==0.104.1
uvicorn[standard]==0.24.0

# Database
sqlalchemy==2.0.23
pymysql==1.1.0
alembic==1.13.0

# Authentication
python-jose[cryptography]==3.3.0
passlib[bcrypt]==1.7.4

# WebSocket & Cache
websockets==12.0
redis==5.0.1

# Utilities
pydantic-settings==2.1.0
httpx==0.25.2
python-multipart==0.0.6

# Testing
pytest==7.4.3
pytest-asyncio==0.23.2

frontend/package.json(主要な依存関係)

フロントエンドのnpmパッケージ一覧です。create-next-app で生成されるものに加え、追加パッケージをインストールします。

{
  "name": "taskflow-frontend",
  "version": "0.1.0",
  "dependencies": {
    "next": "14.0.4",
    "react": "^18",
    "react-dom": "^18",
    "@dnd-kit/core": "^6.1.0",
    "@dnd-kit/sortable": "^8.0.0",
    "@tanstack/react-query": "^5.13.4",
    "zustand": "^4.4.7",
    "axios": "^1.6.2"
  },
  "devDependencies": {
    "typescript": "^5",
    "tailwindcss": "^3.3.0",
    "@types/node": "^20",
    "@types/react": "^18",
    "eslint": "^8"
  }
}

Claude Codeへの指示

以下の追加パッケージをfrontendにインストールしてください:

npm install @dnd-kit/core @dnd-kit/sortable @tanstack/react-query zustand axios

また、backendにrequirements.txtを作成し、
必要なパッケージを記載してください。

ディレクトリ構成

スキャフォールド完了後の全体構成です。各ディレクトリの役割を理解しておきましょう。

taskflow/
├── CLAUDE.md                  # Claude Code用プロジェクト設定
├── docker-compose.yml         # 全サービスのコンテナ定義
├── .gitignore
├── frontend/
│   ├── src/
│   │   ├── app/               # Next.js App Router(ページ定義)
│   │   ├── components/        # 共通UIコンポーネント
│   │   ├── features/          # 機能別モジュール
│   │   │   ├── auth/          #   認証(login, register)
│   │   │   ├── projects/      #   プロジェクト管理
│   │   │   └── tasks/         #   タスク・カンバンボード
│   │   ├── hooks/             # カスタムフック
│   │   ├── lib/               # ユーティリティ(API client等)
│   │   └── stores/            # Zustandストア定義
│   ├── package.json
│   ├── Dockerfile
│   └── ...
├── backend/
│   ├── app/
│   │   ├── main.py            # FastAPIアプリケーションのエントリーポイント
│   │   ├── api/               # APIエンドポイント定義
│   │   │   └── v1/            #   バージョニング対応
│   │   ├── services/          # ビジネスロジック層
│   │   ├── repositories/      # データアクセス層
│   │   ├── models/            # SQLAlchemyモデル定義
│   │   ├── schemas/           # Pydanticスキーマ(リクエスト/レスポンス)
│   │   ├── websocket/         # WebSocket接続管理
│   │   ├── core/              # 設定・認証・DB接続
│   │   └── utils/             # 共通ユーティリティ
│   ├── alembic/               # DBマイグレーション
│   ├── tests/                 # テストコード
│   ├── requirements.txt
│   ├── Dockerfile
│   └── ...
└── docs/                      # API仕様書・設計ドキュメント

主要ディレクトリの役割

features/

機能単位でコンポーネント・フック・型定義をまとめる。関連するコードが一箇所に集約されるため、見通しが良い。

services/

ビジネスロジックを担当。APIエンドポイントから呼び出される。DBアクセスはRepositoryに委譲する。

repositories/

SQLAlchemyを使ったデータベース操作のみを担当。Service層とDB層の依存を分離する。

schemas/

PydanticモデルでAPIのリクエスト・レスポンスの型を定義。バリデーションも自動で行われる。

websocket/

WebSocket接続の管理とRedis PubSubによるメッセージブロードキャストを担当。

要件定義 次へ:実装フェーズ1