postgisosrmdockerspatial-dataperformance
[Pilot Test Analysis System] 자체 호스팅 OSRM 기반 공간 맵 매칭 파이프라인 구축
• 2 min read
지난 4월 실증 데이터 관리 시스템 운용 과정에서, 여러 클라이언트가 동시에 분석을 요청할 경우 발생할 수 있는 시스템 부하를 사전에 방지하고자 관리자 기능을 분리한 바 있다. 또한 실증 구역(자치구) 방문 기록을 단순 문자열로 수동 매핑해야 하는 구조적 번거로움이 있었다. 이러한 제약 사항을 근본적으로 해결하기 위해 공간 맵 매칭 파이프라인을 새롭게 구축하고 대용량 비디오 업로드 인프라를 최적화했다.
[OSRM / Routing Engine] 자체 호스팅 인프라 통합 및 맵 매칭 고도화
- 외부 API의 쓰로틀링 한계를 극복하기 위해 Docker Compose 환경에 OSRM 컨테이너를 직접 구축했다.
- OSM(OpenStreetMap)의 한국 지역 PBF 데이터를 다운로드하고, 차량 프로필(
car.lua) 기반으로 MLD 알고리즘 전처리를 수행하는entrypoint.sh스크립트를 적용했다. - 테스트 결과,
/route엔드포인트 호출 시 2개의 교차로(삼거리) 정보(직진 방위각 15도, 역방향 195도 진입 불가 등)를 성공적으로 파싱했으며, 1분 23초 분량의 GPS 궤적을/match엔드포인트에 투입하여 도로 형상과 일치시켰다. - 회전 교차로 판정의 사각지대를 해소하기 위해, 주요 고속화도로 및 시내 교차로의 OSM 데이터를 분석하여
roundabout및oneway태그를 처리하는 전용 로직을 추가했다.
[Rust / Analysis Worker] 고속 맵 매칭 및 교차로(Intersection) 추적
- Rust 분석 워커에서 InfluxDB의 GPS 궤적 데이터를 분할(Chunking)하여 OSRM
/matchAPI로 병렬 요청(join_all)을 수행하도록 로직을 구현했다. - Haversine 거리 공식 및 룩어헤드 스캔(Look-ahead scanning)을 적용해
passed_at_ms(Unix Epoch) 시점 기준 교차로 통과 여부를 추적하고, 해당 지점의available_entries와 차량 진행 방향을 비교 분석했다. - OSRM의 맵 매칭 결과와 OBD 조향각 데이터를 결합하여 실제 차량의 턴 방향을 유추하고
session_intersection_mapping테이블에 WKB(Well-Known Binary) 형태의 공간 데이터로 기록했다.
[JPA / PostGIS] 다중 자치구(Multi-District) 아키텍처 도입
- 단순 문자열로 관리되던 기존 세션-자치구 데이터를 다대다(N:M) 구조의 관계형 테이블로 정규화하고, 공간 인덱스(GIST)를 설정하여 복합 지역 검색 성능을 개선했다.
- 서울시 행정구역 폴리곤(GeoJSON)을
geometry(Polygon, 4326)타입으로 적재하는 DataLoader를 구현하여, GPS 데이터만으로도 차량이 경유한 자치구(예: 동작구 대림초 방문 시 금천구, 영등포구 자동 매핑)가 분류되도록 시스템을 개편했다.
[Nginx / Spring Boot] 대용량 비디오 업로드 인프라 최적화
- 4채널 고해상도 주행 영상 스트리밍 시 발생하던 Nginx 413 Payload Too Large 및 Spring Boot OOM 현상을 해소했다.
application.yml의 Multipart 임계치를 10MB 단위 디스크 플러시로 제한하고 최대 파일 크기를 2GB로 상향 조정한 한편,nginx.conf의 프록시 타임아웃을 600초로 대폭 늘려 물리적 데이터 전송 안정성을 확보했다.