네트워크 I/O는 비동기 전용이다(ADR-006). await/async for/async with를 사용하며, Async 접두사 별칭·aio 팩터리·동기 네트워크 경로를 추가하지 않는다. JSON/XML resultCode=03은 최신 계약에 따라 빈 결과로 정규화한다.
이 저장소의 모든 Markdown/RST 문서는 한글로 작성합니다. 공식 API 필드명, 코드 식별자, 명령어, URL, provider 원문처럼 그대로 보존해야 하는 값만 영어를 유지합니다. 새 문서나 기존 문서를 수정할 때도 이 규칙을 우선합니다.
이 문서는 python-kma-api 저장소에서 작업하는 에이전트를 위한 운영 가이드입니다. import package는 kma이며, 세부 구현 규칙은 SKILL.md, API 세부 내용은 kma-api.md와 docs/ 아래 문서를 함께 확인합니다.
- 사용자 요청
- 이
AGENTS.md SKILL.mdkma-api.md,docs/decisions.md,docs/api-coverage.mdREADME.md,AI_AGENT_GUIDE.md및 나머지docs/- 기존 코드와 테스트
- 최소한의 되돌릴 수 있는 가정
문서가 충돌하면 더 높은 우선순위의 문서를 따르고, 필요하면 낮은 우선순위 문서를 갱신합니다.
작업 전에 반드시 다음을 읽는다:
README.md— 프로젝트 개요와 빠른 시작SKILL.md— 프로젝트 불변조건과 DO NOT 규칙docs/resume.md— 현재 진척도와 "다음 한 작업"docs/decisions.md— 관련 ADRdocs/journal.md— 최근 작업 일지 엔트리 3개
python-kma-api는 기상청 공공 날씨 API용 Python 클라이언트이며 import package 이름은kma입니다.- 타입화된 클라이언트의 1차 대상은
VilageFcstInfoService_2.0입니다. - 안정적으로 모델링한 endpoint는 초단기실황, 초단기예보, 단기예보, 예보버전입니다.
- data.go.kr의 다른 KMA REST 서비스는
DataGoKrClient로 범용 호출합니다. - APIHub는
ApiHubClient로authKey기반 path 호출과 탐색 기능을 제공하고,ApiHubGeneratedClient로 공식 목록 endpoint의 함수형 래퍼를 제공합니다. - Python 지원 기준은 3.10 이상입니다.
- 런타임 의존성은
httpx입니다 (ADR-001). - 기본 테스트는 실제 KMA 네트워크 호출 없이 동작해야 합니다.
PC 개발은 Windows 호스트에서 직접 진행합니다. 본 저장소는 Python 패키지이므로 가상환경(.venv)을 구성하여 품질 관리를 수행합니다.
- 에이전트별 고정 worktree:
- ChatGPT Codex:
F:\dev\python-kma-api-codex - Claude Code:
F:\dev\python-kma-api-claude - Google Antigravity 2.0:
F:\dev\python-kma-api-antigravity - 작업마다 브랜치만 새로 만들고, CodeGraph는 worktree마다 1회
codegraph init -i후codegraph sync로 유지합니다.
- ChatGPT Codex:
- 품질 게이트: PR 머지 직전 작업자가 로컬에서 직접 린트와 테스트를 수행합니다.
main직접 푸시 금지 — 반드시 feature 브랜치 + PR 생성 후 로컬/리모트 승인을 받아 머지합니다.- 실제
serviceKey나authKey평문 노출 금지 — 출력, 로그, 커밋, fixture에 절대로 남기지 않습니다. 사용자가 붙여넣은 인증키 공백은 클라이언트 경계에서 제거하고,.env/.env.local로컬 키 로딩을 활용합니다. - 기본 테스트에서 실제 API 호출 금지 — 네트워크 호출 없는 mock/fixture 기반으로 검증해야 합니다. 실제 호출 테스트를 추가할 경우
DATA_GO_KR_SERVICE_KEY가 있을 때만 실행되도록integrationmarker를 사용합니다. nx/ny를 위도/경도로 취급 금지 — WGS84 좌표는 항상lat/lon순서로 다루며, KMA 격자 좌표(nx/ny)와 엄격히 구분합니다. 외부 프로그램용 위치 입력은LatLon/GridPoint또는location=으로 표준화합니다.PCP,SNO범주 문자열을 무조건 float로 변환 금지 —"1.0mm 미만","30.0~50.0mm","강수없음"같은 범주 문자열은 무리하게 숫자로 바꾸지 않고 보존합니다. 대표값이 필요할 때만parse_amount()를 제공합니다.- KMA result code 실패를 빈 리스트 성공처럼 반환 금지 —
resultCode가 "00"/"03" 이외인 경우는 반드시 명시적인 typed exception으로 surface합니다. - data.go.kr와 APIHub의 인증 파라미터 혼용 금지 — data.go.kr 키는
DATA_GO_KR_SERVICE_KEY, APIHub 키는KMA_APIHUB_AUTH_KEY로 엄격히 분리하여 사용합니다. - APIHub endpoint가 항상 JSON을 반환한다고 가정 금지 — 텍스트, 이미지, 바이너리 응답이 섞여 있으므로
response_kind나content타입을 명확히 처리합니다. - 불필요한 wrapper/adapter 계층 추가 금지 — 단순 전달용 wrapper, 장기 호환 alias, 임시 facade를 지양하고, 다른 라이브러리에 검증된 구현이 있으면 라이선스와 출처를 확인한 뒤 프로젝트 내부 구현으로 직접 반영합니다.
- 문서에 로컬 절대 경로 기재 금지 — 문서의 파일 위치 정보는 항상 프로젝트 루트 기준 상대 경로(예:
src/kma/client.py)로 작성합니다.
- 외부 API 관련 작업은 다른 구현보다 먼저 wrapper/adapter/gateway 지양 원칙을 확인하고 문서/코드에 반영한 뒤 진행합니다.
- downstream이 직접 사용할 안정된 public client, typed model, enum, helper를 제공합니다.
- 단순 전달용 wrapper, 장기 호환 alias, 임시 facade를 만들지 않습니다.
- TripMate나
python-krtour-map에서 필요한 endpoint, pagination, cursor, exception, raw payload 계약이 부족하면 이 저장소의 public API를 먼저 안정화합니다. - 다른 라이브러리에 검증된 구현이 있으면 wrapper로 감싸지 말고 라이선스와 출처를 확인한 뒤 현재 구조에 직접 반영합니다. 이때 변경 폭이 최소수정 원칙보다 커지더라도 동작 일치와 유지보수성을 더 중요하게 봅니다.
README.md: 사용자용 개요, 설치, 예제, 모델 요약.AI_AGENT_GUIDE.md: 이 라이브러리를 사용하는 외부 소비자 앱(TripMate 등)을 위한 AI 에이전트 가이드.kma-api.md: 단기예보 endpoint 세부 사항과 KMA 응답 규칙.docs/apihub.md: APIHub 인증키, 범용 호출, 탐색 기능, 응답 형식 규칙.docs/apihub-endpoints.md: APIHub 함수형 endpoint 목록.docs/datagokr.md: data.go.kr 범용 클라이언트와 서비스/operation 예시.docs/api-coverage.md: 현재 구현 범위와 API 개수.docs/testing.md: 테스트 설계, live test 제한, 회귀 테스트 절차.docs/troubleshooting.md: 증상별 원인과 해결책.docs/repeated-mistakes.md: 이미 겪었거나 반복되기 쉬운 실수.SKILL.md: 구현 불변조건과 에이전트용 세부 규칙.AGENTS.md: 작업 라우팅, 모듈 소유권, 검증 체크리스트.CONTRIBUTING.md: 기여 절차.CHANGELOG.md: 릴리스 관점 변경 이력.pyproject.toml: 패키징, 의존성, lint/test 설정.
src/kma/client.py:KmaClient, 타입화된 단기예보 endpoint, 응답 파싱.src/kma/datagokr.py: data.go.kr 범용 서비스/operation 호출.src/kma/_credentials.py: 인증키 정규화와.env/.env.local로딩.src/kma/catalog.py: data.go.kr/APIHub UI용 통합 API 카탈로그 row.src/kma/datagokr_catalog.py: 공공데이터포털 기상청 OpenAPI dataset catalog.src/kma/apihub.py: APIHub 범용 호출,typ02/openApihelper, 탐색 parser, TXT/이미지 응답 helper.src/kma/apihub_endpoints.py: 생성된 APIHub 함수형 endpoint 래퍼.src/kma/enums.py: endpoint, category, SKY/PTY public enum.src/kma/locations.py:LatLon,GridPoint,normalize_location()위치 표준화.src/kma/_http.py: session 생성과 retry 설정.src/kma/grid.py: LCC DFS 격자 변환.src/kma/time_utils.py: KST 기준 base date/time 계산.src/kma/codes.py: category map, 라벨, 단위 힌트, 강수량 문자열 파싱.src/kma/models.py: 사용자에게 반환하는 frozen Pydantic 모델.src/kma/exceptions.py: 예외 계층.src/kma/cli.py: JSON CLI와 APIHub path 호출.tests/: 네트워크 없는 단위 테스트.
담당 파일:
src/kma/client.pysrc/kma/_http.py
확인할 것:
serviceKey를 요청 파라미터로 보냅니다.dataType=JSON을 기본으로 둡니다.pageNo,numOfRows기본값이 있습니다.- fake session 테스트가 요청 파라미터를 검증합니다.
resultCode가 "00"/"03" 이외인 경우는 typed exception입니다.
담당 파일:
src/kma/datagokr.pydocs/datagokr.md
확인할 것:
- URL은
{base_url}/{service}/{operation}형태입니다. serviceKey,pageNo,numOfRows,dataType기본값이 있습니다.- data.go.kr 문서가
ServiceKey를 요구하는 경우service_key_param으로 인증 파라미터 이름을 바꿀 수 있습니다. items()는 단일 dict 응답도 list로 감쌉니다.api_catalog()는 사람이 읽을 수 있는 데이터셋명, gateway, operation, 인증 파라미터, 키 발급 링크를 제공합니다.
담당 파일:
src/kma/apihub.pysrc/kma/apihub_endpoints.pydocs/apihub.mddocs/apihub-endpoints.mdtools/update_apihub_endpoints.py
확인할 것:
- APIHub path는
/api/로 시작해야 합니다. authKey를 자동으로 추가합니다.- 탐색 parser는 sample URL에서
authKey를 제거합니다. - 응답은
text와content를 모두 제공합니다. - 이름 없는 query string은
arg1,arg2순서를 보존합니다. - 생성된 endpoint 수와 문서의 endpoint 수가 일치해야 합니다.
- 포맷정보/예제 첨부 링크는
APIHUB_ATTACHMENTSmetadata와 문서가 일치해야 합니다.
담당 파일:
src/kma/time_utils.py
확인할 것:
- 초단기실황:
HH00, 발표 후 40분. - 초단기예보:
HH30, 발표 후 15분. - 단기예보:
0200/0500/0800/1100/1400/1700/2000/2300, 발표 후 10분. - 전날 자정 경계 케이스를 테스트합니다.
담당 파일:
src/kma/grid.pysrc/kma/locations.py
확인할 것:
- 공식 LCC DFS 상수는 근거 없이 바꾸지 않습니다.
- 서울, 부산, 제주, 강남 검증점이 통과합니다.
- 역변환은 허용 오차로 비교합니다.
LatLon은 WGS84EPSG:4326,GridPoint는 KMA DFS 좌표입니다.location=은lat/lon또는nx/ny와 섞어 쓰지 못해야 합니다.
담당 파일:
src/kma/codes.pysrc/kma/enums.py
확인할 것:
- public enum 값은 KMA wire value와 같아야 합니다.
SKY는1,3,4만 매핑합니다.PTY는 endpoint-aware입니다.PCP,SNO문자열은 보존합니다.parse_amount()는 없음, 미만, 범위, 이상 라벨을 처리합니다.
담당 파일:
- 모든
.md문서
확인할 것:
- 프로젝트 문서는 한글로 작성합니다.
- 파일 위치 정보는
src/kma/client.py,docs/testing.md처럼 프로젝트 루트 기준 상대 경로로 작성합니다. - Python 내부 문서와 docstring은 한글로 작성합니다.
- 코드 식별자, 명령어, URL은 원문을 유지합니다.
- 사용자 예제는 실제 public API와 일치해야 합니다.
- API 개수와 구현 범위는
docs/api-coverage.md에 반영합니다.
-
pytest -q통과 -
ruff check ./mypy src/kma통과 -
docs/journal.md에 작업 항목 추가 (역시간순) -
docs/resume.md의 진척도 갱신 - 의사결정이 있었다면
docs/decisions.md에 ADR 추가 - 사용자 가시 변경이면
CHANGELOG.md갱신
기본 검증:
python -m pytest -q
python -m ruff check .
python -m mypy src/kma실제 API 테스트를 추가할 경우 opt-in으로 둡니다.
DATA_GO_KR_SERVICE_KEY=<decoded service key> python -m pytest -m integration