S3 스트리밍으로 대량 파일 다운로드 구현 방법

스트리밍으로 S3에서 대량 파일 다운로드 구현 방법

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

백엔드/프론트엔드 개발자 (대규모 파일 다운로드 시스템 구축 필요)

난이도: 중급 (Node.js/React 기초 지식 필요)

핵심 요약

  • archiver 모듈과 S3 스트리밍을 통해 서버 메모리 절약
  • ReadableStream을 통한 HTTP 응답 전송으로 대규모 파일 다운로드 처리
  • 프론트엔드에서 BlobURL.createObjectURL을 사용한 클라이언트 측 다운로드 처리

섹션별 세부 요약

1. 기존 접근 방식의 한계

  • 1000명 이상의 사용자 대상 시 서버 메모리 부하 증가
  • 대용량 파일 처리 시 CPU 사용률 급등
  • 동시 다운로드 요청 시 서버 병목 현상 발생

2. 스트리밍 기반 구현 방식

  • AWS.S3.getObject().createReadStream() 사용
  • archiver.zip으로 복수 파일 압축 후 스트리밍
  • res.pipe()로 HTTP 응답 스트리밍 처리

3. 백엔드 구현 코드

  • archiver 모듈로 ZIP 생성 (compression level 9)
  • AWS SDK를 통해 S3 파일 스트리밍
  • archive.append(s3Stream, {name: 'filename'})으로 스트림 추가

4. 프론트엔드 구현 코드

  • axiosresponseType: 'blob' 설정
  • Blob 객체 생성 후 URL.createObjectURL() 사용
  • a.download 속성으로 파일명 지정

5. 주요 이점

  • 서버 메모리 사용량 70% 감소 (대규모 파일 시)
  • 1GB 이상 파일 다운로드 가능
  • 동시 다운로드 시 서버 부하 30% 감소

결론

  • 대규모 파일 다운로드 시 스트리밍 방식 필수 (서버 메모리 절약)
  • archiver + AWS S3 스트리밍 패턴 사용 권장
  • 프론트엔드에서는 axios + Blob 처리 방식으로 구현
  • Content-Type: application/zip 헤더 설정 필수
  • 스트리밍 중 archive.finalize() 호출 시 즉시 다운로드 시작