spring-bootjpapdf-generationstatic-mapsasync-processing

[Pilot Test Analysis System] JPA Criteria 서버사이드 집계 및 PDF/Markdown 자동화 파이프라인

2 min read

클라이언트에서 수천 건의 리포트 데이터를 모두 다운로드한 뒤 합산하던 기존 구조는 브라우저 메모리 부하와 느린 렌더링을 유발했다. 또한 인터넷 망이 단절된 오프라인 환경에서는 외부 지도 API를 호출할 수 없어 리포트 내 경로 스냅샷 렌더링이 불가능한 한계가 존재했다. 서버사이드 집계 방식으로 구조를 개편하고, 내부망에서도 독립 동작하는 정적 지도 스냅샷 파이프라인 및 문서 자동화 시스템을 구축하였다.

[Spring Data JPA / DB] Criteria API 기반 다이나믹 필터링 및 서버 집계

  • 자치구, 태그, 기간 등 다양한 조건에 따른 다이나믹 필터링을 지원하기 위해 DriveSessionRepositoryJpaSpecificationExecutor를 도입함.
  • CriteriaBuilder를 활용하여 데이터베이스 단에서 총 주행 거리 및 주행 시간 등을 직접 합산(SUM, COALESCE)한 후 페이징된 결과(PagedModel)와 함께 반환하도록 최적화하여 클라이언트 부하를 해소함.

[Java / Data Model] 운전자 반응 지표의 PRT 일원화 및 스키마 통합

  • 분산되어 있던 운전자 반응 지표를 단일화된 인지 반응 시간(Perception-Reaction Time) 모델로 통합함.
  • avgReactionMs, minReactionMs, maxReactionMs 등으로 데이터 모델(SessionReactionSummary)을 일원화하여 통계의 신뢰성을 확보함.

[Thymeleaf / Flying Saucer] XHTML 렌더러 기반 PDF 마크다운 자동 생성 시스템

  • 데이터 직렬화 계층으로 ReportDataDto를 신설하여 웹 UI, 마크다운(Markdown), PDF 변환 프로세스 간의 데이터 소스를 통일함.
  • Flying Saucer(XHTMLRenderer) 라이브러리와 Thymeleaf 템플릿 엔진을 통합하여, 리포트 상세 페이지를 고품질 PDF로 즉시 렌더링하는 시스템(ReportPDFConverter)을 구축함.
  • 한글 폰트 렌더링 누락 이슈를 방지하기 위해 로컬 폰트(KoPubDotumMedium)를 PDF 엔진의 리졸버에 매핑함.

[Docker / SSE] 오프라인 정적 지도 사이드카 연동 및 배치 진행률 브로드캐스트

  • 오프라인 망 지원을 위해 도커 컴포즈에 mxdcodes/docker-staticmaps 기반의 사이드카 컨테이너를 통합함.
  • 핫스팟 좌표를 동적으로 추출하고 로컬 API로부터 정적 지도 스냅샷 이미지(PNG)를 다운로드해 리포트에 내장하도록 구성함.
  • 대량의 PDF 리포트 동시 생성 시 발생하는 타임아웃 방지를 위해 @Async 기반 배치 프로세스를 도입하고, SSE(Server-Sent Events)를 통해 프론트엔드로 진행률을 실시간 브로드캐스트함.