バリデーション
バリデーション(Validation)**とは、一言で言うと「入力されたデータが、決められたルールに沿って正しく構成されているかを確認する作業」**のことです。日本語では「入力チェック」や「妥当性確認」と呼ばれます。
ITの世界では、ユーザーがどんな値を入力してくるか分かりません。そのため、システムが壊れたり不正なデータが保存されたりしないよう、入り口で厳重にチェックを行う必要があります。
1. なぜバリデーションが必要なのか?¶
バリデーションを怠ると、以下のような問題が発生します。
- システムのクラッシュ: 数字を期待している場所に「文字」が入ると、計算ができずエラーで止まる。
- データの不整合: 「2024年2月30日」のような存在しない日付が登録されてしまう。
- セキュリティリスク: 悪意のあるプログラムコードを入力され、データベースを操作される(SQLインジェクションなど)。
2. バリデーションの3つのレベル¶
実務では、以下の3段階でチェックをかけることが一般的です。
| レベル | 場所 | 役割 |
|---|---|---|
| フロントエンド | ブラウザ上 (JS) | ユーザーへの親切心。 送信ボタンを押す前に「未入力ですよ」と教える。 |
| バックエンド | サーバー (Python等) | 最後の砦。 悪意のある攻撃や、ブラウザを介さない不正な送信を阻止する。 |
| データベース | DB (SQL) | データの整合性。 重複したIDや、定義外のデータ型を拒否する。 |
3. 具体的なチェック項目の例¶
5,000行程度のシステム開発でも、以下のようなバリデーションコードが数百行から千行ほどを占めることになります。
- 必須チェック: 名前やメールアドレスが空欄ではないか。
- 型チェック: 年齢の欄に「漢字」が入っていないか。
- 範囲チェック: 注文個数が「-1」などのマイナスになっていないか。
- 形式チェック: メールアドレスに「@」が含まれているか。
- 相関チェック: 「貸出開始日」が「返却予定日」より後の日付になっていないか。
4. Pythonでの実装イメージ(スタブ)¶
前述のディレクトリ構成にあった services/loan_logic.py などで、以下のように記述されます。
Python
def validate_loan_period(start_date, end_date):
# 1. 型のチェック
if not isinstance(start_date, date):
raise ValueError("開始日が日付形式ではありません")
# 2. 論理的なチェック
if start_date > end_date:
raise ValueError("開始日は終了日より前である必要があります")
# 3. 業務ルールのチェック
if (end_date - start_date).days > 30:
raise ValueError("30日を超える長期貸出はできません")
次のステップへの提案¶
バリデーションには、**「間違っていたときにユーザーにどう伝えるか(エラーメッセージ)」**のデザインも重要です。
もしよろしければ、**「実際にPythonでよく使われるバリデーション用ライブラリ(Pydanticなど)」**の使い方を紹介しましょうか? それとも、**セキュリティ対策としてのバリデーション**について詳しく知りたいですか?