
다들 추석 연휴 잘 보내고 계신가요?
회사에 들어와 처음 맞는 연휴라 그런지, 정신없이 달려왔던 지난 몇 주가 문득 낯설게 느껴집니다.
‘이렇게 여유롭게 쉬어도 되는 걸까?’ 하는 생각이 들면서도, 오랜만에 제대로 쉬며 그동안의 시간을 돌아보고 있습니다.
이제 다시 회사로 돌아갈 준비를 하며, 연휴 전까지의 여정을 정리해보려 합니다.
그리고 회사 기술 블로그에 글이 게시되어 링크를 함께 공유드립니다.
부족하지만 많이 봐주시고 피드백 주시면 감사하겠습니다! ☺️🔗 Next.js App Router에서 prefetchQuery와 Suspense로 뚜루루뚜루 데이터 스트리밍하기
프로덕션 배포 이후, 새로운 인턴 과제를 맡게 되었습니다.
주제는 “대용량 파일 업로드/다운로드 과정에서의 안정적 개선 (유사 구글 드라이브)”.
100GB 이상의 파일도 고려해야 한다는 조건이 붙어 있었고, 2주 동안 정말 많은 고민을 하게 되었습니다.
개발을 시작하고 나서야 깨달았습니다.
1GB가 넘는 파일은 업로드든 다운로드든 단순한 요청 한 번으로 끝나지 않는다는 사실을요. 평소엔 당연하게 느꼈던 전송 과정이 실제로는 얼마나 복잡한지, 이번 과제를 통해 처음 체감했습니다.
그리고 사용자 환경이 항상 쾌적하다는 보장은 없고, 실제로 브라우저를 강제 종료하거나 탭을 닫는 일은 흔하다는 겁니다.
그래서 구글링을 통해 서버 트래픽이 몰리지 않는 선에서 S3의 Multipart Upload API를 기반으로, 각 파일을 사용자의 네트워크 환경에 따라 동적으로 나뉘어 청크로 쪼개 병렬로 업로드하도록 설계했습니다. 또한 강제 새로고침이나 업로드 중단이 발생했을 때는 listParts API를 통해 이미 업로드된 파트를 복원하고, 남은 청크만 이어서 업로드하도록 구현했습니다.
이 구조를 통해, 네트워크 중단 이후에도 5분 내 재개 가능한 업로드 안정성을 확보할 수 있었습니다.
업로드가 안정적이라면, 다운로드는 “빠르고 복구 가능한 구조”여야 했습니다.
특히 해외 고객사 환경을 고려해 CloudFront CDN 기반 다운로드 구조를 설계하라고 과제를 받게 되었습니다.
개발을 진행하며 느낀 점은,
다운로드는 업로드보다 훨씬 더 신중해야 한다는 것이었습니다.
50GB가 넘는 파일을 받다가 네트워크가 끊기면, 다시 처음부터 받는 건 현실적으로 너무 고통스러웠습니다. 실제로 한 번 테스트 중에 그런 상황을 겪고 나서, “이건 꼭 이어받기가 되어야 한다”는 확신이 생겼습니다.
그래서 다운로드 진행률을 localStorage에 저장하고, 강제 새로고침이나 탭 종료 후에도 이어받기가 가능하도록 했습니다.
여기서 고민을 했었던 점은 Cloudfront는 놀랍게도 캐싱이 적용되기 위해서는 50GB이하 까지만 요청할 수 있다는 점입니다.

이 부분에 대해서 업로드에서 청크 방식으로 했던것처럼 다운로드에서 적용하게 되면 50GB가 넘는 파일을 다운로드를 하게 되더라도 청크방식으로 다운로드를 받게 되면 캐시 제한 정책을 해결할 수 있지않을까? 라는 생각을 하게 되었습니다.
그래서 업로드와 마찬가지로, 다운로드 역시 청크 단위 병렬 다운로드 구조를 적용했습니다.
이번 과제는 단순히 파일을 전송하는 기능이 아니라,
“사용자가 신뢰할 수 있는 전송 경험”을 만드는 과정이었습니다.
그 외에도 인증 방식을 구글 OAuth 2.0과 JWT 쿠키 기반으로 분리해 보안성을 강화했고, 마지막 주차에는 업로드한 영상을 YouTube처럼 바로 스트리밍 재생할 수 있는 기능까지 확장할 예정입니다.
시간은 빠듯하지만,하나씩 구조를 세우고 기술적 문제를 해결해나가는 과정이
정말 “개발자로 성장하고 있다”는 실감을 주는 한 주였습니다.
이 글을 읽으시면서 추가적으로 고려할 점이나 더 나은 접근 방식에 대한 인사이트가 있으시다면, 댓글로 남겨주시면 정말 감사하겠습니다 ☺️
요즘 댓글을 통해 새로운 시각과 배움을 얻는 경험이 많아지면서,
개발자끼리 생각을 나누는 일이 얼마나 즐겁고 값진 일인지 새삼 느끼고 있습니다.
오늘도 글 읽어주셔서 정말 감사드립니다! 좋은 하루되세요!