👁

設計サンプル

このページでは、本コースの各 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文字、英数字とアンダースコアのみ)
email 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文字)
email varchar(255) UNIQUE メールアドレス
password_hash varchar(255) ハッシュ化されたパスワード
display_name varchar(50) 表示名
created_at datetime 作成日時
updated_at datetime 更新日時

インデックス:

インデックス名 対象カラム 用途
idx_username username ユーザ名検索
idx_email 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 設定・自動テスト設定を含む)です。ダウンロードしてローカルで起動しながら、コード構成の参考にしてください。

この教材は役に立ちましたか?

いいねをたくさんいただけると、制作者の励みになり、より多くのセクションが作れるようになります。

感想を一言(任意)

いただいたコメントは次の制作のヒントになります。ぜひお気軽にご投稿ください。

このコメントは他の受講生には公開されません。DevOps Camp運営が、教材改善のために確認します。

0 / 2000