목록 보기
500만 데이터 엑셀 출력을 4GB 메모리에서 하는방법
백엔드

500만 데이터 엑셀 출력을 4GB 메모리에서 하는방법

삼쩜삼
삼쩜삼
2025년 11월 11일

두줄요약

정산시스템의 대용량 엑셀 출력에서 OOM과 재시도 폭주를 해결한 사례를 다뤘습니다. 날짜 단위 병렬 처리와 DB Cursor, S3 업로드로 메모리 부담 없이 비동기 다운로드 구조를 만들었습니다.

문제 상황

  • 정산시스템에서 500만 건급 대용량 데이터를 엑셀로 출력할 때 OOM과 CPU 과부하 발생
  • BackOffice Gateway의 재시도로 동일 요청이 반복되어 DB와 서버 리소스 소진 심화

원인 분석

  • 조회 결과를 query.fetch()로 한 번에 List 적재 후 엑셀 생성하는 구조
  • Reflection 기반 행 렌더링과 문자열 포맷팅 반복으로 CPU 부담 증가
  • 조회 기간이 길거나 5월처럼 데이터가 몰리는 구간에서 메모리 사용량 급증

해결 방법

  • 날짜 단위 병렬 조회와 비동기 처리로 작업 범위 분할
  • JPA stream() 대신 Hibernate scroll()과 DB Cursor, setFetchSize(100) 적용
  • 100만 건 이하 CSV 단일 파일, 초과 시 CSV 분할 후 ZIP 압축과 S3 MultipartUpload, PreSigned URL 제공

적용해볼 점

  • 대용량 다운로드는 동기 응답보다 비동기 파일 대기열 구조가 적합
  • 데이터 분포가 불균일한 조회는 기간 제한보다 스트리밍·커서 기반 처리 검토
  • 외부 게이트웨이 재시도와 타임아웃이 긴 배치성 요청에 미치는 영향 사전 점검

댓글 0

댓글을 작성하려면 로그인이 필요합니다.

댓글을 불러오는 중...