[Pilot Test Analysis System] 공간 데이터 관리 및 프론트엔드 대시보드 렌더링 최적화
• 2 min read
스쿨존 및 사고 다발지 데이터를 효율적으로 쿼리하고 응답하기 위한 공간 데이터 처리 파이프라인과 사고 위험도 분석 모델을 구축했으며, 이에 발맞춰 프론트엔드 아키텍처에서 비즈니스 로직과 UI 계층의 결합도를 낮추고 지도 렌더링 성능을 획기적으로 개선했다.
[PostGIS / Architecture] 공간 데이터 아키텍처 도입
- 기존 단순 위경도 조회를 PostGIS의 기하 구조(Geometry) 타입으로 마이그레이션하여, 공간 연산을 데이터베이스 레벨에서 원천적으로 처리하도록 아키텍처를 변경했다.
- 스쿨존 반경 폴리곤 데이터를 데이터베이스 네이티브 쿼리를 통해 직접 GeoJSON 텍스트 형태로 캐싱 및 반환하도록 응답 파이프라인을 최적화했다.
- 스쿨존 중심점과 영역 데이터를 분리하는 엔티티 정규화를 수행하여 쿼리 조회 성능을 대폭 향상시켰다.
[Algorithm / Analysis] 정책 기반 사고 위험도 감쇠 모델 적용
- 도로교통공단 데이터를 활용하여 사고 다발지의 위험도를 단순 사고 건수가 아닌 정책 기반 감쇠 모델로 고도화했다.
- EPDO(대물 피해 환산법) 알고리즘(사망 12점, 중상 3점, 경상 3점, 부상신고 1점)에 시간 감쇠 가중치 및 발생 빈도를 곱하는 수식을 도입했다. 특히 민식이법이 적용된 2020년 기준 0.85 지수 감쇠, 노란 횡단보도가 도입된 2022년 기준 1.0 가중치를 부여하여 최신 도로 인프라 개선 사항이 모델에 반영되도록 설계했다.
- 위험도 점수를 비동기적으로 일괄 재계산하는 백그라운드 분석 파이프라인을 추가했다.
[PostgreSQL / Indexing] Bounding Box 공간 검색 및 인덱싱
- 화면의 줌 레벨과 지도 영역(Bounding Box)에 맞춰 데이터만 선별적으로 조회하는 공간 쿼리 인터페이스를 구현했다.
- GiST(Generalized Search Tree) 공간 인덱스를 테이블에 적용하여 복잡한 교차 영역 검색 쿼리의 실행 속도를 최적화했다.
- 데이터 필터링 부하를 줄이기 위해 카테고리 및 연도별 검색 로직을 백엔드 파라미터 기반으로 위임하여 클라이언트 부하를 원천 해소했다.
[React / Rendering] 맵 렌더링 레이어 모듈화
- 단일 컴포넌트 내부에서 사고 다발지 마커, 스쿨존 폴리곤, 클러스터링을 모두 처리하던 모놀리식 구조를 해체하고, 각각의 독립적인 레이어 컴포넌트로 역할을 분리했다.
- 레이어별로 React 상태(State) 구독을 최소화하여, 주야간 구분 마커(태양/초승달 아이콘) 플로팅이나 데이터 정보 오버레이 시 전체 지도의 무의미한 리렌더링이 발생하지 않도록 렌더 트리 업데이트를 최적화했다.
[React / State Management] 비즈니스 로직 및 상태 관리 추상화
- 데이터 패칭 및 에러 핸들링 로직을 커스텀 훅(Hook)으로 추출하여 뷰(View) 계층과 완벽히 분리했다.
- 차트 줌 및 마우스 인터랙션과 같은 복잡한 상태를 별도의 관리 객체로 이관하여 최상위 컴포넌트의 복잡도를 크게 낮추었다.
- 클라이언트 측의 무거운 상태 파생(Derived State)을 제거하고, 위험도 점수 조건(위험도 40 이상 및 다발지 연도별 5회 이상 발생 혹은 사망자 발생 시 적색 표기) 등의 비즈니스 판단 데이터를 서버에서 정렬 및 필터링된 상태로 직접 받아와 렌더링하도록 데이터 흐름의 단방향성을 강화했다.