대량 엑셀 다운로드

대량 엑셀 다운로드
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

[Terraform 튜토리얼 1-6] 중복 없애다 망한 썰 – DRY 원칙, 정말 항상 맞을까?

[Terraform 튜토리얼 1-6] 중복 없애다 망한 썰 – DRY 원칙, 정말 항상 맞을까?

개발자라면 한 번쯤 들어봤을 말, "Don't Repeat Yourself", 줄여서 DRY 원칙. 이건 소프트웨어 개발에서 아주 중요한 원칙이에요. 중복을 줄이면 버그도 줄고, 유지 보수도 쉬워지고, 코드도 깔끔해지죠. 그런데… Terraform 같은 IaC 세계에서도 DRY가 무조건 좋을까요? 🤔 DRY가 뭔데? DRY 원칙의 핵심은 딱 하나: "같은 걸 반복해서 쓰지 마." * 상수 값, 로직, 설정

By Chansong
[Terraform 튜토리얼 1-5] 선언형 vs 명령형: Terraform은 왜 선언형인가?

[Terraform 튜토리얼 1-5] 선언형 vs 명령형: Terraform은 왜 선언형인가?

Terraform을 쓰다 보면 종종 듣게 되는 말이 하나 있어요: Terraform은 "선언형(Declarative)" 도구다. 그런데 이게 도대체 무슨 뜻일까요? "명령형(Imperative)"이랑은 뭐가 다르고, 왜 Terraform은 선언형일까요? 🧠 선언형과 명령형, 개념부터 정리 구분 선언형 (Declarative) 명령형 (Imperative) 핵심 개념 무엇이 되어야 하는지만 선언 어떻게 할지를 하나하나 명령 예시 “난 스테이크 먹을래” “고기

By Chansong
[Terraform 튜토리얼 1-4] 모듈이 정리가 안 될 땐, 응집도(Cohesion)를 의심하라

[Terraform 튜토리얼 1-4] 모듈이 정리가 안 될 땐, 응집도(Cohesion)를 의심하라

인프라를 코드로 관리할 때, 좋은 모듈을 만드는 핵심 개념 중 하나가 바로 응집도(Cohesion)입니다. 이 단어가 좀 낯설게 느껴질 수 있지만, 사실 우리는 매일 응집도가 높은 시스템 속에서 살고 있어요. ✅ 응집도란? 하나의 모듈이 하나의 책임 또는 기능에만 집중하는 정도 응집도가 높은 모듈은 말 그대로 한 가지 일에만 집중합니다. 그래서

By Chansong