pile·
백엔드·티몬티몬·

Java 대용량 엑셀 업로드

티몬에서 엑셀 업로드로 서버가 다운된 장애를 겪고 POI Workbook 방식에서 SAX 방식으로 바꾼 기록이다. 요청이 많아야 2~3만 건이라 그 규모로 테스트하고 운영했는데, 연말에 요구사항이 쌓이면서 담당자가 50만 건짜리 파일을 업로드했고 엑셀을 읽던 중 서버가 죽었다. 소량 처리에만 신경 쓰다 대량이 들어오니 드러난 문제였다.

핵심 포인트
  • Workbook은 전체 데이터를 한 번에 읽어 처리하므로 Row 수 기준 제한을 걸 수 없고, 용량으로만 제한할 수 있는 상황이었다.
  • 3~5만 건을 기준으로 처리 속도가 급격히 떨어져, 최대 10만 건까지 문제없이 처리하려면 다른 방법이 필요했다.
  • 문제는 매일 3~5천 건, 많아야 2~3만 건만 들어와서 건수에 따라 느릴 뿐 서버가 죽는 일이 없었던 것이지, 문제점 자체는 계속 안고 있었다는 점이다.
  • SAX 방식은 데이터를 순차적으로 읽어 내려가며 노드의 시작과 끝에서 이벤트를 발생시킨다.
  • 문서 전체를 메모리에 올리지 않아 메모리 사용량이 적고 단순 읽기에서 빠른 속도를 보인다.
상세 정리
  • 기능의 배경: 하루에도 몇십만 건씩 늘어나는 상품 정보를 관리자 사이트로 처리하기 힘들다는 문의를 받아, 엑셀 템플릿에 맞춰 업로드하면 일괄 처리되는 기능을 개발해 제공했다.
  • 장애의 경위: 몇 달을 문제없이 쓰다가 연말에 쌓인 요구사항 때문에 한 번에 50만 건이 들어오면서 서버가 다운됐다.
  • 원인 진단: POI 라이브러리의 Workbook으로 업로드된 엑셀 데이터를 변환하는 방식이 소량에서는 약간의 속도 차이만 있었지만, 대량에서는 변환 작업 중 문제를 일으켰다.
  • 첫 대안의 좌절: 입력 가능 건수 제한을 걸어 그 이상이면 나눠 처리하도록 유도하려 했으나, Workbook 구조상 Row 수 기준 제한이 적용되지 않았다.
  • 정리한 요건 셋: 엑셀 파일 정보를 2차원 데이터로 전환할 것, 최대 10만 건까지 처리 가능할 것, 최대 Row 수 제한을 걸 수 있을 것.
  • 해법 발견: SAX 방식으로 엑셀 파일을 XML처럼 다루면 세 요건을 모두 충족할 수 있다는 점을 알게 돼 적용하기로 했다.
  • 웹 서비스에서 중복된 유형의 데이터를 대량으로 입력받을 때 엑셀 파일 업로드가 흔히 쓰이는 방법이라는 전제에서 출발한다.
왜 읽나엑셀 업로드 기능을 소량 기준으로 만들어 두고 대량 입력에 노출된 백엔드 개발자에게, Workbook 방식의 구조적 한계와 SAX 전환의 근거를 실제 장애와 함께 보여준다.
티몬
티몬 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 백엔드·twilio-engTwilio Engineering·

    Programmable Messaging에서 Verify API로 마이그레이션하기

    Twilio의 Programmable Messaging API로 자체 OTP 솔루션을 운영하던 서비스가 Verify API로 전환하는 방법을 코드 예시와 함께 설명한다. Verify는 OTP 전송·검증을 위한 전용 API로, 전화번호 구매, 토큰 생성, DB 저장·만료 관리를 내부에서 처리해 개발자가 직접 구현할 코드를 크게 줄인다.

    요약 이어보기
    #authentication#twilio#sms+2
  2. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 2부

    포스타입 백엔드 엔지니어가 벡터 기반 개인화 추천 시스템을 실제 운영하며 맞닥뜨린 성능 장애와 용량 문제를 해결한 과정을 담은 2부다. 수백만 개의 벡터 KNN 검색이 피크 시간대에 전체 Elasticsearch 검색 성능을 흔드는 문제부터 클러스터 OOM 사태까지, 쿼리 최적화와 인프라 분리 두 가지 경로로 근본 해결에 이른다.

    요약 이어보기
    #elasticsearch#vector-search#recommendation-system+2
  3. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 1부

    포스타입이 태그 기반 추천의 한계를 극복하고 벡터 임베딩 기반 개인화 추천 시스템을 구축한 과정을 담은 1부다. 유사한 콘텐츠가 다른 용어를 쓰거나 동일한 태그가 전혀 다른 톤의 콘텐츠를 가리키는 문제를 임베딩 벡터로 해결하고, OpenSearch의 HNSW ANN 검색으로 수백만 벡터를 실시간 검색하는 시스템을 구축해 구매율 15% 향상을 달성했다.

    요약 이어보기
    #opensearch#vector-search#recommendation-system+2