중급약 25분API공공데이터
공공데이터포탈 Open API 활용하기
data.go.kr 활용신청부터 인증키 Encoding/Decoding 함정, 첫 호출, 페이징 수집까지. 기상청·실거래가·미세먼지 등 대표 서비스 예시 포함.
01
준비: 활용신청과 승인
공공데이터포탈(data.go.kr)은 정부·공공기관 데이터의 창구입니다. 키 하나로 수만 개 서비스를 씁니다.
1) 회원가입·로그인
2) 데이터 찾기 — '기상청 단기예보', '아파트 실거래가'처럼 검색 → 결과에서 '오픈 API' 유형을 고릅니다 (파일데이터는 그냥 다운로드)
3) 상세 페이지에서 [활용신청] → 활용목적 간단히 입력 → 신청
· 대부분 자동승인 (수십 분 이내, 일부는 심사로 며칠)
4) [마이페이지] → [데이터 활용] → 개발계정에서 '일반 인증키' 확인
같은 포털의 키로 다른 서비스를 추가할 때도 '서비스마다 활용신청'이 필요합니다. 키는 하나인데 권한은 서비스별로 생기는 구조입니다.
02
인증키 Encoding vs Decoding — 최다 질문 1위
마이페이지에 인증키가 두 버전으로 보입니다. 내용은 같은 키인데 URL 인코딩을 했느냐의 차이입니다.
· Encoding 키: %2B, %2F, %3D 같은 기호가 보임 → URL 문자열에 '직접 붙여 넣을' 때
· Decoding 키: +, /, = 기호가 그대로 보임 → 코드 라이브러리가 '자동으로 인코딩해 줄' 때
규칙 하나만 기억하세요:
· fetch(`...?serviceKey=${KEY}`)처럼 문자열에 박으면 → Encoding 키
· requests.get(url, params={serviceKey: KEY})처럼 라이브러리에 맡기면 → Decoding 키
Decoding 키를 URL에 직접 박으면 '+'가 깨지고, Encoding 키를 params에 넣으면 이중 인코딩됩니다. 둘 다 결과는 SERVICE_KEY_IS_NOT_REGISTERED_ERROR. 키가 맞는데 이 에러가 나오면 99% 이것입니다.
03
첫 호출 — 공통 패턴
어떤 서비스든 형태가 같습니다. 상세 페이지의 '요청 메시지' 샘플을 복사해 키만 바꾸는 게 가장 빠릅니다.
GET https://apis.data.go.kr/{기관코드}/{서비스명}/{오퍼레이션}
?serviceKey=인증키
&pageNo=1
&numOfRows=10
예) 기상청 단기예보 조회:
GET https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst
?serviceKey=인증키&dataType=JSON&numOfRows=10&pageNo=1
&base_date=20260805&base_time=0500&nx=91&ny=77
· base_date·base_time: 예보 '발표' 시각 (발표 시각표는 참고문서에)
· nx·ny: 위경도가 아니라 기상청 격자 좌표! 참고문서의 엑셀(격자표)에서 내 지역을 찾습니다 — 공공데이터 특유의 함정 1위
응답 구조도 공통입니다:
· response.header.resultCode '00'이면 정상
· response.body.totalCount 전체 건수 / items.item 배열이 실제 데이터
· numOfRows·pageNo로 페이징
04
JSON으로 받기 — 서비스마다 다릅니다
기본 응답은 XML인 경우가 많고, JSON 전환 파라미터 이름이 서비스마다 제각각입니다. 상세 페이지 참고문서에서 확인하세요.
· dataType=JSON (기상청 등)
· _type=json (한국관광공사 TourAPI 등)
· resultType=json (일부 지자체)
· type=json (일부)
응답이 XML이면 코드에서 파싱이 번거롭습니다. 에이전트에게 '응답을 JSON으로 받는 파라미터를 참고문서에서 찾아 적용해 줘'라고 시키거나, 처음부터 에이전트에게 참고문서 텍스트를 붙여 주는 게 가장 정확합니다.
브라우저 주소창에 요청 URL을 그대로 붙여 응답을 눈으로 먼저 보는 것 — 이것이 공공데이터 디버깅의 기본입니다. 화면에 데이터가 보이면 코드 문제, 에러 XML이 보이면 키·파라미터 문제입니다.
05
자주 쓰는 서비스 5선
① 기상청 단기예보 (1360000/VilageFcstInfoService_2.0)
오늘~모레 날씨. base_date/base_time/nx/ny 필요. 대시보드 배경에 좋습니다
② 국토교통부 아파트 매매 실거래가 (1613000/RTMSDataSvcAptTrade/getRTMSDataSvcAptTrade)
LAWD_CD(법정동코드 앞 5자리, 예: 창원 성산 48121)·DEAL_YMD(계약월, 202607)
지역 부동산 동향 집계에 바로 쓰입니다. 법정동코드 전체 파일은 포털에서 별도 다운로드
③ 한국환경공단 에어코리아 미세먼지 (B552584/ArpltnInforInqireSvc)
측정소별 실시간 농도·시도별 평균
④ 한국관광공사 TourAPI (B551011/KorService2)
관광지·축제·행사 검색. 지역 행사 안내 페이지에
⑤ 지자체 상권·시설 현황
'경상남도 창원시'로 검색하면 어린이집·주차장·도서관 현황 등이 REST로 나옵니다
선택 기준: 데이터 찾기에서 서비스유형 REST + 확장자 JSON으로 걸러서 고르면 시행착오가 줄어듭니다.
06
전체 수집과 트래픽 관리
목록이 긴 데이터는 페이징 루프로 받습니다.
1) pageNo=1&numOfRows=100으로 호출 → totalCount 확인
2) 필요 페이지 수 = 올림(totalCount ÷ 100)
3) pageNo를 늘려가며 반복, 호출 사이 0.1~0.3초 간격
4) 받은 건을 CSV로 저장 (한 번 받은 데이터는 다시 부르지 않기)
트래픽 제한은 서비스별로 다릅니다(상세 페이지에 '일 트래픽' 표기). 개발계정 기본량을 넘으면 LIMIT 관련 에러가 나고, 운영계정 전환 신청으로 상향할 수 있습니다.
습관 세 가지:
· 수집 결과는 반드시 파일로 저장 — 같은 호출을 반복하지 않기
· 날짜·지역을 바꿔가며 돌리는 대량 수집은 밤에, 간격 넉넉히
· '오늘 받은 것'과 '어제 받은 것'을 합칠 때 중복 제거 키(일자+지점 등)를 정해 두기
07
함정 정리
① SERVICE_KEY_IS_NOT_REGISTERED_ERROR → Encoding/Decoding 키 혼용 (앞 섹션). 또는 활용신청 직후라 승인 전
② 에러가 나도 HTTP 200인 경우가 많습니다. 응답 본문의 resultCode를 꼭 확인하세요
③ 기본 응답이 XML → JSON 파라미터 이름을 참고문서에서 확인
④ nx/ny처럼 위경도가 아닌 좌표계를 쓰는 서비스가 있습니다. 참고문서의 좌표표를 먼저 받으세요
⑤ 일부 구형 서비스는 http 주소만 열립니다. https로 바꿔 안 되면 문서의 주소 그대로
⑥ 승인이 안 됐는데 계속 호출하면 IP가 차단될 수 있습니다. 승인 상태를 먼저 확인
⑦ 인증키도 비밀번호입니다. 코드에 박지 말고 환경변수로, GitHub에 올라갔으면 재발급
08
에이전트에게 시킬 문장 (복붙용)
공공데이터는 참고문서를 통째로 붙여 주는 게 정확도를 크게 올립니다.
[데이터 수집 스크립트]
공공데이터포탈의 아래 API로 데이터를 수집해 CSV로 저장하는 스크립트를 만들어 주세요.
- 인증키는 DATA_GO_KR_SERVICE_KEY 환경변수(Decoding 키)로 읽고, requests의 params로 전달해 자동 인코딩되게 하세요
- 응답의 resultCode가 '00'인지 먼저 확인하고, 아니면 resultMsg를 출력하고 중단하세요
- numOfRows=100, totalCount만큼 pageNo를 늘려 전체 수집, 호출 간격 0.3초
- 결과는 수집결과.csv로 저장 (엑셀에서 한글 안 깨지게 utf-8-sig)
- 중간에 멈춰도 이미 받은 페이지는 다시 받지 않게 진행 상황을 파일로 남기세요
[참고문서]
(포털 상세 페이지의 요청/응답 명세를 여기에 붙여 넣습니다)
[수집 화면]
수집한 CSV를 읽어 지역별로 집계하고 요약 카드와 표로 보여주는 HTML 화면을 만들어 주세요.
- 서버 업로드 없이 브라우저에서만 파일을 읽으세요
- 빈 칸은 '미입력'으로 묶어 세고, 전체 건수와 분모를 화면에 함께 표시하세요
이어서 실전 카탈로그에서 MCP·Skills를 살펴보세요.