2026年01月06日の日記 📖
ヤドン
今日のメモ
勉強時間:10時間
今日はのりぴーさんに、ちょっと早いRUNTEQ大学付属病院お悩み相談をしてもらった笑
一段視野が広がる話も素晴らしかったし、のりぴーさんが言ってたことを、ひさじゅ校長がその日の生配信で同じことを言っていて驚いた
RUNTEQ生で悩みがない人なんかいないだろうし、ひょっとすると下記のイベントはチャンスなのかも
RUNTEQ大学付属病院 総合診療編
https://school.runteq.jp/v2/runteq_events/1728
# 📅 開発日誌 (2026/01/05) - DB設計の最適化とN+1問題へのアプローチ
## 📝 概要
本日は、コードレビューで指摘を受けたデータベース設計の最適化と、アプリケーション全体のパフォーマンス改善に取り組みました。
単に機能を追加するだけでなく、「将来の拡張性」や「セキュリティ」、「運用時の負荷」を考慮したリファクタリングを実施。また、静的解析ツール(Brakeman)の警告にも即座に対応し、堅牢なアプリケーション基盤を構築しました。
### 📸 スクリーンショット
[](https://gyazo.com/64860b5543da663f10485e3604e4e2c0)
## 🚀 技術的な取り組みと成果
### 1. データベース設計の堅牢化 (Schema Refinement)
将来的な仕様変更や外部連携のリスクを考慮し、[users]テーブルのカラム定義を見直しました。
- **Google認証用画像URLの型変更**:
- `string` (255文字) から `text` 型へ変更し、将来的にURLが長大化した場合の切り捨てリスクを排除。
- アプリケーション層 ([User]モデル) で最大長制限とHTTPS形式のバリデーションを追加し、データの整合性を担保。
- **ユーザー名の正規化**:
- ストレージ効率とUXを考慮し、上限を50文字に設定 (`limit: 50`)。
- 本番データの状況を確認した上で安全にマイグレーションを実行。
### 2. パフォーマンス・チューニング (Fixing N+1 Queries)
管理画面やタイムラインでの表示速度低下を防ぐため、Active Recordの発行クエリを最適化しました。
- **ActiveStorageのアバター画像のEager Loading**:
- [User]に紐づく [uploaded_avatar]表示時に発生していたN+1問題を特定。
- `includes(user: { uploaded_avatar_attachment: :blob })` を明示的に呼び出すようコントローラーとスコープ (`Post.with_associations`) を修正。
- これにより、リスト表示時のDBアクセス回数を大幅に削減。
### 3. セキュリティ強化 (Security Hardening)
セキュリティスキャンツール **Brakeman** のレポートに基づき、潜在的な脆弱性を修正しました。
- **正規表現のアンカー修正**:
- URLバリデーションにおいて、行頭 `^` / 行末 `$` ではなく、文字列の先頭 `\A` / 末尾 `\z` を使用するように修正。
- 改行コードを含む悪意のある入力(バリデーションバイパス攻撃)を未然に防ぐ実装へ変更。
### 4. 品質保証とドキュメント整備
- **RSpec / RuboCop**: 修正に伴うテストの修正(WebMockのHTTPS対応など)を行い、全テスト(321件)のPassを確認。
- **Pull Request改善**: レビューワーとの共通認識を深めるため、リスクや影響範囲を明記したPRテンプレートを整備。
## 💡 学んだこと・工夫した点
- **「動けばいい」からの脱却**:
これまでは機能実装を優先していましたが、今回は「データ型ひとつが将来の運用にどう影響するか」を深く考えました。特に外部API(Google)の仕様変更リスクを考慮して `text` 型を選択した点は、設計判断として良い経験になりました。
- **セキュリティは細部に宿る**:
正規表現の `^/$` と `\A/\z` の違いは些細に見えますが、セキュリティホールになり得ることを再認識しました。自動化ツール(Brakeman)の指摘を単に修正するだけでなく、その「理由(Why)」を理解してコードに落とし込む姿勢を大切にしました。
- **チーム開発を意識したコミュニケーション**:
PRにおいて「変更しました」だけでなく、「なぜ変更したのか」「既存データへのリスク確認結果(0件でした)」といった**エビデンスベース**の報告を行うことで、レビューワーの負担を減らし、信頼獲得につながるよう心がけました。
今日はのりぴーさんに、ちょっと早いRUNTEQ大学付属病院お悩み相談をしてもらった笑
一段視野が広がる話も素晴らしかったし、のりぴーさんが言ってたことを、ひさじゅ校長がその日の生配信で同じことを言っていて驚いた
RUNTEQ生で悩みがない人なんかいないだろうし、ひょっとすると下記のイベントはチャンスなのかも
RUNTEQ大学付属病院 総合診療編
https://school.runteq.jp/v2/runteq_events/1728
# 📅 開発日誌 (2026/01/05) - DB設計の最適化とN+1問題へのアプローチ
## 📝 概要
本日は、コードレビューで指摘を受けたデータベース設計の最適化と、アプリケーション全体のパフォーマンス改善に取り組みました。
単に機能を追加するだけでなく、「将来の拡張性」や「セキュリティ」、「運用時の負荷」を考慮したリファクタリングを実施。また、静的解析ツール(Brakeman)の警告にも即座に対応し、堅牢なアプリケーション基盤を構築しました。
### 📸 スクリーンショット
[](https://gyazo.com/64860b5543da663f10485e3604e4e2c0)
## 🚀 技術的な取り組みと成果
### 1. データベース設計の堅牢化 (Schema Refinement)
将来的な仕様変更や外部連携のリスクを考慮し、[users]テーブルのカラム定義を見直しました。
- **Google認証用画像URLの型変更**:
- `string` (255文字) から `text` 型へ変更し、将来的にURLが長大化した場合の切り捨てリスクを排除。
- アプリケーション層 ([User]モデル) で最大長制限とHTTPS形式のバリデーションを追加し、データの整合性を担保。
- **ユーザー名の正規化**:
- ストレージ効率とUXを考慮し、上限を50文字に設定 (`limit: 50`)。
- 本番データの状況を確認した上で安全にマイグレーションを実行。
### 2. パフォーマンス・チューニング (Fixing N+1 Queries)
管理画面やタイムラインでの表示速度低下を防ぐため、Active Recordの発行クエリを最適化しました。
- **ActiveStorageのアバター画像のEager Loading**:
- [User]に紐づく [uploaded_avatar]表示時に発生していたN+1問題を特定。
- `includes(user: { uploaded_avatar_attachment: :blob })` を明示的に呼び出すようコントローラーとスコープ (`Post.with_associations`) を修正。
- これにより、リスト表示時のDBアクセス回数を大幅に削減。
### 3. セキュリティ強化 (Security Hardening)
セキュリティスキャンツール **Brakeman** のレポートに基づき、潜在的な脆弱性を修正しました。
- **正規表現のアンカー修正**:
- URLバリデーションにおいて、行頭 `^` / 行末 `$` ではなく、文字列の先頭 `\A` / 末尾 `\z` を使用するように修正。
- 改行コードを含む悪意のある入力(バリデーションバイパス攻撃)を未然に防ぐ実装へ変更。
### 4. 品質保証とドキュメント整備
- **RSpec / RuboCop**: 修正に伴うテストの修正(WebMockのHTTPS対応など)を行い、全テスト(321件)のPassを確認。
- **Pull Request改善**: レビューワーとの共通認識を深めるため、リスクや影響範囲を明記したPRテンプレートを整備。
## 💡 学んだこと・工夫した点
- **「動けばいい」からの脱却**:
これまでは機能実装を優先していましたが、今回は「データ型ひとつが将来の運用にどう影響するか」を深く考えました。特に外部API(Google)の仕様変更リスクを考慮して `text` 型を選択した点は、設計判断として良い経験になりました。
- **セキュリティは細部に宿る**:
正規表現の `^/$` と `\A/\z` の違いは些細に見えますが、セキュリティホールになり得ることを再認識しました。自動化ツール(Brakeman)の指摘を単に修正するだけでなく、その「理由(Why)」を理解してコードに落とし込む姿勢を大切にしました。
- **チーム開発を意識したコミュニケーション**:
PRにおいて「変更しました」だけでなく、「なぜ変更したのか」「既存データへのリスク確認結果(0件でした)」といった**エビデンスベース**の報告を行うことで、レビューワーの負担を減らし、信頼獲得につながるよう心がけました。
visibility
公開