import requests from config import NAVER_CLIENT_ID, NAVER_CLIENT_SECRET, NAVER_GEOCODING_URL class AddressLookup: """네이버 지도 API를 사용하여 주소에서 우편번호를 조회""" def __init__(self): self.client_id = NAVER_CLIENT_ID self.client_secret = NAVER_CLIENT_SECRET self.api_url = NAVER_GEOCODING_URL if not self.client_id or not self.client_secret: raise ValueError( "네이버 API 인증 정보가 없습니다. " ".env 파일에 NAVER_CLIENT_ID와 NAVER_CLIENT_SECRET을 설정하세요." ) def get_postal_code(self, address): """ 주소를 입력받아 우편번호를 조회합니다. Args: address (str): 조회할 주소 Returns: str: 우편번호 (조회 실패 시 빈 문자열) """ try: headers = { 'X-NCP-APIGW-API-KEY-ID': self.client_id, 'X-NCP-APIGW-API-KEY': self.client_secret } params = { 'query': address } response = requests.get( self.api_url, headers=headers, params=params, timeout=5 ) if response.status_code == 200: data = response.json() # 응답에서 주소 정보 추출 if data.get('addresses') and len(data['addresses']) > 0: first_result = data['addresses'][0] # 우편번호는 'addressElements'에서 '법정동' 정보와 함께 제공됨 postal_code = first_result.get('postalCode', '') if postal_code: return postal_code else: print(f"⚠ 경고: '{address}' - 우편번호 정보 없음") return '' else: print(f"✗ 실패: '{address}' - 주소 검색 결과 없음") return '' else: print(f"✗ API 오류: {response.status_code} - {address}") return '' except requests.exceptions.Timeout: print(f"✗ 타임아웃: '{address}' - 요청 시간 초과") return '' except requests.exceptions.RequestException as e: print(f"✗ 네트워크 오류: '{address}' - {str(e)}") return '' except Exception as e: print(f"✗ 오류: '{address}' - {str(e)}") return '' def get_postal_codes_batch(self, addresses): """ 여러 주소의 우편번호를 일괄 조회합니다. Args: addresses (list): 주소 리스트 Returns: dict: {주소: 우편번호} 형태의 딕셔너리 """ results = {} for i, address in enumerate(addresses, 1): print(f"진행 중... ({i}/{len(addresses)})") results[address] = self.get_postal_code(address) return results