From 56c13cbcbd785e6eaaa800fe7681c9f087c39530 Mon Sep 17 00:00:00 2001 From: gahusb Date: Fri, 10 Jul 2026 10:21:04 +0900 Subject: [PATCH] =?UTF-8?q?feat(naver-fetch):=20FastAPI=20lifespan=20+=20h?= =?UTF-8?q?eartbeat=20=EB=B0=B0=EC=84=A0=20+=20/health?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/naver-fetch/main.py | 53 +++++++++++++++++++++++ services/naver-fetch/tests/test_health.py | 6 +++ 2 files changed, 59 insertions(+) create mode 100644 services/naver-fetch/main.py create mode 100644 services/naver-fetch/tests/test_health.py diff --git a/services/naver-fetch/main.py b/services/naver-fetch/main.py new file mode 100644 index 0000000..44a74ce --- /dev/null +++ b/services/naver-fetch/main.py @@ -0,0 +1,53 @@ +"""naver-fetch FastAPI entry — lifespan(fetch_loop + heartbeat_loop) + /health.""" +from __future__ import annotations + +import asyncio +import logging +from contextlib import asynccontextmanager + +import redis.asyncio as aioredis +from fastapi import FastAPI + +import fetch_worker +from config import load_settings +from nas_client import NASClient +from naver_client import NaverClient + +logging.basicConfig(level=logging.INFO, + format="%(asctime)s %(name)s %(levelname)s %(message)s") +logger = logging.getLogger(__name__) + + +@asynccontextmanager +async def lifespan(app: FastAPI): + settings = load_settings() + nas = NASClient(settings.nas_base_url, settings.internal_api_key) + naver = NaverClient(settings.naver_real_estate_type, settings.naver_token_url, + settings.naver_headless) + state = fetch_worker.FetchState() + redis = aioredis.from_url(settings.redis_url, decode_responses=False) + + ft = asyncio.create_task(fetch_worker.fetch_loop(nas, naver, state, settings)) + hb = asyncio.create_task(fetch_worker.heartbeat_loop(redis, state)) + logger.info("naver-fetch lifespan 시작") + try: + yield + finally: + for t in (ft, hb): + t.cancel() + try: + await t + except asyncio.CancelledError: + pass + await naver.close() + await nas.close() + await redis.aclose() + logger.info("naver-fetch lifespan 종료") + + +app = FastAPI(lifespan=lifespan) + + +@app.get("/health") +def health(): + return {"ok": True, "service": "naver-fetch"} diff --git a/services/naver-fetch/tests/test_health.py b/services/naver-fetch/tests/test_health.py new file mode 100644 index 0000000..11026ee --- /dev/null +++ b/services/naver-fetch/tests/test_health.py @@ -0,0 +1,6 @@ +"""/health — 핸들러 직접 검증.""" +from main import health + + +def test_health(): + assert health() == {"ok": True, "service": "naver-fetch"}