성진혁
← Projects

교통약자 대상 경로 안내 — 개인화 ETA · 접근성 데이터 통합

배리어프리 길찾기 (My ETA)

기간
2026 · 해커톤
역할
백엔드 · 프론트엔드 — 커밋 기준 최다 기여 (전체 코드의 91%)
참여 인력
7명 — 개발 4명 / 기획·리서치 3명 (24시간 해커톤)
Python 3.12FastAPIPydanticHTTPXTMAP API서울 공공데이터Kakao LocalpytestOpenAPI 3.1
GitHub에서 코드 보기 ↗

서비스

노약자·휠체어 이용자·임산부처럼 이동에 조건이 붙는 사람을 위한 길찾기 서비스입니다.

일반 지도의 예상 도착시간은 표준 보행속도를 씁니다. 그래서 교통약자에게는 늘 틀리고, 그 오차가 대중교통을 놓치게 만듭니다.

이동 유형과 보조기구를 프로필로 받고 안내 중 실제 속도를 모아 ETA를 보정하며, 이탈하거나 놓치면 현재 위치에서 다시 계산합니다.

  1. 로그인
  2. 이동 프로필
  3. 목적지 검색
  4. 경로 · ETA
  5. 안내
  6. 재탐색
  7. 도착
모바일 경로 화면. 일반 안내 기준 11분과 '내 속도로는 18분'이 나란히 놓이고, 턱낮춤 없는 횡단 경고가 붉은 상자로 맨 위에, 그 아래 경사·노면·보도 폭 근거가 줄지어 있다
경로 — 일반 안내와 내 속도로 다시 계산한 시간을 나란히 두고, 왜 더 걸리는지 구간마다 말한다 (경로 값은 저장소의 목 프로바이더가 만든 합성 데이터)
모바일 지도 화면. 상단에 학습된 보행속도 0.8m/s가 표시되고 지도에 현위치가 찍혀 있다
현위치 — 상단의 보행속도는 안내를 마칠 때마다 갱신된다. 표준 속도가 아니라 이 사람의 속도다
데모 UI
React 19 · TypeScript · Vite · Tailwind · 카카오 지도 SDK
직접 띄워보기
backend: ROUTE_PROVIDER=mock uvicorn · frontend: vitelocalhost:5180

e2e가 화면에서 재현하는 것

  • 카카오 지도·장소 검색은 실제 SDK를 호출한다 — 화면의 서울역 검색 결과는 실제 응답이다
  • 경로·ETA 값은 저장소가 제공하는 목 프로바이더(ROUTE_PROVIDER=mock)의 합성 데이터다. mocks/README.md가 실제 정보처럼 표시하지 말라고 명시하고 있어 그대로 밝힌다

위 화면은 로컬 데모 실행 결과입니다. 운영 중인 서비스가 아닙니다.

요약

01교통약자 경로 안내 · 외부 API 통합

구간마다 외부를 차례로 묻던 것을 같이 물어 3,097ms → 52ms

변경 전에는 경로 후보마다 구간마다 외부 호출을 하나씩 끝내고 다음으로 넘어가 대기가 일렬로 쌓였고, 변경 후에는 모든 구간의 호출을 한꺼번에 띄워 가장 느린 하나로 끝나는 구조를 비교한 타임라인
접근성 정보 붙이기 — 차례로 기다리기 vs 같이 묻기

문제 원인

  1. 경로 하나에 접근성 정보를 붙이려면 구간마다 엘리베이터·저상버스·실시간 도착을 외부에 물어야 함
  2. 구간끼리 서로 필요로 하는 게 없는데도 차례로 기다려, 응답 시간이 호출들의 합이 됨 — 저장소 전체에 asyncio.gather가 0건
  3. 경로 후보가 여러 개면 같은 역을 후보마다 다시 물어 호출이 후보 수만큼 배로 늘어남

해결 과정

  1. 구간별 호출과 구간 안의 독립 호출(승·하차역 엘리베이터·승강기 목록·실시간 도착)을 asyncio.gather로 묶음
  2. 같은 역·같은 정류장이 여러 후보에 겹치면 한 번만 묻고 결과를 나눠 씀 — 버스 provider가 쓰는 것과 같은 기준으로 동일 정류장을 판정
  3. provider마다 시간 한도를 두고 넘기면 그 항목만 '확인 안 됨'으로 내림 — 이 서비스가 원래 하던 처리의 연장으로, 늦은 것과 못 받은 것을 같게 다룸

결과

  1. 대기가 구간 수에 비례해 늘던 것이 구간 수와 무관해짐 — 구간 1개 258ms, 4개 1,031ms이던 것이 둘 다 52ms
  2. 경로 후보 3개 기준 외부 호출 60회 → 20회, 대기 3,097ms → 52ms
  3. 영영 답하지 않는 외부를 넣어도 응답이 붙들리지 않고 '확인 안 됨'으로 내려가는 것을 테스트로 고정

구현 기능

위 문제 해결 외에, 서비스가 돌아가기 위해 구현한 것들입니다.

← Projects