📄
概念 📚 beginner-stepup

SNSクローンの全体設計(Month 1 ゴール)

Month 1で構築するSNSクローンアプリの機能・DBスキーマ・APIエンドポイント・コンポーネント構成とWeek別実装ロードマップ

Month 1のゴールは「SNSクローンがローカルで動く状態(ユーザー登録 → ログイン → 投稿 → フォロー)」。このドキュメントはそのゴールに向けた全体設計図である。何を作るかを最初に把握しておくことで、各週の学習内容が「なぜ必要か」の文脈で理解できるようになる。


システム構成

ブラウザ
  ↓ HTTP(localhost:3001)
web/  React 19 + Vite + React Router v7 + Tailwind CSS v4
  ↓ fetch(localhost:3001)
api/  Hono v4(Node.js)
  ↓ Drizzle ORM
DB    PostgreSQL 16(Docker)

フロントエンドとバックエンドは別プロセスとして動く(ポートも別)。ブラウザからは localhost:3001 のHono APIにfetchでリクエストを送る。


機能一覧

機能説明
ユーザー登録メール・パスワードで新規アカウント作成
ログインJWT発行・ローカルストレージに保存
投稿作成テキスト投稿(140文字以内)
タイムラインフォロー中のユーザーの投稿一覧
フォロー/アンフォロー他ユーザーをフォロー
プロフィールユーザー名・投稿一覧表示

DBスキーマ

// api/src/db/schema.ts

// ユーザーテーブル
export const users = pgTable("users", {
  id: text("id").primaryKey().default(sql`gen_random_uuid()`),
  username: text("username").notNull().unique(),
  email: text("email").notNull().unique(),
  passwordHash: text("password_hash").notNull(),
  createdAt: timestamp("created_at").defaultNow(),
});

// 投稿テーブル
export const posts = pgTable("posts", {
  id: text("id").primaryKey().default(sql`gen_random_uuid()`),
  userId: text("user_id").notNull().references(() => users.id),
  content: text("content").notNull(),  // 最大140文字
  createdAt: timestamp("created_at").defaultNow(),
});

// フォローテーブル(多対多)
export const follows = pgTable("follows", {
  followerId: text("follower_id").notNull().references(() => users.id),
  followingId: text("following_id").notNull().references(() => users.id),
  createdAt: timestamp("created_at").defaultNow(),
}, (t) => ({
  pk: primaryKey({ columns: [t.followerId, t.followingId] }),
}));

APIエンドポイント一覧(Hono)

認証
  POST /api/auth/register   ユーザー登録
  POST /api/auth/login      ログイン(JWTを返す)

投稿
  GET  /api/posts           タイムライン取得(要認証)
  POST /api/posts           投稿作成(要認証)
  GET  /api/posts/:id       投稿詳細
  DELETE /api/posts/:id     投稿削除(本人のみ)

ユーザー
  GET  /api/users/:username  プロフィール取得
  GET  /api/users/:username/posts  ユーザーの投稿一覧

フォロー
  POST   /api/follows/:username  フォロー
  DELETE /api/follows/:username  アンフォロー

コンポーネント構成(React + React Router v7)

src/
├── main.tsx              アプリのエントリーポイント
├── router.tsx            React Router の設定(createBrowserRouter)
├── pages/
│   ├── Home.tsx          タイムライン(/)
│   ├── Login.tsx         ログイン(/login)
│   ├── Register.tsx      ユーザー登録(/register)
│   └── Profile.tsx       プロフィール(/profile/:username)
├── components/
│   ├── PostCard.tsx      投稿カード
│   ├── PostForm.tsx      投稿フォーム
│   ├── UserCard.tsx      ユーザーカード
│   └── Header.tsx        ヘッダー(ナビゲーション)
└── lib/
    ├── api.ts            API呼び出しの共通関数
    └── auth.ts           JWT管理(保存・取得・削除)

Week別 実装ロードマップ

Week 1: 開発環境 + プロジェクト基盤

  • 環境構築完了(Node.js・pnpm・Docker)
  • リポジトリclone・pnpm dev で起動確認
  • Git操作に慣れる(add・commit・push)
  • feature/week1-setup ブランチを切ってPRを上げる

確認: localhost:3001/health{"status":"ok"} を返す


Week 2: フロントエンド(React + Tailwind)

  • ログインページのUIを作る(React + Tailwind)
  • 投稿カードコンポーネントを作る
  • React Routerでページ遷移を実装する
  • TypeScriptで型を定義する

確認: localhost:3000 でUIが表示される、ページ遷移が動く


Week 3: バックエンド(Hono + Drizzle + JWT)

  • DBスキーマを定義する(Drizzle)
  • pnpm db:push でテーブルを作成する
  • 認証API(register / login)をHonoで実装する
  • JWTミドルウェアを実装する
  • 投稿APIを実装する

確認: curl でAPIを叩いてレスポンスが返る


Week 4: 統合 + Docker + CI

  • フロントエンドからAPIを呼び出す(fetch)
  • JWTをローカルストレージに保存・認証フローを通す
  • Docker Composeでアプリ全体を起動できるようにする
  • GitHub Actionsでlint・型チェックが走るようにする
  • CLAUDE.mdを書く

確認: 登録 → ログイン → 投稿の一連の操作がブラウザで動く


参考リソース

生きているコード

本ドキュメントで扱ったパターンの完全な動作コードは、メンター側リポジトリの参照ブランチで確認できます。

ブランチの作り方・見方は b00-curriculum-map を参照してください。

  1. 1. 📄環境構築の段階的導入(macOS / Windows)
  2. 2. 📄SNSアプリの最終インフラ構成図
  3. 3. 📄SNSクローンの全体設計(Month 1 ゴール)
  4. 4. 📄カリキュラム全体マップ(Week × 教材 × 参照ブランチ × 要求チェックリスト)
  5. 5. 📄このカリキュラムの使い方(SQL・Python・Dify経験者向け)
  6. 6. 📄シェル・ターミナル基礎
  7. 7. 📄Windows で完全にゼロから始める開発環境構築(Week 1)
  8. 8. 📄Git基礎
  9. 9. 📄GitHubワークフロー
  10. 10. 📄パッケージ管理(pnpm workspace)
  11. 11. 📄Webアプリアーキテクチャ全体像
  12. 12. 📄要求ヒアリングとユーザーストーリー(Month 2 Week 5)
  13. 13. 📄画面ワイヤーフレームと画面遷移図(Month 2 Week 6)
  14. 14. 📄HTTP・REST API基礎
  15. 15. 📄ER 図の描き方(Month 2 Week 7)
  16. 16. 📄認証・認可のパターン
  17. 17. 📄REST API 仕様書の書き方(Month 2 Week 7)
  18. 18. 📄HTML/CSS基礎とレイアウト
  19. 19. 📄JavaScript基礎(Pythonとの対比)
  20. 20. 📄TypeScript基礎(型システムとPythonとの対比)
  21. 21. 📄Reactコンポーネント設計の基礎
  22. 22. 📄状態管理の概念
  23. 23. 📄フォーム検証(React Hook Form + Zod)(Month 3 Week 11)
  24. 24. 📄バックエンドAPI設計(Hono)
  25. 25. 📄ルーティング(React Router v7)
  26. 26. 📄Hono のエラーハンドリング(Month 4 Week 13)
  27. 27. 📄データベース設計・SQL→Drizzle ORM対応
  28. 28. 📄マイグレーションの考え方
  29. 29. 📄AWSインフラ基礎
  30. 30. 📄AWS Budget Alert の設定(Month 5 Week 17)
  31. 31. 📄環境変数管理
  32. 32. 📄Bastion EC2 と SSH ProxyJump(Month 5 Week 18)
  33. 33. 📄CI/CD基礎
  34. 34. 📄ECR への Docker イメージ push と App EC2 デプロイ(Month 5 Week 19)
  35. 35. 📄テスト設計の基本
  36. 36. 📄CloudFront + S3 + ALB で公開する(Month 5 Week 20)
  37. 37. 📄CLAUDE.md・プロジェクト設定
  38. 38. 📄PR レビュー 5 観点ルーブリック(全 Week 共通)
  39. 39. 📄タスク分解・仕様の書き方
  40. 40. 📄Playwright で E2E テスト(Month 6 Week 22)
  41. 41. 📄生成コードのレビュー・デバッグの勘所
  42. 42. 📄Trivy で脆弱性スキャン(Month 6 Week 23)
  43. 43. 📄CloudWatch Logs の読み方と運用(Month 6 Week 23)
  44. 44. 📄PDF ポートフォリオの自動生成(Month 6 Week 24)