공공데이터 11만 건으로 화장실·주차장·충전소 지도 만들면서 배운 것들
밖에서 급하게 화장실을 찾을 때마다 검색이 잘 안 된다는 게 불편했는데, 찾아보니 행정안전부가 전국 공중화장실 데이터를 공개하고 있더군요. 문제는 CSV 파일로만 올라와 있어서 일반인은 열어볼 일이 없다는 거였습니다.
그래서 그걸 지역별로 찾아볼 수 있게 정리했습니다.
https://dongnemap.kr
뭘 담았나
시설 한 곳 = 페이지 한 개, 총 110,386개입니다.
- 공중화장실 50,665곳 (행정안전부)
- 공영주차장 18,853곳 (공공데이터포털 표준데이터)
- 전기차 충전소 40,868곳 (환경부)
전국 시·군·구 전부 있고, 로그인·앱·광고 없습니다.
1. 좌표가 없었습니다
화장실 5만 건 중 위경도가 들어 있는 게 7,195건뿐이었어요. 86%가 주소만 있었습니다. 지도 서비스인데 지도에 못 찍으면 의미가 없어서 주소 4.3만 건을 전부 지오코딩했습니다. 지금은 109,636건(99%)이 지도에 표시됩니다.
덕분에 "내 주변 5km" 기능이 가능해졌습니다. 위치 버튼 한 번이면 가까운 순으로 거리까지 나옵니다.
2. 워드프레스에 11만 개 포스트
1인 개발이라 운영 부담을 줄이려고 워드프레스 + 자체 플러그인으로 갔습니다. 대신 스케일 문제를 몇 개 만났습니다.
- 목록 페이지가 매 요청마다 11만 건을 세고 있었음 → 집계 캐시로 0.7초 절약
- 좌표가 postmeta JSON 안에 있어서 반경 검색이 불가능 →
JSON_VALUE로 뽑아(lat, lng)인덱스 테이블을 따로 만들고, 바운딩박스로 후보를 좁힌 뒤 하버사인 정렬. 5km 30건이 10~20ms - 월간 갱신 때 11만 건 전체 재임포트가 5시간 → 제목+데이터 해시 비교로 변경분만 처리해서 3분
3. 지도 이미지는 카카오를 못 씁니다
정적지도 이미지를 서버에 저장하는 건 카카오 운영정책 위반이더군요(공식 답변 확인). 국토부 VWorld 정적지도로 갔습니다. 정부 오픈API라 무료고 캐싱도 허용됩니다. PNG가 92KB인데 JPEG로 바꾸니 21KB, 화질 차이는 없었습니다.
4. 크롤러가 서버를 먹고 있었습니다
색인이 안 늘어서 로그를 봤더니 요청의 62%가 GPTBot이고 Googlebot은 10%였습니다. 2코어 서버라 응답이 3.5초까지 밀렸고, 구글은 느린 서버를 만나면 크롤을 스스로 줄입니다. AI 크롤러를 봇 단위로 분당 30회 제한하고(IP 기준으로 하면 IP 여러 개로 우회됨) SEO 수집기를 차단하니 구글봇 응답이 1초대로 떨어졌습니다.
5. 공공데이터는 현장과 다릅니다 → 제보 버튼
오픈 일주일 만에 영암군에 사시는 분이 구글 검색으로 들어와 영암 페이지를 전부 훑어보시고는 메일을 보내주셨습니다. "삼호읍사무소랑 행정복지센터는 같은 곳이니 하나 지워달라", "농협 화장실은 평일 9~6시만 연다" 같은 내용이었어요. 원천 데이터에는 이름이 바뀐 청사가 따로 남아 있고, 이전한 구청 주소가 그대로인 경우가 꽤 있었습니다.
그래서 시설 페이지마다 "정보가 틀렸어요" 버튼을 달았습니다. 누르면 시설명·주소·관리번호가 채워진 메일이 열립니다. 고친 값은 별도 목록에 저장해서, 매월 원천을 다시 받아도 제보 내용이 덮어써지지 않게 했습니다. 동네 사람이 고쳐주는 정보가 공공데이터보다 정확하더군요.
공공데이터 쓰실 분들께
- 표준데이터는 브라우저 다운로드 버튼이 쓰는
/download/columList.json+/download/standard.json조합으로 인증키 없이 받아집니다 - LOCALDATA 파일서버는 Referer 헤더를 요구하고 인코딩이 CP949입니다
- 좌표 결측률을 먼저 확인하세요. 저는 다 만들고 나서 알았습니다
남은 것
- 읍면동 단위 페이지
- 시설 상세 콘텐츠 보강
피드백 환영합니다. 틀린 데이터 보이면 알려주세요.
전국 화장실·주차장·충전소 11만 곳을 공공데이터로 정리한 지도 서비스
댓글
로그인 후 댓글을 남길 수 있습니다.
아직 댓글이 없습니다.