개발자 블로그

대용량 데이터 엑셀 다운로드 최적화: 이커머스 서비스 백오피스 사례 본문

잡담

대용량 데이터 엑셀 다운로드 최적화: 이커머스 서비스 백오피스 사례

hayongwoon 2024. 9. 22. 21:02

커머스 플랫폼 하모니 서비스 백오피스에서 상품 데이터를 엑셀로 다운로드할 수 있는 기능을 제공하고 있었습니다. 하지만, 데이터의 양이 10만 row를 넘어가는 경우 **메모리 초과(Out of Memory)**가 발생하여 서버가 다운되는 문제가 있었습니다. 이를 방지하기 위해 임시로 기능을 제한해 두었지만, 비즈니스 요구사항을 충족하기 위해 이 기능을 최적화하는 프로젝트를 맡게 되었습니다.

 

이번 포스팅에서는 대용량 데이터를 처리하면서도 안정적인 시스템을 유지하기 위한 최적화 과정과 적용한 기술들에 대해 소개하고자 합니다.

1. 비동기적 처리로 기획 수정

대량의 데이터를 동기적으로 처리하는 대신, 비동기적인 방식으로 다운로드 프로세스를 설계했습니다. 이를 위해 다음과 같은 절차를 따랐습니다:

  1. 이벤트 결과 모델링: 엑셀 다운로드 요청을 이벤트로 처리하고, 그 결과를 저장할 테이블을 새로 설계했습니다.
  2. 메시지 큐 구축: AWS SQS를 활용하여 이벤트를 메시지로 관리하고, 요청을 큐에 적재하는 방식을 도입했습니다.
  3. 워커 생성: 메시지를 소비하여 실제 데이터를 처리하는 컨슈밍 워커를 생성했습니다.
  4. API 수정: 클라이언트가 엑셀 다운로드 요청 시, 해당 요청을 메시지 큐에 프로듀싱하고 이벤트 결과 테이블을 업데이트하도록 API 엔트리포인트를 수정했습니다.

2. 쿼리셋을 Batch 단위로 처리

한 번에 많은 데이터를 메모리로 불러오면 메모리 초과 문제가 발생하므로, 쿼리셋을 Batch 단위로 불러와 처리하는 방식으로 코드를 수정했습니다. 이를 통해 한 번에 작은 양의 데이터만 메모리로 로드할 수 있어 안정적인 데이터 처리가 가능해졌습니다.

3. 디스크 메모리 활용

메모리 사용을 줄이기 위해 리눅스의 임시 파일 저장소인 /tmp 폴더를 적극적으로 활용했습니다. 엑셀 파일을 메모리에서 바로 처리하는 대신, 데이터를 부분적으로 배치 처리하면서 해당 파일을 /temp 경로로 올렸습니다.

즉, 대용량 데이터를 모두 메모리에서 처리하지 않고, 임시 파일을 생성하여 디스크에 저장한 후, 배치 데이터를 순차적으로 불러와서 엑셀 파일에 업데이트하는 방식으로 진행되었습니다. 이를 통해 서버 메모리를 효율적으로 관리하면서도 안정적으로 엑셀 파일을 생성할 수 있었습니다.

결과

이 최적화 작업을 통해 10만 건 이상의 데이터를 엑셀로 다운로드할 때도 서버 메모리 사용량을 250~350MB로 안정화시킬 수 있었습니다. 이는 서비스의 안정성을 크게 개선했고, 이제는 더 많은 데이터를 안정적으로 처리할 수 있게 되었습니다.