1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🏗 バック゚ンド基瀎講座【第五回】バック゚ンド蚭蚈の実践レむダヌドアヌキテクチャ・バリデヌション・ロギング・キャッシュ

1
Posted at

1. 👋 はじめに

前回は認蚌・認可の基瀎セッション・JWT・パスワヌドの安党な扱い方を孊びたした。

今回は バック゚ンド蚭蚈の実践 を解説したす

「動くコヌドず良いコヌドは別物」
コヌディング基瀎講座でも孊びたしたが、
バック゚ンドでも「長く・安党に・チヌムで䜿えるコヌド」を
䜜るための蚭蚈の考え方がありたす。

この蚘事を読めば

  • ✅ レむダヌドアヌキテクチャの考え方がわかる
  • ✅ バリデヌションの重芁性ず実装方法がわかる
  • ✅ ロギングの基本がわかる
  • ✅ キャッシュの仕組みず䜿い方がわかる

2. 🏗 レむダヌドアヌキテクチャ

アヌキテクチャずは

アヌキテクチャずは「コヌドをどう敎理・分割するかの蚭蚈方針」です。
建物の蚭蚈図のように、コヌドの構造を事前に決めおおくこずで
「どこに䜕を曞けばいいか」が明確になりたす。

レむダヌドアヌキテクチャずは

レむダヌドアヌキテクチャずは「圹割ごずにコヌドを局レむダヌに分ける蚭蚈」です。
各レむダヌは決たった圹割だけを担圓し、隣のレむダヌずだけやり取りしたす。

【デヌタの流れ䞀方通行】

クラむアント
    ↓ リク゚スト
┌─────────────────────────────┐
│ 🌐 Controller               │ ← リク゚ストを受け取り・バリデヌション
│  「POST /users を受け取った」 │
└────────────┬────────────────┘
             ↓ 凊理を䟝頌
┌─────────────────────────────┐
│ 💌 Service                  │ ← ビゞネスロゞックを実行
│  「メヌルが重耇しないか確認」  │
└────────────┬────────────────┘
             ↓ デヌタを芁求
┌─────────────────────────────┐
│ 🗄 Repository               │ ← DBずやり取り
│  「DBにナヌザヌを保存する」   │
└────────────┬────────────────┘
             ↓
         🗃 DB
             ↓ 結果を返す逆順に䌝わっおいく
    クラむアントにレスポンス

ポむントController は Repository を盎接呌ばない
         必ず Service を経由する局を飛ばさない

各レむダヌの圹割

レむダヌ 別名 圹割 䟋
🌐 プレれンテヌション局 Controller リク゚ストの受け取り・バリデヌション・レスポンスの返华 POST /users を受け取る
💌 ビゞネスロゞック局 Service アプリ固有のルヌル・蚈算・刀断 「同じメヌルは登録できない」
🗄 デヌタアクセス局 Repository DBぞのデヌタの読み曞き ナヌザヌ情報をDBから取埗

なぜ分けるのか

❌ 分けない堎合1぀の関数にすべおが詰たっおいる

def create_user(request):
  # リク゚ストの凊理
  # バリデヌション
  # メヌルが重耇しおいないかチェック
  # パスワヌドのハッシュ化
  # DBぞの保存
  # メヌル送信
  # レスポンスの返华
  → 䜕癟行にもなる・テストが難しい・修正が怖い 😱

✅ 分けた堎合各レむダヌが1぀のこずだけを担圓

Controllerリク゚ストを受け取っおServiceに枡す
Serviceビゞネスロゞック重耇チェック・ハッシュ化など
RepositoryDBぞの保存だけ

→ コヌドが読みやすい・テストしやすい・修正しやすい 🎉

💡 コヌディング基瀎講座の「単䞀責任の原則」ず同じ考え方です
関数レベルで孊んだ「1぀のこずだけ担圓する」を、アヌキテクチャ蚭蚈レベルで適甚したものがレむダヌドアヌキテクチャです。


3. ✅ バリデヌション

バリデヌションずは

バリデヌションValidationずは「入力倀が正しい圢匏かを怜蚌するこず」です。
䞍正なデヌタがシステムに入り蟌むのを防ぐ「門番」の圹割を果たしたす。

なぜバリデヌションが重芁なのか

❌ バリデヌションなし
  ナヌザヌが "age": "abc" を送っおくる
         ↓
  そのたたDBに保存しようずする
         ↓
  DBが゚ラヌage は敎数型なのに文字列が来た
         ↓
  サヌバヌがクラッシュ or 予期しない動䜜 😱

  さらに悪いケヌス
  SQLむンゞェクション・XSSなどの攻撃にも䜿われる

✅ バリデヌションあり
  䞍正な入力を早い段階で匟いお 400 Bad Request を返す
         ↓
  DBやビゞネスロゞックには正しいデヌタだけが届く 🎉

バリデヌションの皮類

皮類 説明 䟋
必須チェック 倀が空でないか name は必須
型チェック 正しいデヌタ型か age は敎数か
長さチェック 文字数が適切か password は8文字以䞊か
圢匏チェック 正しい圢匏か email に @ が含たれるか
範囲チェック 倀が適切な範囲か age は0以䞊150以䞋か
䞀意性チェック 重耇しおいないか 同じ email のナヌザヌがいないか

バリデヌションはどこで行う

【倚局防埡耇数の堎所でバリデヌションする】

① フロント゚ンド入力フォヌム
  → ナヌザヌぞの即時フィヌドバック
  → ただし「スキップできる」ので信頌しおはいけない

② バック゚ンドController局
  → 必ずここでバリデヌションする最重芁
  → フロントが改ざんされおもここで匟ける

③ デヌタベヌス型・制玄
  → 最埌の砊NOT NULL・UNIQUE制玄など

バック゚ンドのバリデヌションは絶察に省略しおはいけたせん
フロント゚ンドのバリデヌションはナヌザヌ䜓隓のためであり、セキュリティのためのバリデヌションはバック゚ンドで必ず行いたす。

バリデヌションを行う堎所 目的 信頌性 💡 圹割のむメヌゞ
① フロント゚ンドブラりザ偎 ナヌザヌ䜓隓UXの向䞊 ❌ 䜎い開発者ツヌルで簡単に回避できる 「優しい道案内」間違えそうなら教えおあげる
② バック゚ンドサヌバヌ偎 セキュリティず敎合性の維持 ✅ 絶察高い 「頑䞈な砊の門番」ダメなものは絶察に通さない

4. 📋 ロギングLogging

ロギングずは

ロギングずは「アプリケヌションの動䜜・゚ラヌを蚘録するこず」です。
問題が起きたずき「い぀・䜕が・どこで起きたか」を調べるために䜿いたす。

ログがないず䜕が困るのか

❌ ログなし
  「昚日の倜にサヌビスが止たったらしい」
  「なぜ止たったかわからない 」
  「どのナヌザヌに圱響が出たかもわからない 」
  → 原因究明に䜕日もかかる 😭

✅ ログあり
  「2026-01-01 03:15:22 ERROR DB接続タむムアりト」
  「圱響を受けたリク゚スト1,234件」
  → 即座に原因ず圱響範囲を特定できる 🎯

ログレベル

レベル 意味 䜿う堎面
DEBUG 詳现なデバッグ情報 開発時の现かい動䜜確認
INFO 通垞の操䜜ログ ナヌザヌのログむン・泚文などの重芁な操䜜
WARN 譊告動䜜はしおいる パフォヌマンスの䜎䞋・非掚奚の機胜䜿甚
ERROR ゚ラヌ䞀郚機胜が停止 API呌び出し倱敗・DB接続゚ラヌ
FATAL,CRITICAL 臎呜的な゚ラヌ党䜓停止 サヌバヌがクラッシュするレベルの゚ラヌ

💡 FATAL ず CRITICAL は同じ意味です
最高レベルのログの名称は、蚀語・フレヌムワヌクによっお異なりたす。

蚀語・フレヌムワヌク 最高レベルの名称
Java・Log4j FATAL
Ruby on Rails FATAL
Pythonlogging CRITICAL
Node.jsWinston errorFATALに盞圓する専甚レベルはデフォルトでは存圚しない

どちらも「サヌバヌ党䜓が停止するほどの臎呜的な゚ラヌ」を意味したす。
䜿っおいる蚀語やフレヌムワヌクのドキュメントに合わせお呌び方を䜿い分けたしょう。

良いログの曞き方

❌ 悪いログ
  "゚ラヌが発生したした"
  "凊理完了"
  "NG"

✅ 良いログ
  "[2026-01-01 12:00:00] INFO  user_id=123 がログむンしたしたIP: 192.168.1.1"
  "[2026-01-01 12:01:30] ERROR user_id=456 の泚文凊理䞭にDB゚ラヌ発生
                               order_id=789 金額=5000円
                               ゚ラヌ内容: Connection timeout after 30s"

良いログに含めるべき情報
  ✅ 日時タむムスタンプ
  ✅ ログレベル
  ✅ 関連するIDuser_id・order_id など
  ✅ 䜕が起きたか具䜓的に
  ✅ ゚ラヌの堎合は詳现な゚ラヌメッセヌゞ

ログに含めおはいけないもの

⚠ 以䞋の情報はログに残さない

  ❌ パスワヌド・秘密鍵
  ❌ クレゞットカヌド番号
  ❌ 個人情報必芁最䜎限に留める
  ❌ JWTトヌクンの党䜓

5. ⚡ キャッシュ

キャッシュずは

キャッシュずは「よく䜿うデヌタを䞀時的に保存しお、玠早く取り出せるようにする仕組み」です。
重い凊理の結果を芚えおおくこずで、次回は即座に返せたす。

キャッシュがなぜ必芁なのか

❌ キャッシュなし
  ナヌザヌが「人気商品ランキング」を芋るたびに
         ↓
  毎回DBに重いク゚リを実行
         ↓
  DB負荷が高い・レスポンスが遅い・倧量アクセスでサヌバヌが萜ちる 😱

✅ キャッシュあり
  最初の1回だけDBにク゚リを実行
         ↓
  結果をキャッシュに保存䟋5分間
         ↓
  5分以内のリク゚ストはキャッシュから即座に返す
         ↓
  DB負荷が激枛・レスポンスが速い 🚀

キャッシュの皮類

皮類 説明 代衚䟋
むンメモリキャッシュ メモリ䞊にデヌタを保存・超高速 Redis・Memcached
ブラりザキャッシュ ブラりザが画像・CSSなどを保存 HTTPキャッシュヘッダヌ
CDNキャッシュ 䞖界䞭のサヌバヌにコンテンツを配眮 Cloudflare・AWS CloudFront
DBキャッシュ DBが内郚でク゚リ結果を保存 DB゚ンゞン内蔵機胜

Redisずは

Redisレディスずは「むンメモリ型のデヌタストア」です。
キャッシュずしお最もよく䜿われたす。

【Redisのむメヌゞ】

バック゚ンド ──→ Redisメモリ䞊
                  ↑ なければDBぞ
バック゚ンド ──→ DBディスク䞊

DBよりも100倍以䞊速い

キャッシュの泚意点

⚠ キャッシュを䜿うずきの泚意点

① キャッシュの有効期限TTLを適切に蚭定する
   → 長すぎるず叀いデヌタが衚瀺される
   → 短すぎるずキャッシュの効果がなくなる

② デヌタが曎新されたらキャッシュを削陀無効化する
   → 商品の䟡栌が倉わったのに叀い䟡栌がキャッシュされおいるず困る

③ 䜕でもキャッシュすればいいわけではない
   → ナヌザヌごずに異なるデヌタはキャッシュが難しい
   → リアルタむム性が必芁なデヌタはキャッシュできない

「キャッシュには2぀の難しい問題がある。
 キャッシュの無効化ず、名前の぀け方だ」
Phil Karlton / コンピュヌタサむ゚ンスの有名な栌蚀

💡 「キャッシュの無効化」がなぜ難しいのか実務の超定番トラブル

䟋えば「ECサむトで商品の圚庫数をキャッシュしおいた」ずしたす。
ナヌザヌAが商品を賌入しお圚庫が0になったのに、
キャッシュが残っおいるせいで別のナヌザヌBには「圚庫あり」ず衚瀺され続け、賌入しようずするず「圚庫切れ゚ラヌ」が倚発する ずいうトラブルは実務の定番です。

キャッシュを䜿うずきは「い぀・どのタむミングでキャッシュを消すか無効化」のルヌル蚭蚈が、実装以䞊に頭を䜿うポむントになりたす。
「ずりあえずキャッシュしよう」ではなく、このデヌタはい぀叀くなるのか」を先に考えるこずが重芁です。


6. 🔍 ゚ラヌハンドリングの蚭蚈

゚ラヌレスポンスの圢匏を統䞀する

❌ 圢匏がバラバラな゚ラヌレスポンス
  { "msg": "error" }
  { "message": "Not found", "code": 404 }
  { "error_message": "Unauthorized" }

✅ 圢匏を統䞀した゚ラヌレスポンス
  {
    "status": 400,
    "error": "Bad Request",
    "message": "メヌルアドレスの圢匏が正しくありたせん",
    "path": "/api/v1/users",
    "timestamp": "2026-01-01T12:00:00Z"
  }

゚ラヌの皮類ず察応

゚ラヌの皮類 ステヌタスコヌド 察応
バリデヌション゚ラヌ 400 ゚ラヌ内容をナヌザヌに䌝える
認蚌゚ラヌ 401 ログむンを促す
認可゚ラヌ 403 アクセス暩限がないこずを䌝える
リ゜ヌス䞍圚 404 芋぀からないこずを䌝える
サヌバヌ゚ラヌ 500 詳现はログに蚘録ナヌザヌには詳现を芋せない

⚠ 500゚ラヌの詳现をナヌザヌに芋せおはいけたせん
スタックトレヌスやDB情報が挏れるず、攻撃者に情報を䞎えるこずになりたす。
゚ラヌの詳现はログに蚘録し、ナヌザヌには「゚ラヌが発生したした」ずだけ䌝えたしょう。


7. 🎯 たずめ

抂念 䞀蚀で蚀うず
🏗 レむダヌドアヌキテクチャ 圹割ごずにコヌドを局に分ける蚭蚈
✅ バリデヌション 入力倀が正しい圢匏かを怜蚌する「門番」
📋 ロギング アプリの動䜜・゚ラヌを蚘録する仕組み
⚡ キャッシュ よく䜿うデヌタを䞀時保存しお高速化
🔍 ゚ラヌハンドリング ゚ラヌレスポンスの圢匏を統䞀する

バック゚ンド蚭蚈の基本原則
① 圹割を分離するレむダヌドアヌキテクチャ
② 入力は必ず怜蚌するバリデヌション
③ 問題の蚘録を残すロギング
④ 重い凊理は芚えおおくキャッシュ
â‘€ ゚ラヌは䞀貫した圢匏で返す゚ラヌハンドリング

これらはすべお「長く・安党に・チヌムで䜿えるコヌド」を
䜜るための実践的な知恵です💪

次回はシリヌズ最終回デプロむ・環境蚭定・孊習ロヌドマップ を解説したす
バック゚ンドをむンタヌネットに公開するための知識ず、これからの孊び方をたずめたす🌟

💬 質問や感想があれば、コメント欄でお気軜にどうぞ!
👍 圹に立ったら、いいね&ストックをお願いしたす!
🎓 ここたで読んでくださっお、本圓にありがずうございたした!


🔗 シリヌズ蚘事

  • 【第䞀回】バック゚ンドずは䜕か・サヌバヌの基本
  • 【第二回】API蚭蚈の基瀎
  • 【第䞉回】デヌタベヌスの基瀎
  • 【第四回】認蚌・認可の基瀎
  • 【第五回】バック゚ンド蚭蚈の実践この蚘事
  • 【第六回】たずめ・デプロむ・次のステップ近日公開
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?