""" 네이버 지역 검색 API 클라이언트 숙박/펜션 자동완성 검색 기능을 제공합니다. """ import logging from typing import List import aiohttp from config import naver_api_settings logger = logging.getLogger(__name__) class NaverSearchClient: """ 네이버 지역 검색 API 클라이언트 숙박/펜션 카테고리 검색을 위한 클라이언트입니다. """ def __init__(self) -> None: self.client_id = naver_api_settings.NAVER_CLIENT_ID self.client_secret = naver_api_settings.NAVER_CLIENT_SECRET self.api_url = naver_api_settings.NAVER_LOCAL_API_URL async def search_accommodation( self, query: str, display: int = 5, ) -> List[dict]: """ 숙박/펜션 검색 Args: query: 검색어 display: 결과 개수 (기본 5개) Returns: 검색 결과 리스트 (address, roadAddress, title) """ # 숙박/펜션 카테고리 검색을 위해 쿼리에 키워드 추가 search_query = f"{query} 숙박" headers = { "X-Naver-Client-Id": self.client_id, "X-Naver-Client-Secret": self.client_secret, } params = { "query": search_query, "display": display, "sort": "random", # 정확도순 } logger.info(f"[NAVER] 지역 검색 요청 - query: {search_query}") try: async with aiohttp.ClientSession() as session: async with session.get( self.api_url, headers=headers, params=params, ) as response: if response.status != 200: error_text = await response.text() logger.error( f"[NAVER] API 오류 - status: {response.status}, error: {error_text}" ) return [] data = await response.json() items = data.get("items", []) # 필요한 필드만 추출 results = [ { "address": item.get("address", ""), "roadAddress": item.get("roadAddress", ""), "title": item.get("title", ""), } for item in items ] logger.info(f"[NAVER] 검색 완료 - 결과 수: {len(results)}") return results except aiohttp.ClientError as e: logger.error(f"[NAVER] 네트워크 오류 - {str(e)}") return [] except Exception as e: logger.error(f"[NAVER] 예기치 않은 오류 - {str(e)}") return [] # 싱글톤 인스턴스 naver_search_client = NaverSearchClient()