diff --git a/realestate-lab/app/db.py b/realestate-lab/app/db.py index 6465b85..2bba4d2 100644 --- a/realestate-lab/app/db.py +++ b/realestate-lab/app/db.py @@ -11,7 +11,7 @@ DB_PATH = "/app/data/realestate.db" def _conn(): - c = sqlite3.connect(DB_PATH) + c = sqlite3.connect(DB_PATH, timeout=10) c.row_factory = sqlite3.Row c.execute("PRAGMA journal_mode=WAL;") c.execute("PRAGMA foreign_keys=ON;") diff --git a/realestate-lab/app/main.py b/realestate-lab/app/main.py index f2292e6..4066239 100644 --- a/realestate-lab/app/main.py +++ b/realestate-lab/app/main.py @@ -159,7 +159,11 @@ def api_matches(page: int = Query(1, ge=1), size: int = Query(20, ge=1, le=100)) @app.post("/api/realestate/matches/refresh") def api_matches_refresh(): - run_matching() + try: + run_matching() + except Exception as e: + logger.exception("매칭 실행 실패") + raise HTTPException(status_code=500, detail=str(e)) return {"ok": True} diff --git a/realestate-lab/app/matcher.py b/realestate-lab/app/matcher.py index bfefd4c..e1cc6f6 100644 --- a/realestate-lab/app/matcher.py +++ b/realestate-lab/app/matcher.py @@ -2,7 +2,7 @@ import json import logging from typing import Dict, Any, List -from .db import get_profile, _conn +from .db import _conn, _profile_row_to_dict logger = logging.getLogger("realestate-lab") @@ -115,13 +115,16 @@ def _compute_score( def run_matching(): - """프로필 기반 매칭을 실행하여 결과를 저장한다.""" - profile = get_profile() - if not profile: - logger.info("프로필 미설정 — 매칭 건너뜀") - return - + """프로필 기반 매칭을 실행하여 결과를 저장한다. + 단일 connection으로 프로필 조회 + 매칭 + 저장을 처리하여 DB lock 방지. + """ with _conn() as conn: + profile_row = conn.execute("SELECT * FROM user_profile WHERE id = 1").fetchone() + if not profile_row: + logger.info("프로필 미설정 — 매칭 건너뜀") + return + profile = _profile_row_to_dict(profile_row) + anns = conn.execute( "SELECT * FROM announcements WHERE status IN ('청약예정', '청약중')" ).fetchall()