設計サンプル
このページでは、本コースの各 Step で作成する成果物の具体例として、DevOps コースでも扱っている sns-camp(SNS アプリケーション)を題材にした設計・コードサンプルを Step ごとにまとめています。
各 Step の教材からは、該当箇所へのリンクを張っています。あくまで 1 つの正解例として参考にしてください。自作アプリケーションのテーマに合わせて、粒度・項目は自由に決めて構いません。
1. Step 1 バックエンド1
以下は sns-camp をテーマとして選んだ場合の テーマ選定のサンプルです。3 案とも詳細に書ききる必要はなく、メンタリングで壁打ちして絞り込むことを前提としたドラフトです。
1.1 選定したテーマ案(3案)
案 1: SNS アプリケーション(本命)
- テーマ: 短文投稿・フォロー・いいねができるシンプルな SNS
- 想定するターゲットユーザ: 気軽に日々の出来事を共有したい 20〜40 代
- 解決したい課題: 既存の SNS は情報過多で疲れる。シンプルな機能に絞った SNS が欲しい
- 作りたい機能のドラフト案:
- ユーザ登録・ログイン
- 短文投稿(280 文字以内)
- 他ユーザのフォロー・フォロー解除
- タイムライン表示(フォロー中のユーザの投稿)
- いいね
案 2: レシピ管理アプリ
- テーマ: 自分だけのレシピを管理できるアプリ
- 想定するターゲットユーザ: 家庭で料理する人
- 解決したい課題: 自分好みにアレンジしたレシピを整理して残したい
- 作りたい機能のドラフト案: レシピの登録・材料と手順の入力・カテゴリ分け・検索
案 3: 読書記録アプリ
- テーマ: 読んだ本を記録し、感想をまとめるアプリ
- 想定するターゲットユーザ: 読書好きの個人
- 解決したい課題: 過去に読んだ本と感想を一元管理したい
- 作りたい機能のドラフト案: 本の登録・感想メモ・評価・読書記録の統計表示
1.2 採用予定の言語
Python(Web バックエンドの主要フレームワークが充実、シンプルに書ける)
2. Step 2 バックエンド2
以下は Step 1 の 案 1(SNS アプリケーション = sns-camp)を選んだ場合の、API 仕様書・DB 仕様書・ER 図のサンプルです。
2.1 API 仕様書
APIの概要
SNS Camp のバックエンド REST API です。ユーザ認証、投稿、フォロー、いいね機能を提供します。
共通仕様
- ベースURL:
http://<your-host>/api/v1 - 日時フォーマット: ISO 8601(例:
2026-04-03T12:00:00) - ページネーション: クエリパラメータ
limit(デフォルト: 20、最大: 100)、offset(デフォルト: 0)
認証方式
ヘルスチェック・ユーザ登録・ログインを除くすべての API リクエストに Bearer トークンが必要です。
Authorization: Bearer <access_token>
トークンは JWT(HS256)で、有効期限は 24 時間です。
レスポンス形式
成功時:
{ "data": { ... } }
エラー時:
{ "error": { "code": "ERROR_CODE", "message": "エラーメッセージ" } }
ステータスコード一覧
| ステータスコード | 意味 |
|---|---|
| 200 | リクエスト成功 |
| 201 | リソース作成成功 |
| 400 | バリデーションエラー / ビジネスロジックエラー |
| 401 | 認証エラー |
| 403 | 権限エラー |
| 404 | リソースが見つからない |
| 500 | サーバ内部エラー |
エンドポイント一覧
| No. | API ID | API名 | メソッド | エンドポイント | 認証 |
|---|---|---|---|---|---|
| 1 | API-001 | ヘルスチェック | GET | /health | 不要 |
| 2 | API-002 | ユーザ登録 | POST | /api/v1/auth/register | 不要 |
| 3 | API-003 | ログイン | POST | /api/v1/auth/login | 不要 |
| 4 | API-004 | 現在のユーザ取得 | GET | /api/v1/auth/me | 必要 |
| 5 | API-005 | 投稿作成 | POST | /api/v1/posts | 必要 |
| 6 | API-006 | 投稿詳細取得 | GET | /api/v1/posts/{post_id} | 必要 |
| 7 | API-007 | 投稿編集 | PUT | /api/v1/posts/{post_id} | 必要 |
| 8 | API-008 | 投稿削除 | DELETE | /api/v1/posts/{post_id} | 必要 |
| 9 | API-009 | タイムライン取得 | GET | /api/v1/timeline | 必要 |
| 10 | API-010 | ユーザプロフィール取得 | GET | /api/v1/users/{username} | 必要 |
| 11 | API-011 | ユーザの投稿一覧取得 | GET | /api/v1/users/{username}/posts | 必要 |
| 12 | API-012 | フォローする | POST | /api/v1/users/{username}/follow | 必要 |
| 13 | API-013 | フォロー解除 | DELETE | /api/v1/users/{username}/follow | 必要 |
| 14 | API-014 | フォロワー一覧取得 | GET | /api/v1/users/{username}/followers | 必要 |
| 15 | API-015 | フォロー中一覧取得 | GET | /api/v1/users/{username}/following | 必要 |
| 16 | API-016 | いいねする | POST | /api/v1/posts/{post_id}/like | 必要 |
| 17 | API-017 | いいね解除 | DELETE | /api/v1/posts/{post_id}/like | 必要 |
API 詳細(API-002 ユーザ登録の例)
POST /api/v1/auth/register
リクエストパラメータ:
| パラメータ名 | 型 | 必須 | 説明 |
|---|---|---|---|
| username | string | ○ | ユーザ名(3〜20文字、英数字とアンダースコアのみ) |
| string | ○ | メールアドレス(一意制約あり) | |
| password | string | ○ | パスワード(8文字以上) |
| display_name | string | - | 表示名(50文字以内) |
リクエスト例:
{
"username": "testuser",
"email": "test@example.com",
"password": "password123",
"display_name": "テストユーザ"
}
レスポンス(201 Created):
| フィールド名 | 型 | 説明 |
|---|---|---|
| data.token | string | JWT アクセストークン |
| data.user.id | integer | ユーザID |
| data.user.username | string | ユーザ名 |
| data.user.email | string | メールアドレス |
| data.user.display_name | string / null | 表示名 |
レスポンス例:
{
"data": {
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": {
"id": 1,
"username": "testuser",
"email": "test@example.com",
"display_name": "テストユーザ"
}
}
}
エラーレスポンス:
| ステータスコード | エラーコード | エラー内容 |
|---|---|---|
| 400 | USERNAME_EXISTS | ユーザ名の重複 |
| 400 | EMAIL_EXISTS | メールアドレスの重複 |
| 400 | VALIDATION_ERROR | バリデーションエラー |
2.2 DB 仕様書
データベース概要
SNS アプリケーションのユーザ情報・投稿・フォロー関係・いいねを管理するデータベースです。
テーブル一覧
| No. | テーブル名 | 概要 |
|---|---|---|
| 1 | users | ユーザの基本情報・認証情報 |
| 2 | posts | ユーザの投稿 |
| 3 | follows | ユーザ間のフォロー関係 |
| 4 | likes | 投稿へのいいね |
テーブル詳細(users テーブルの例)
ユーザの基本情報と認証情報を保存するテーブル。
カラム定義:
| カラム名 | 型 | 必須 | 制約 | 説明 |
|---|---|---|---|---|
| id | bigint | ○ | PK, auto increment | ユーザID |
| username | varchar(20) | ○ | UNIQUE | ユーザ名(3〜20文字) |
| varchar(255) | ○ | UNIQUE | メールアドレス | |
| password_hash | varchar(255) | ○ | ハッシュ化されたパスワード | |
| display_name | varchar(50) | 表示名 | ||
| created_at | datetime | ○ | 作成日時 | |
| updated_at | datetime | ○ | 更新日時 |
インデックス:
| インデックス名 | 対象カラム | 用途 |
|---|---|---|
| idx_username | username | ユーザ名検索 |
| idx_email | ログイン時のメールアドレス検索 |
テーブル詳細(posts テーブルの例)
ユーザの投稿を保存するテーブル。
カラム定義:
| カラム名 | 型 | 必須 | 制約 | 説明 |
|---|---|---|---|---|
| id | bigint | ○ | PK, auto increment | 投稿ID |
| user_id | bigint | ○ | FK → users.id (CASCADE) | 投稿したユーザ |
| content | varchar(280) | ○ | 投稿本文(280文字以内) | |
| created_at | datetime | ○ | 作成日時 | |
| updated_at | datetime | ○ | 更新日時 |
インデックス:
| インデックス名 | 対象カラム | 用途 |
|---|---|---|
| idx_user_id | user_id | 特定ユーザの投稿一覧取得 |
| idx_created_at | created_at | 新着順ソート |
テーブル詳細(follows テーブルの例)
ユーザ間のフォロー関係を保存する中間テーブル。
カラム定義:
| カラム名 | 型 | 必須 | 制約 | 説明 |
|---|---|---|---|---|
| id | bigint | ○ | PK, auto increment | ID |
| follower_id | bigint | ○ | FK → users.id (CASCADE) | フォローする側のユーザ |
| following_id | bigint | ○ | FK → users.id (CASCADE) | フォローされる側のユーザ |
| created_at | datetime | ○ | 作成日時 |
制約:
UNIQUE(follower_id, following_id): 同じ組み合わせのフォロー重複を防ぐ
インデックス:
| インデックス名 | 対象カラム | 用途 |
|---|---|---|
| idx_follower_id | follower_id | フォロー中一覧取得 |
| idx_following_id | following_id | フォロワー一覧取得 |
2.3 ER 図
sns-camp のテーブル構造の ER 図です。
erDiagram
users ||--o{ posts : "投稿する"
users ||--o{ follows : "フォローする(follower_id)"
users ||--o{ follows : "フォローされる(following_id)"
users ||--o{ likes : "いいねする"
posts ||--o{ likes : "いいねされる"
users {
bigint id PK
varchar username UK
varchar email UK
varchar password_hash
varchar display_name
}
posts {
bigint id PK
bigint user_id FK
varchar content
}
follows {
bigint id PK
bigint follower_id FK
bigint following_id FK
}
likes {
bigint id PK
bigint user_id FK
bigint post_id FK
}
3. Step 3 バックエンド実装
以下は sns-camp-api の完全なソースコード(自動テスト・Docker 設定・静的解析設定を含む)です。ダウンロードしてローカルで起動しながら、コード構成の参考にしてください。
4. Step 4 フロントエンド1
以下は sns-camp-front の画面一覧・画面遷移図のサンプルです。
4.1 画面一覧
| No. | 画面ID | 画面名 | 目的 | 主要な要素 | 関連API |
|---|---|---|---|---|---|
| 1 | SCR-001 | ルート | 認証状態に応じて振り分ける | (表示要素なし、リダイレクトのみ) | GET /api/v1/auth/me |
| 2 | SCR-002 | ログイン画面 | メール・パスワードでログインする | メール入力、パスワード入力、ログインボタン、新規登録リンク | POST /api/v1/auth/login |
| 3 | SCR-003 | ユーザ登録画面 | 新規ユーザを登録する | ユーザ名・メール・パスワード・表示名入力、登録ボタン、ログインリンク | POST /api/v1/auth/register |
| 4 | SCR-004 | タイムライン画面 | 投稿一覧の表示と新規投稿を行う | ヘッダー、投稿フォーム、フィルター、投稿一覧、いいねボタン | GET /api/v1/timeline、POST /api/v1/posts、POST/DELETE /api/v1/posts/{id}/like |
| 5 | SCR-005 | 投稿詳細画面 | 個別の投稿を表示する | 戻るボタン、投稿カード、編集・削除ボタン(本人投稿のみ) | GET /api/v1/posts/{id}、DELETE /api/v1/posts/{id} |
| 6 | SCR-006 | 投稿編集画面 | 自分の投稿を編集する | テキストエリア、保存ボタン、キャンセルボタン | GET /api/v1/posts/{id}、PUT /api/v1/posts/{id} |
| 7 | SCR-007 | ユーザプロフィール画面 | 特定ユーザの情報と投稿一覧を表示する | プロフィール情報、フォロー・フォロー解除ボタン、投稿一覧 | GET /api/v1/users/{username}、GET /api/v1/users/{username}/posts、POST/DELETE /api/v1/users/{username}/follow |
4.2 画面遷移図
sns-camp-front の画面遷移を Mermaid で表現したサンプルです。
flowchart LR root[SCR-001 ルート] login[SCR-002 ログイン画面] register[SCR-003 ユーザ登録画面] timeline[SCR-004 タイムライン画面] postDetail[SCR-005 投稿詳細画面] postEdit[SCR-006 投稿編集画面] profile[SCR-007 ユーザプロフィール画面] root -->|認証済み| timeline root -->|未認証| login login -->|ログイン成功| timeline login -->|新規登録リンク| register register -->|登録成功| timeline register -->|ログインリンク| login timeline -->|投稿クリック| postDetail timeline -->|ユーザ名クリック| profile timeline -->|ログアウト| login postDetail -->|編集ボタン| postEdit postDetail -->|削除・戻る| timeline postEdit -->|更新成功| postDetail postEdit -->|キャンセル| postDetail profile -->|投稿クリック| postDetail
5. Step 5 フロントエンド2
以下は sns-camp-front のイベント設計のサンプルです。SCR-004 タイムライン画面(一覧系)と SCR-003 ユーザ登録画面(登録系)の 2 画面を例として示します。
5.1 SCR-004 タイムライン画面(一覧系)
| イベント | トリガー | 呼び出すAPI | 表示・処理内容 |
|---|---|---|---|
| 初期表示(全投稿) | 画面表示時 | GET /api/v1/timeline | 投稿一覧を表示 |
| フィルター切り替え(フォローのみ) | フォローのみボタン押下 | GET /api/v1/timeline?filter=following | フォロー中のユーザの投稿のみに切り替え |
| 投稿作成 | 投稿ボタン押下 | POST /api/v1/posts | 投稿を作成し、一覧の先頭に反映 |
| いいね | ハートアイコン押下(未いいね状態) | POST /api/v1/posts/{post_id}/like | ハートを赤色に切り替え、いいね数 +1 |
| いいね解除 | ハートアイコン押下(いいね済み状態) | DELETE /api/v1/posts/{post_id}/like | ハートを通常色に戻し、いいね数 -1 |
| 投稿削除 | 削除ボタン押下(確認ダイアログで OK) | DELETE /api/v1/posts/{post_id} | 一覧から該当投稿を除去 |
| 投稿詳細への遷移 | 投稿内容のクリック | (API 呼び出しなし、遷移のみ) | SCR-005 投稿詳細画面へ遷移 |
| プロフィールへの遷移 | ユーザ名のクリック | (API 呼び出しなし、遷移のみ) | SCR-007 ユーザプロフィール画面へ遷移 |
| ログアウト | ログアウトボタン押下 | (API 呼び出しなし、トークン破棄のみ) | セッションを破棄し、SCR-002 ログイン画面へ遷移 |
5.2 SCR-003 ユーザ登録画面(登録系)
| イベント | トリガー | 呼び出すAPI | 表示・処理内容 |
|---|---|---|---|
| 初期表示 | 画面表示時 | (API 呼び出しなし) | 空の登録フォームを表示 |
| 登録実行 | 登録ボタン押下 | POST /api/v1/auth/register | 成功時: トークンを保存し、SCR-004 タイムライン画面へ遷移。失敗時: エラー内容を画面上に表示 |
| ログイン画面へ戻る | ログインリンクのクリック | (API 呼び出しなし、遷移のみ) | SCR-002 ログイン画面へ遷移 |
6. Step 6 フロントエンド実装
以下は sns-camp-front の完全なソースコード(Docker 設定・自動テスト設定を含む)です。ダウンロードしてローカルで起動しながら、コード構成の参考にしてください。