오늘수영: 전국 602곳 수영장 데이터 적재 성공/실패기

오늘수영: 전국 602곳 수영장 데이터 적재 성공/실패기

작성일: 2026년 07월 11일3
하남시 한정 서비스였던 자유수영 정보 앱 '오늘수영'을 전국 서비스로 넓히기 위해 수영장 데이터를 쌓는 과정에서 겪은 시행착오 기록입니다. 성공한 것도, 헛발질한 것도, 아직 채우는 중인 것도 솔직하게 씁니다.

성공 1: KSPO OpenAPI로 전국 602곳 기본 정보 적재

위치 정보 수집에서 두 번의 시도가 있었습니다.

첫 번째 시도 실패: 문체부 엑셀 + 카카오 지오코딩

문화체육관광부 공공체육시설 현황 엑셀 파일로 작업을 시작했습니다. 문제는 이 파일에 위도·경도 좌표가 없다는 점입니다. 수백 곳의 주소를 카카오 지오코딩 API로 변환하려 했으나 주소가 불완전해 검색 실패가 잦았고, API 사용량 제한도 걸렸습니다. 엑셀 + 지오코딩 경로는 포기했습니다.

두 번째 시도 성공: KSPO OpenAPI

국민체육진흥공단(KSPO)의 전국체육시설 OpenAPI(TODZ_API_SFMS_FACI)로 방향을 틀었습니다. 위도·경도가 API 응답에 이미 들어 있었고, 공공/사설 구분과 운영 상태 필드도 깔끔했습니다. API 키 발급 직후 인증 지연으로 401 오류가 났으나 잠시 기다리니 해결되었습니다. 공공·정상운영·좌표 유효 필터를 걸어 공공 수영장 602곳을 데이터베이스에 upsert했습니다. 기존 하남 4곳과 합쳐 총 606곳으로 시작했습니다.

여기엔 뒷이야기가 하나 있습니다. 나중에 지도에서 테스트공단20171111이라는 수영장이 보여 열어 봤더니, 운영주체와 전화번호가 비어 있고 등록 지역(경기도)과 실제 주소(서울 송파구)가 어긋나 있었습니다. KSPO 원본 공공데이터에 섞여 있던 테스트용 더미 시설이 필터를 통과해 그대로 들어온 것이었습니다. 이 한 건을 지우고 하남 지역 중복까지 정리해서 지금은 총 603곳입니다. 공공데이터라도 그대로 믿지 말고 한 번은 걸러야 한다는 걸 다시 배웠습니다.

성공 2: 도시공사 단위 그룹 전략으로 요금 데이터 일괄 채우기

수영장마다 제각각인 요금 정보를 쌓는 데는 다른 접근을 택했습니다.

핵심 인사이트는 공공 수영장 요금은 각 지자체 도시공사가 관할 지역 내 시설에 동일하게 적용한다는 점이었습니다. 창원시설공단, 수원도시공사, 남양주도시공사처럼 한 시군구를 관할하는 공단이 있고, 거기 속한 수영장들은 거의 같은 요금표를 씁니다.

카카오 검색으로 도시공사별 요금을 조사한 뒤 group-fees.json에 정리하고, 시군구 기준으로 DB의 수영장 전체에 일괄 적용했습니다. 예를 들어 경상남도 창원시로 묶인 수영장들에는 창원시설공단 요금(성인 4,000원, 청소년 3,500원, 어린이 3,000원)을 한 번에 씁니다.

개별 수영장마다 홈페이지를 뒤지는 대신 도시공사 단위로 조사했더니 커버리지가 훨씬 높아졌습니다.

반전 있는 실패: 시간표 자동 추출 파이프라인

자유수영 시간표는 이 프로젝트에서 가장 오래 붙잡은 난관입니다. 결론부터 말하면 자동화는 접었지만, 그 과정에서 진짜 원인을 찾아 일부는 돌파했습니다.

카카오 웹/블로그 검색으로 수영장별 시간표 문장을 긁어온 뒤, Gemini API(gemini-2.0-flash-lite)에 전달해 회차별 시간을 JSON으로 추출하는 파이프라인을 만들었습니다. 그런데 겉으로 드러난 문제와 진짜 원인이 달랐습니다.

겉으로는 Gemini API 분당 요청 수 제한(429)이 계속 걸렸습니다. 재시도 로직을 넣어도 한도를 넘으면 그 수영장은 건너뛰었습니다. 하지만 이건 표면이었습니다. 진짜 원인은 따로 있었습니다. AI가 뽑아낸 값이 앱이 실제로 읽는 형식(요일 코드, 시작·종료 시각, 요금 등급이 맞물린 세션 구조)과 어긋나 있어서, 추출에 '성공'해도 화면에는 아무것도 안 떴습니다. 실패의 본체는 API 한도가 아니라 데이터 형식 불일치였습니다.

그리고 더 근본적인 벽이 있었습니다. 전국 공공 수영장 상당수가 공식 홈페이지가 없거나, 있어도 자유수영 시간표를 웹에 올려두지 않습니다. 소스가 없으면 자동화도 없습니다.

그래서 접근을 바꿨습니다. 아무 데서나 긁는 대신 공식 홈페이지가 있는 시설 72곳만 골라 출처를 확인하며 회차표를 수집했습니다. 시설 운영시간과 자유수영 회차를 구분하고, 출처가 불확실하면 버리고, 요금이 안 나오면 비웠습니다. 그 결과 54곳, 283개 회차를 실제 DB에 반영해, 시간표까지 완비된 시설이 32곳에서 82곳으로 늘었습니다.

남은 500여 곳은 원천 자체가 없어 자동화로는 못 채웁니다. 여기는 AI가 만든 초안을 관리자가 승인하는 하이브리드 검수사용자 제보로 지역별로 천천히 채워갈 계획입니다. 잘못된 '지금 열려요'를 띄우지 않으려면 사람이 한 번은 확인해야 한다고 판단했습니다.

정리

항목결과
전국 공공 수영장 위치·기본 정보성공 (KSPO OpenAPI, 602곳)
요금 데이터성공 (카카오 조사 + 도시공사 그룹 일괄 적용)
자유수영 시간표부분 성공 (공식 홈페이지 웹수집 54곳·283회차) + 나머지는 하이브리드 검수·제보

시간표 데이터는 자동화 파이프라인 대신 관리자 어드민과 사용자 제보를 통해 지역별로 천천히 쌓아나갈 계획입니다.