피드로 돌아가기
How I Built a PDF Invoice Generation API (and What I Learned About PDF Rendering)
Dev.toDev.to
Backend

Locale-aware 포맷팅과 사전 계산 기반 Pagination을 적용한 PDF 생성 API 구축

How I Built a PDF Invoice Generation API (and What I Learned About PDF Rendering)

Jack2026년 4월 16일2intermediate

Context

기존 PDF 라이브러리의 좌표계 불일치와 Headless Browser의 Docker 폰트 깨짐 및 느린 Cold Start 문제로 인한 렌더링 불안정성 발생. 특히 대량의 라인 아이템 처리 시 발생하는 Page Break 제어의 어려움과 국가별 상이한 통화 표기법 처리가 핵심 병목 지점으로 작용.

Technical Solution

  • Locale별 통화 포맷팅 매트릭스 구축을 통한 국가별 통화 표기 정밀도 확보
  • 렌더링 전 각 요소의 예상 높이를 측정하는 Pre-calculation Pass 도입으로 정확한 Pagination 레이아웃 설계
  • 외부 로고 URL 요청 시 Timeout 설정 및 Fallback 메커니즘 구축을 통한 생성 프로세스 안정성 확보
  • Private IP Range Blocklist 적용으로 외부 리소스 요청 과정에서 발생 가능한 SSRF 취약점 방어
  • JSON Payload 기반의 Template 선택 구조를 통해 렌더링 로직과 디자인 레이아웃의 관심사 분리

- PDF 렌더링 시 요소 높이 사전 계산 로직을 통해 Page Break 예외 케이스 방지 - 외부 URL 이미지 로딩 시 반드시 Timeout 설정 및 SSRF 방지 필터링 적용 - 다국어 서비스의 통화 표기 시 단순 포맷팅이 아닌 Locale 기반 매트릭스 검증 수행

원문 읽기