Day1で起こした要件定義書・ER図・API仕様・シーケンス図をもとに、SQLAlchemy 2.0で実装し、ユニット結合の二層でカバレッジ80%を目指す3時間。
設計書の引き継ぎ確認と実装方針の合意。[10分]
routers/services/repositories の骨格を Claude Code で起こす。[15分]
SQLAlchemy 2.0 の Mapped 構文で全エンティティを実装、初期マイグレーション。[35分]
repository 層のユニットテストでカバレッジの基礎を作る。[15分]
10分
router→service→repository の流れでチケット・コメント・SLAを積む。[35分]
TestClient で API を叩く結合テストを書き、CI を緑のまま保つ。[30分]
Swagger UI で挙動を確認、Strict Reviewer で点検。[20分]
持ち帰る3点と Day3 (Docker・CI/CD) への宿題。[10分]
Day1で作った設計書を引き継ぎ、Day2で何を実装するかを再確認します。
docs/requirements.md 要件定義書、MoSCoW で機能分類docs/data_model.md ER図、状態遷移図docs/openapi.yaml API仕様、エラーコード一覧docs/sequence_diagrams.md 主要3ユースケースのシーケンス図講師から共有する完成版の設計書を docs/ 配下に配置してから始めてください。Day2で実装する内容は設計書を読まないと判断できません。
routers → services → repositories → models の単方向依存を守ってください。router にビジネスロジックを書くと、Day3でテストが書けません。.github/copilot-instructions.md にもこの方針が書かれているので、Claude Code に常に意識させます。
「実装が終わってからテストを書く」では Day3の CI で破綻します。1機能実装したら1テスト書く、をリズムで回してください。
15分で routers/services/repositories/schemas の骨格を Claude Code に生成させます。
VSCode で配布リポジトリを開き、ターミナルで source .venv/bin/activate を実行。続いて下記4つが全て成功することを確認します。
Sidebar Chat または claude CLI で次のように依頼します。
Claude Code が出した差分を Apply する前に、各ファイルの import 文と関数シグネチャだけ目視で確認してください。Mapped[T] と mapped_column を使う SQLAlchemy 2.0構文になっているか、特に注意。
Actions タブで全ジョブが緑になることを確認してから次に進みます。
35分でSQLAlchemy 2.0のモデルを全エンティティ分実装し、初期マイグレーション相当を整備します。
Claude Code に次のように依頼します。
data/seed/initial_tickets.json は配布物に既に入っています。これを起動時に DB に流し込むスクリプトを書きます。
チケット数とユーザー一覧が想定通り表示されればOK。
ImportError: cannot import name 'Mapped' → SQLAlchemy 2.0系が入っていない。pip show sqlalchemy で2.0系か確認create_engine ではなく create_async_engine を使うPRAGMA foreign_keys=ON を有効化repository 層のユニットテストでカバレッジの土台を作ります。15分。
tests/conftest.py を更新し、in-memory SQLite の非同期セッションを返す fixture を追加します。
Claude Code に厳密モード (strict-reviewer) で依頼します。
app/repositories/ticket_repository.py のカバレッジが80%以上、app/models/ticket.py が60%以上になるのが目安です。
35分で router → service → repository のレイヤを全エンドポイント分積み上げます。
最初にエラーレスポンスの共通形を実装します。これで以降の実装が楽になります。
SLA は本研修の中で最も複雑なロジックです。営業時間外と土日祝の除外を考慮します。
ここまでで一度コミット・push。CIの4ジョブが全て緑になることを確認してください。落ちたら原因を Chat に貼って直してから先に進みます。
30分で TestClient ベースの結合テストを書き、カバレッジ80%を達成します。
tests/conftest.py に async TestClient を返す fixture を追加します。get_session の依存を上書きして、テスト用 in-memory DB に切り替えます。
SLA は時刻依存のロジックなので、fixture で時刻を固定します。
カバレッジが80%未満なら CI が失敗します。未カバーの行を見て、優先度の高い箇所からテストを追加してください。
Swagger UI で実機確認し、Strict Reviewer で全体を点検する20分です。
ブラウザで http://127.0.0.1:8000/docs を開き、自分が実装した全エンドポイントを Swagger UI から叩いて挙動を確認します。
https://0514-28cc.give-app.net/docs を別タブで開き、自分の実装と挙動が一致しているか比較してください。違いがあれば、公開デモは「仕込まれた改善余地を含む雑な実装」だったことを思い出してください。自分の実装は規約通りに動くはずです。
Strict Reviewer は妥協なく指摘してきますが、Day2内で全て直す必要はありません。「致命的」とラベル付けされたものだけ即修正し、それ以外は Issue として GitHub に起票して Day3で対応します。
Actions タブで CI が緑になっていることを確認したら Day2完了です。
Day2の成果物と、Day3までの宿題を整理します。
Dockerfile を読んでマルチステージビルドの構造を理解しておくdocker-compose up をローカルで試してみる(Day3で扱う内容ですが、事前に動かしておくと理解が早い)Day3(5/28)は本日の実装を Dockerfile マルチステージビルドでパッケージ化し、GitHub Actions の CI 全ジョブを緑のまま docker build を追加します。@claude メンションで AI 自動 PR 修正も体験。事前に .github/prompts/dockerfile-review.prompt.md に目を通しておくとスムーズです。