1- from fastapi import APIRouter , HTTPException
1+ from fastapi import APIRouter , HTTPException , Depends
22from fastapi .responses import JSONResponse
33import traceback
44from app .schema .recommendation_schema import ReccomendRequest , ReccomendResponse
77
88router = APIRouter (prefix = "/api" , tags = ["recommendation" ])
99
10- # 서비스 초기화
11- elk_client = ELKClient ()
12- deepctr_service = DeepCTRService ()
10+ def services_provider ():
11+ """ELKClient, DeepCTRService 를 최초 호출 시 생성해 캐시합니다.
12+ 생성 과정에서 예외가 나면 None 을 반환해 API 가 503 을 응답하도록 합니다."""
13+ if not hasattr (services_provider , "cache" ):
14+ try :
15+ services_provider .cache = (ELKClient (), DeepCTRService ())
16+ except Exception as e :
17+ print ("[recommendation] 서비스 초기화 실패:" , e )
18+ services_provider .cache = None
19+ return services_provider .cache
1320
1421@router .get ("/recommend" , response_model = ReccomendResponse )
15- async def recommend_places (userid : str , query : str ):
22+ async def recommend_places (
23+ userid : str ,
24+ query : str ,
25+ services = Depends (services_provider )
26+ ):
1627 """Place ID 리스트 기반 추천 API"""
1728 try :
29+ if services is None :
30+ raise HTTPException (status_code = 503 , detail = "Recommendation service not available" )
31+
32+ elk_client , deepctr_service = services
33+
1834 top_places_data , other_places_data = await deepctr_service .rank_places_by_ctr (userid , query )
1935
2036 # 스키마에 맞게 데이터 형식 변환
@@ -41,9 +57,16 @@ async def recommend_places(userid: str, query: str):
4157@router .get ("/recommend/health" )
4258async def recommendation_health ():
4359 """추천 시스템 헬스체크"""
60+ services = services_provider ()
61+ status = "healthy" if services else "unhealthy"
62+ elk_ready = deepctr_ready = "not ready"
63+ if services :
64+ elk_ready = "ready"
65+ deepctr_ready = "ready"
66+
4467 return {
45- "status" : "healthy" if ( deepctr_service and elk_client ) else "unhealthy" ,
46- "elk_client" : "ready" if elk_client else "not ready" ,
47- "deepctr_service" : "ready" if deepctr_service else "not ready" ,
68+ "status" : status ,
69+ "elk_client" : elk_ready ,
70+ "deepctr_service" : deepctr_ready ,
4871 "service" : "recommendation"
4972 }
0 commit comments