You signed in with another tab or window. Reload to refresh your session.
8000
You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
fix: 무료 위치 검색 쿼터 보호와 정확한 대체 조회
#267
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
사용자는 2026-10-13 무료 주소 API 소진 대응과 무료 대체 검색·자체 DB 검토를 승인했다. 카카오 address API는 전날 정확히 100,000회 성공했고 이후 -10 오류가 누적됐다. 기존 공통 변환에는 공급자 쿼터 차단과 동시 요청 병합이 없고 주소는 네이버 fallback을 하지 않는다.
## 구현 범위
- 카카오 주소/키워드 및 주소 대체 네이버 지역 검색의 HTTP 요청을 고정 공급자 경로로 제한한다. 동일 공급자·자격증명·파라미터·시간 예산의 동시 요청은 진행 중에만 병합하며 완료 후 결과를 보관하지 않는다.
- 카카오 400/code -10은 해당 credential+API별 30분, HTTP429는 60초 중단한다. 재개 시 실제 조회 요청으로만 확인한다. 빈 결과·인증오류·일반 400·5xx는 quota 상태로 저장하지 않는다.
- Cloudflare SQLite-backed Durable Object에 쿼터 상태(해시 scope, 공급자, blockedUntil)만 저장한다. 좌표·주소·응답·API 키는 저장하거나 로그로 남기지 않는다. 내부 DO가 불가하면 외부 API 폭증으로 fallback하지 않는다. CLI/무바인딩은 유한 프로세스 내부 보호를 사용한다.
- 공급자 API URL·method·query·좌표·응답 크기를 제한하고 모든 요청에 기한을 둔다. caller 취소가 다른 병합 요청을 취소하지 않으며 서로 다른 시간 예산은 병합하지 않는다.
- 주소는 카카오 address → 카카오 keyword의 정확한 주소 일치 → 네이버 local의 정확한 주소 일치로 보완한다. 장소명 경로는 기존 Kakao keyword → Naver local을 유지한다. 도로/건물 번호 순서·지역 토큰·한국 좌표를 검증하며 근처 다른 가게·기본 좌표로 바꾸지 않는다.
- 저장된 정확한 공공 주소 DB 구축은 행안부 전자지도 bulk 자료를 우선한다. 본인확인·신청·이용목적 심사 자료가 필요하므로 보유 여부를 사용자에게 질문했고, 자료가 없는 상태에서 전국 DB 구축 완료라고 주장하지 않는다.
## 저장 정책 조사로 수정된 부분
카카오 공식 운영자(2026-09-04)는 좌표 저장·활용을 불허하고 실시간 호출을 요구한다(https://devtalk.kakao.com/t/api/151497). 네이버 Maps/VWorld도 별도 DB 축적이 허용되지 않는 안내가 있다. 따라서 처음 제안한 API 응답의 영구/30일 공유 캐시는 구현하지 않는다. 정부 공공누리 1유형 자료 기반의 자체 주소 DB와 API 응답 캐시는 구별한다.
## GS25 위치 실패 보호
지역을 지정했는데 좌표를 확인하지 못하면 REST/MCP 모두 GS25_LOCATION_UNRESOLVED 503으로 중단한다. 다른 지역/기본 강남 좌표로 재고를 조회하지 않는다. 일치하는 매장의 유효한 한국 native 좌표는 주소 변환보다 우선한다(REST의 기존 direct 장소 검색 후 fallback 순서는 유지). 인증 오류와 위치 오류는 구분한다.
## 검증과 운영
TDD로 동일 요청 병합/완료 후 재호출, quota 상태 지속/만료/endpoint 분리, malformed 입력/본문 제한/timeout/저장 오류/credential 분리, 주소 fallback의 엄격 일치를 검증한다. 기존 서비스 응답 계약과 재고 fresh 동작은 유지한다. check/build/coverage100/독립리뷰/PR CI 후 병합·배포 및 최소 인증 fresh REST/MCP/CLI 검증을 한다. 유료 서비스 활성화나 무료 키 재발급을 통한 한도 우회는 하지 않는다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
fix: 무료 위치 검색 쿼터 보호와 정확한 대체 조회 #267
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Uh oh!
There was an error while loading. Please reload this page.
fix: 무료 위치 검색 쿼터 보호와 정확한 대체 조회 #267
Changes from all commits
008b855File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
There are no files selected for viewing
Large diffs are not rendered by default.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.