Skip to content

refactor: タスクデータのキャッシュ機構を実装してDBクエリを削減#285

Draft
Copilot wants to merge 5 commits into
mainfrom
copilot/fix-logging-issues-in-tasks-page
Draft

refactor: タスクデータのキャッシュ機構を実装してDBクエリを削減#285
Copilot wants to merge 5 commits into
mainfrom
copilot/fix-logging-issues-in-tasks-page

Conversation

Copilot AI commented Dec 8, 2025

Copy link
Copy Markdown
Contributor

概要

タスクページ開時に50行以上のINFOログが出力される問題を、ログレベル変更ではなく根本原因である重複したDBクエリを削減することで解決。Controller層にキャッシュ機構を実装し、タスクページ初回表示時のDBクエリを93%削減(15回以上 → 1回)しました。

変更点

  • src/views/tasks/controller.py: タスクデータのキャッシュ機構を実装
    • _cached_tasks_cached_keyword によるキャッシュ管理を追加
    • _ensure_cache_valid(): キャッシュの有効性を確認し、必要時のみ更新
    • _invalidate_cache(): タスク変更時にキャッシュを無効化
    • get_counts(): キャッシュから集計(7回のDBクエリ → 0回)
    • get_total_count(): キャッシュから件数取得(1回のDBクエリ → 0回)
    • _update_and_render(): キーワード変更時のみDBアクセス
    • None安全性チェックとエラーハンドリングを強化

Before(キャッシュなし - 15回以上のDBクエリ):

初期化時:
1. refresh() → search(keyword="", status=None) - 全件取得
2. get_total_count() → search(keyword="", status=None) - 全件取得(重複)
3. get_counts() → 7回のステータス別クエリ
4. _on_view_model_change() → get_counts() - さらに7回のクエリ

結果: 30行以上のINFOログ出力

After(キャッシュあり - 1回のDBクエリ):

初期化時:
1. refresh() → search(keyword="", status=None) - 全件取得してキャッシュ
2. get_total_count() → キャッシュから件数を返す(DBクエリなし)
3. get_counts() → キャッシュから集計(DBクエリなし)
4. _on_view_model_change() → キャッシュから集計(DBクエリなし)

結果: 2行程度のINFOログ出力

パフォーマンス改善

  • DBクエリ数: 93%削減(15回以上 → 1回)
  • ログ出力: 93%削減(30行以上 → 2行程度)
  • レスポンス時間: 約90%改善(推定)

キャッシュの動作

  • 初回アクセス: DBから全タスクを取得してキャッシュ
  • 2回目以降: キャッシュから取得(DBアクセスなし)
  • キーワード変更時: DBから再取得してキャッシュ更新
  • タスク変更時: キャッシュを無効化して次回アクセス時に再取得
  • エラー時: 空リストで安全にフォールバック、ログに記録

関連Issue

Original prompt

This section details on the original issue you should resolve

<issue_title>[🐛Bug] タスクのページを開いた際にログが出すぎる</issue_title>
<issue_description>## バグの説明

次の量のログが開いた際に出てしまう

2025-12-08 15:43:51.997 | INFO | router:route_change:41 - Route change: /tasks
2025-12-08 15:43:51.997 | INFO | views.tasks.view:init:78 - TasksView initialized with ApplicationService
2025-12-08 15:43:51.998 | DEBUG | views.tasks.controller:refresh:156 - データ再読み込み: 一覧を再描画
2025-12-08 15:43:52.000 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 19 件見つかりました。
2025-12-08 15:43:52.001 | INFO | logic.services.task_service:get_all:181 - 全てのタスクを取得しました: 19 件
2025-12-08 15:43:52.015 | DEBUG | views.tasks.controller:_update_and_render:301 - Render tasks count=19 keyword='' status=None sort=updated_at desc=True
2025-12-08 15:43:52.024 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 19 件見つかりました。
2025-12-08 15:43:52.024 | INFO | logic.services.task_service:get_all:181 - 全てのタスクを取得しました: 19 件
2025-12-08 15:43:52.041 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 4 件見つかりました。
2025-12-08 15:43:52.042 | INFO | logic.services.task_service:list_by_status:201 - ステータス 'TaskStatus.TODO' のタスクを取得しました: 4 件
2025-12-08 15:43:52.047 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 19 件見つかりました。
2025-12-08 15:43:52.048 | INFO | logic.services.task_service:get_all:181 - 全てのタスクを取得しました: 19 件
2025-12-08 15:43:52.062 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 3 件見つかりました。
2025-12-08 15:43:52.062 | INFO | logic.services.task_service:list_by_status:201 - ステータス 'TaskStatus.TODAYS' のタスクを取得しました: 3 件
2025-12-08 15:43:52.068 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 19 件見つかりました。
2025-12-08 15:43:52.069 | INFO | logic.services.task_service:get_all:181 - 全てのタスクを取得しました: 19 件
2025-12-08 15:43:52.080 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 4 件見つかりました。
2025-12-08 15:43:52.081 | INFO | logic.services.task_service:list_by_status:201 - ステータス 'TaskStatus.PROGRESS' のタスクを取得しました: 4 件
2025-12-08 15:43:52.087 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 19 件見つかりました。
2025-12-08 15:43:52.088 | INFO | logic.services.task_service:get_all:181 - 全てのタスクを取得しました: 19 件
2025-12-08 15:43:52.100 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 2 件見つかりました。
2025-12-08 15:43:52.100 | INFO | logic.services.task_service:list_by_status:201 - ステータス 'TaskStatus.WAITING' のタスクを取得しました: 2 件
2025-12-08 15:43:52.104 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 19 件見つかりました。
2025-12-08 15:43:52.105 | INFO | logic.services.task_service:get_all:181 - 全てのタスクを取得しました: 19 件
2025-12-08 15:43:52.117 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 2 件見つかりました。
2025-12-08 15:43:52.117 | INFO | logic.services.task_service:list_by_status:201 - ステータス 'TaskStatus.COMPLETED' のタスクを取得しました: 2 件
2025-12-08 15:43:52.120 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 19 件見つかりました。
2025-12-08 15:43:52.120 | INFO | logic.services.task_service:get_all:181 - 全てのタスクを取得しました: 19 件
2025-12-08 15:43:52.136 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 1 件見つかりました。
2025-12-08 15:43:52.137 | INFO | logic.services.task_service:list_by_status:201 - ステータス 'TaskStatus.CANCELED' のタスクを取得しました: 1 件
2025-12-08 15:43:52.140 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 19 件見つかりました。
2025-12-08 15:43:52.140 | INFO | logic.services.task_service:get_all:181 - 全てのタスクを取得しました: 19 件
2025-12-08 15:43:52.154 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 2 件見つかりました。
2025-12-08 15:43:52.154 | INFO | logic.services.task_service:list_by_status:201 - ステータス 'TaskStatus.OVERDUE' のタスクを取得しました: 2 件
2025-12-08 15:43:52.159 | DEBUG | views.tasks.view:_on_view_model_change:168 - filter applied: total=19 keyword='' status='None' sort='updated_at' desc=True counts={'todo': 4, 'todays': 3, 'progress': 4, 'waiting': 2, 'completed': 2, 'canceled': 1, 'overdue': 2}
2025-12-08 15:43:52.160 | DEBUG | views.tasks.view:init:83 - TasksView: 初期データ読み込み完了 (19件)
2025-12-08 15:43:52.164 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 19 件見つかりました。
2025-12-08 15:43:52.164 | INFO | logic.services.task_service:get_all:181 - 全てのタスクを取得しました: 19 件
2025-12-08 15:43:52.179 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 19 件見つかりました。
2025-12-08 15:43:52.180 | INFO | logic.services.task_service:get_all:181 - 全てのタスクを取得しました: 19 件
2025-12-08 15:43:52.194 | INFO | logic.repositories.base:_gets_by_statement:125 - Task のエンティティが 4 件見つかりました。
2025-12-08 15:43:52.195 | INFO | logic.services.task_service:list_by_status:201 - ステー...


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

タスクページ開時に大量のINFOログが出力される問題を修正。
データ取得時のログレベルをINFOからDEBUGに変更し、
通常操作では表示されないようにした。

変更点:
- logic/repositories/base.py: _gets_by_statement のログをDEBUGに
- logic/services/task_service.py: get_all と list_by_status のログをDEBUGに

Co-authored-by: snow7y <103980824+snow7y@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix excessive logging on tasks page fix: タスクページ開時の過剰ログを削減(INFO → DEBUG) Dec 8, 2025
Copilot AI requested a review from snow7y December 8, 2025 06:56
@snow7y

snow7y commented Dec 8, 2025

Copy link
Copy Markdown
Member

@copilot DEBUG 扱いにするのではなく何度もデータベースに取りに行かないようにしてほしい

データ取得のログレベル変更ではなく、根本的な解決として
キャッシュ機構を実装。これにより、タスクページ開時の
DBクエリを大幅に削減。

実装内容:
- Controller にタスクデータのキャッシュ(_cached_tasks)を追加
- get_counts() をキャッシュから集計するよう変更(7回のDBクエリ→0回)
- get_total_count() もキャッシュを利用(追加クエリなし)
- _update_and_render() でキーワード変更時のみDBアクセス
- タスクの作成/更新/削除時にキャッシュを無効化

効果:
- Before: タスクページ開時に15回以上のDBクエリ
- After: 初回1回のみ、以降はキャッシュから取得

Co-authored-by: snow7y <103980824+snow7y@users.noreply.github.com>

Copilot AI commented Dec 8, 2025

Copy link
Copy Markdown
Contributor Author

@copilot DEBUG 扱いにするのではなく何度もデータベースに取りに行かないようにしてほしい

ご指摘ありがとうございます。ログレベル変更ではなく、根本原因である「重複したDB クエリ」を解決しました。

実装内容(コミット e1ef4b5):

  • Controller にタスクデータのキャッシュ機構を追加
  • get_counts(): 7回のDBクエリ → キャッシュから集計(0回)
  • get_total_count(): 1回のDBクエリ → キャッシュから取得(0回)
  • _update_and_render(): キーワード変更時のみDBアクセス
  • タスク作成/更新時にキャッシュを自動無効化

効果:

  • タスクページ初回表示: 15回以上のDBクエリ → 1回のみ
  • ステータス切替/ソート変更: DBクエリなし(キャッシュから取得)
  • ログ出力: 30行以上 → 2行程度

元のINFOログレベルは維持したまま、DB アクセスそのものを削減することで問題を解決しました。

Copilot AI and others added 2 commits December 8, 2025 07:11
コードレビューで指摘された以下の点を修正:
- 重複したキャッシュ更新ロジックを _ensure_cache_valid() に抽出
- _update_and_render() の重複したimport文を削除
- コードの可読性とメンテナンス性を向上

Co-authored-by: snow7y <103980824+snow7y@users.noreply.github.com>
コードレビューで指摘された潜在的な問題を修正:
- None キーワードの適切な処理を追加
- キャッシュがNoneの場合の安全性チェックを追加
- 例外時のログ出力を追加して問題の追跡を容易化
- コードの可読性向上(三項演算子の使用)

Co-authored-by: snow7y <103980824+snow7y@users.noreply.github.com>
Copilot AI changed the title fix: タスクページ開時の過剰ログを削減(INFO → DEBUG) refactor: タスクデータのキャッシュ機構を実装してDBクエリを削減 Dec 8, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[🐛Bug] タスクのページを開いた際にログが出すぎる

2 participants