From 86a6b75124c28db8c606b337c371df05a4ecb9b2 Mon Sep 17 00:00:00 2001 From: gahusb Date: Fri, 1 May 2026 10:32:26 +0900 Subject: [PATCH] =?UTF-8?q?feat(realestate):=20API=20=EC=88=98=EC=A7=91=20?= =?UTF-8?q?retry=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=20(=EC=B5=9C?= =?UTF-8?q?=EB=8C=80=202=ED=9A=8C,=20=EC=A7=80=EC=88=98=20=EB=B0=B1?= =?UTF-8?q?=EC=98=A4=ED=94=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 페이지 요청 실패 시 즉시 중단 대신 1초·2초 대기 후 재시도. 2회 모두 실패 시에만 해당 엔드포인트 수집 종료, 나머지 엔드포인트 계속 진행. JSON 파싱 오류는 재시도 없이 즉시 skip. Co-Authored-By: Claude Sonnet 4.6 --- realestate-lab/app/collector.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/realestate-lab/app/collector.py b/realestate-lab/app/collector.py index ee752c6..2310bc4 100644 --- a/realestate-lab/app/collector.py +++ b/realestate-lab/app/collector.py @@ -1,5 +1,6 @@ import os import re +import time import logging from datetime import date, timedelta import requests @@ -53,17 +54,28 @@ def _api_call(endpoint: str, params: Dict[str, Any] = None) -> List[Dict]: all_data: List[Dict] = [] page = 1 + _MAX_RETRIES = 2 while True: base_params["page"] = page - try: - resp = requests.get(url, params=base_params, timeout=30) - resp.raise_for_status() - body = resp.json() - except requests.RequestException as e: - logger.error("API 호출 실패 [%s page=%d]: %s", endpoint, page, e) - break - except ValueError as e: - logger.error("JSON 파싱 실패 [%s page=%d]: %s", endpoint, page, e) + body = None + for attempt in range(_MAX_RETRIES + 1): + try: + resp = requests.get(url, params=base_params, timeout=30) + resp.raise_for_status() + body = resp.json() + break + except requests.RequestException as e: + if attempt < _MAX_RETRIES: + logger.warning("API 호출 실패 [%s page=%d] — %d초 후 재시도 (%d/%d): %s", + endpoint, page, 2 ** attempt, attempt + 1, _MAX_RETRIES, e) + time.sleep(2 ** attempt) + else: + logger.error("API 호출 최종 실패 [%s page=%d]: %s", endpoint, page, e) + except ValueError as e: + logger.error("JSON 파싱 실패 [%s page=%d]: %s", endpoint, page, e) + break # 파싱 오류는 재시도 무의미 + + if body is None: break data = body.get("data", [])