대량 엑셀 다운로드

대량 엑셀 다운로드
Photo by Mika Baumeister / Unsplash

대량 엑셀 다운로드를 구현하기 위해 시도한 시행착오를 정리해보았습니다 😊

기존 엑셀 다운로드 구성

  • Machine365의 '기록' 페이지를 렌더링 하기 위한 API 사용하여 데이터를 가져오고 가져온 데이터를 브라우저에서 엑셀파일로 구성해서 다운로드가 되는 방식이었습니다

기존 다운로드의 문제점

  • 기존 모니터링 데이터를 가져오는 API는 페이지를 렌더링하기 위해 페이지네이션이 적용되어 있었습니다
  • 따라서 엑셀로 구성하는 데이터 수에 비례해서 요청을 보내는 방식이었고 그 수가 많아지면 동시에 100건이 넘는 요청을 보내서 서버가 제대로 동작하지 못하는 이슈가 있었습니다

엑셀 다운로드 API 추가

  • 기존 문제점을 해결하기 위해 한번의 요청으로 백엔드 서버에서 엑셀 파일을 구성해서 내려주는 API를 추가하였습니다
  • Java 라이브러리 중 Apachi POI를 사용했습니다(XSSFWorkbook 사용)

엑셀 다운로드 API 문제점

  • 그림2와 같이 대량 데이터(e.g. 10만건)을 한번에 조회하는 경우 메모리 에러가 발생하는 것을 확인했습니다
  • 현재 저희 개발서버는 0.5G 메모리를 가지고 있고 10만건 데이터를 처리하기에 메모리가 부족했습니다
    • Spring은 최대 heap memory를 1/4까지 사용할 수 있습니다(0.5G / 4 => 125mb)
  • 처음엔 단순히 개발 서버의 메모리를 올리는 것을 생각했지만 메모리 스펙을 늘리면 클라우드 비용이 증가하기 때문에 다른방식으로 해결해야 했습니다

엑셀 다운로드 API 개선

그림 3. 개선한 엑셀 다운로드 API 구성도
  • 1. 엑셀 파일을 만들때 스트리밍 방식으로 작성
    • 기존에 XSSFWorkbook 대신 스트리밍 방식으로 만드는 SXSSFWorkbook 를 사용하였습니다
    • 하지만 10만건 데이터를 메모리에서 가져와서 들고있는 단계에서 여전히 메모리 이슈가 발생했습니다
  • 2. 데이터를 가져올 때 나눠서 가져오기
    • 엑셀을 스트리밍 방식으로 만들 수 있으므로 데이터를 한번에 다 가져올 필요가 없게 되었습니다
    • DB에서 데이터를 가져 올 때 페이지네이션을 적용해서 조금씩 가져와서 쓰는 방식으로 메모리 문제를 해결했습니다

참고

Read more

[시리즈 2편] 실무로 배우는 메시지 큐 - RabbitMQ

[시리즈 2편] 실무로 배우는 메시지 큐 - RabbitMQ

들어가며 [시리즈1]에서는 프로세스 내부 메시지 큐를 다뤘습니다. 이번엔 네트워크 메시지 큐인 RabbitMQ를 다룹니다. RabbitMQ 공식 문서나 기술 블로그는 많지만, 실무에서 어떻게 사용하는지에 대한 글은 의외로 적습니다. "Producer가 뭐고 Consumer가 뭔지는 알겠는데, 그래서 실제로는 어떻게 쓰는데?" 이번 글에서는 우리 MES 시스템에서 RabbitMQ를 어떻게 활용하고 있는지 실제 코드와 함께 공유합니다. 우리

By Jeonggil
[시리즈 1편] 실무로 배우는 메시지 큐 - Windows Message Loop

[시리즈 1편] 실무로 배우는 메시지 큐 - Windows Message Loop

들어가며 이 글은 "실무로 배우는 메시지 큐" 시리즈의 첫 번째 글입니다. 실무에서 발견한 문제를 해결하는 과정에서, IME 입력 문제와 해결 과정을 공유합니다. 메시지 큐는 RabbitMQ, Kafka 같은 네트워크 레벨만 있는 게 아닙니다. 우리가 매일 쓰는 Windows 애플리케이션도 메시지 큐 기반으로 동작합니다. * 시리즈1 (이 글): 프로세스 내부의 메시지 큐 - Windows

By Jeonggil
[시리즈 2편] 그림으로 풀어낸 SaaS 알림 시스템

[시리즈 2편] 그림으로 풀어낸 SaaS 알림 시스템

이 글은 1편 - 그림으로 풀어낸 SaaS 알림 시스템의 후속편입니다. 들어가며 1편에서는 설비 연속 OFF 알림 기능의 핵심 로직과 어떤식으로 해결했는지 그림으로 알아봤습니다. 이번 글에서는 실무에서 마주한 진짜 고민들을 공유합니다: * 왜 3개의 새로운 테이블이 필요했나? * 어떻게 확장 가능한 구조를 만들었나? * SMS 14원짜리 알림이 왜 무서운가? * 운영 레벨로 나가기까지 무엇을 준비했나?

By Jeonggil
[시리즈 1편] 그림으로 풀어낸 SaaS 알림 시스템

[시리즈 1편] 그림으로 풀어낸 SaaS 알림 시스템

들어가며 제조업 IoT 플랫폼에서 N대 이상의 설비를 실시간으로 모니터링하고, 설비가 연속으로 꺼졌을 때 담당자에게 즉시 알림을 보내는 기능을 개발하게 되었습니다. 데이터는 실시간으로 쌓이지만, 설비이상을 체크하는 스케줄러 주기는 1분으로 설정하였습니다. 시스템 아키텍처 기존 인프라와 Push 기능은 이미 구축되어 있었습니다. 저는 중간에 들어가는 Alert Scheduler만 구현하면 되는 상황이었습니다. ┌──────────────────────────────────────────────────────────┐ │ 설비 IoT 센서 (실시간)

By Jeonggil