스트리밍으로 S3에서 대량 파일 다운로드 구현 방법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
백엔드/프론트엔드 개발자 (대규모 파일 다운로드 시스템 구축 필요)
난이도: 중급 (Node.js/React 기초 지식 필요)
핵심 요약
archiver
모듈과 S3 스트리밍을 통해 서버 메모리 절약ReadableStream
을 통한 HTTP 응답 전송으로 대규모 파일 다운로드 처리- 프론트엔드에서
Blob
과URL.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. 프론트엔드 구현 코드
axios
로responseType: 'blob'
설정Blob
객체 생성 후URL.createObjectURL()
사용a.download
속성으로 파일명 지정
5. 주요 이점
- 서버 메모리 사용량 70% 감소 (대규모 파일 시)
- 1GB 이상 파일 다운로드 가능
- 동시 다운로드 시 서버 부하 30% 감소
결론
- 대규모 파일 다운로드 시 스트리밍 방식 필수 (서버 메모리 절약)
archiver
+AWS S3
스트리밍 패턴 사용 권장- 프론트엔드에서는
axios
+Blob
처리 방식으로 구현 Content-Type: application/zip
헤더 설정 필수- 스트리밍 중
archive.finalize()
호출 시 즉시 다운로드 시작