Foundry
파일 업로드 시스템 설계
기초
핵심

업로드 경로와 그 한계

파일이 어디를 지나가는지가 확장 한계를 정한다

파일 업로드 설계는 파일이 어디를 지나가는지로 갈립니다. 앱 서버 디스크에 두는 방식에서 오브젝트 스토리지로, 다시 클라이언트가 스토리지로 직접 올리는 방식으로 올라갑니다. 각 칸이 앞 칸의 특정 결함을 고칩니다.

업로드 경로 세 단계. 앱 서버 디스크에 저장, 앱 서버를 거쳐 오브젝트 스토리지로, 서명만 받고 스토리지로 직접 1 앱 서버 디스크에 저장 클라이언트 파일 앱 서버 2 앱 서버를 거쳐 오브젝트 스토리지로 클라이언트 파일 앱 서버 파일 스토리지 3 서명만 받고 스토리지로 직접 앱 서버 클라이언트 서명 요청 파일 스토리지

1번 칸이 왜 깨지나

앱 서버 디스크에 저장하면 세 가지가 동시에 문제가 됩니다.

문제언제 드러나나
용량디스크가 차면 배포가 아니라 장애가 된다
소실인스턴스를 교체하거나 오토스케일로 줄이면 파일이 사라진다
서버 상태서버마다 다른 파일을 갖게 되어 무상태가 깨진다. 로드밸런서가 다른 서버로 보내면 파일이 없다

마지막이 가장 비쌉니다. 서버를 늘리는 것만으로 해결되지 않는 문제가 되기 때문입니다.

2번 칸이 남기는 것

파일을 오브젝트 스토리지에 두면 용량과 소실과 무상태가 한 번에 풀립니다. 서버는 파일을 들고 있지 않으므로 언제든 교체할 수 있습니다.

그런데 파일이 여전히 앱 서버를 통과합니다. 앱이 받아서 다시 보내므로 대역폭과 메모리를 앱이 내고, 요청 하나가 오래 붙잡히므로 동시 업로드가 늘면 스레드가 먼저 바닥납니다.

요구사항의 숫자가 이 칸의 한계를 보여줍니다. 하루 40TB 가 앱을 통과해야 하고, 최대 50GB 파일 하나가 요청 하나를 아주 오래 붙잡습니다. 파일을 저장하지 않아도 지나가게 하는 것만으로 앱이 병목입니다.

3번 칸으로 올라가는 이유

앱 서버는 권한을 확인하고 서명된 주소만 내려줍니다. 파일은 클라이언트가 스토리지로 직접 보냅니다. 앱 서버가 지나가는 경로에서 빠지므로 파일 크기가 앱의 부담과 무관해집니다.

대신 새 숙제가 생깁니다. 파일이 앱을 거치지 않으니 앱은 업로드가 끝났는지 모릅니다. 검증도 못 하고 메타데이터도 기록하지 못합니다. 이 숙제를 푸는 것이 다음 개념들입니다.

사다리를 오르지 않아도 되는 경우

3번이 항상 정답은 아닙니다. 하루 열 건에 100KB 짜리 설정 파일이라면 1번으로 충분하고, 서명 발급과 완료 통보를 만드는 것이 오히려 손해입니다. 선택을 정하는 것은 기술의 새로움이 아니라 파일 크기와 동시 업로드 수입니다.

면접에서 이렇게 나옵니다

Q.파일 업로드를 설계할 때 무엇부터 정하나요

파일이 어디를 지나가는지를 먼저 정합니다. 저장 위치가 아니라 경로입니다.

경로앱 서버의 역할한계
앱 서버 디스크받고 저장한다용량, 인스턴스 교체 시 소실, 무상태 깨짐
앱 서버를 거쳐 스토리지받아서 넘긴다대역폭과 메모리를 앱이 낸다
클라이언트가 스토리지로 직접서명만 발급한다업로드 완료를 앱이 모른다

경로가 정해지면 나머지가 따라옵니다. 직접 업로드를 고르면 완료 통보와 메타데이터 기록을 설계해야 하고, 앱 서버를 거치면 동시 업로드 수가 스레드 한계에 걸립니다.

흔한 실수: 저장소 종류(스토리지냐 DB 냐)부터 고르는 것. 그건 뒤에 오는 결정입니다. 먼저 정할 것은 트래픽이 앱을 통과하느냐이고, 그 답이 확장 한계를 정합니다.

Q.앱 서버 디스크에 파일을 저장하면 무엇이 문제인가요

서버가 상태를 갖게 되는 것이 핵심 문제입니다.

용량과 소실도 문제지만 그건 디스크를 키우거나 백업으로 완화할 수 있습니다. 되돌리기 어려운 것은 무상태가 깨지는 것입니다.

서버 A 에 올린 파일이 서버 A 디스크에만 있다
로드밸런서가 다음 요청을 서버 B 로 보낸다
서버 B 에는 그 파일이 없다

이렇게 되면 서버를 늘리는 것으로 해결되지 않습니다. 세션 고정으로 같은 서버에 붙이는 우회가 가능하지만, 그 서버가 죽으면 파일이 사라지고 오토스케일도 못 씁니다.

흔한 실수: 디스크 용량만 문제로 답하는 것. 용량은 돈으로 미룰 수 있고, 진짜 비용은 수평 확장과 인스턴스 교체를 포기하게 되는 것입니다.

Q.오브젝트 스토리지에 저장하면 무엇이 남나요

파일이 여전히 앱 서버를 통과한다는 것이 남습니다.

용량과 소실과 무상태는 풀립니다. 서버는 파일을 들고 있지 않으니 언제든 교체됩니다. 그런데 업로드 요청이 앱에 들어와 앱이 스토리지로 다시 보내는 구조라면, 앱이 전송량을 그대로 냅니다.

항목앱이 부담하는 것
대역폭받는 쪽과 보내는 쪽 양방향
메모리 또는 임시 디스크스트리밍하지 않으면 파일 크기만큼
요청 점유 시간파일이 클수록 오래 붙잡힌다

요구사항이 하루 40TB 이므로 그 전부가 앱을 통과해야 합니다. 저장하지 않아도 지나가게 하는 것만으로 병목이 됩니다.

흔한 실수: 스토리지로 옮겼으니 확장 문제가 끝났다고 답하는 것. 저장 위치는 바뀌었지만 경로는 그대로입니다. 경로에서 앱을 빼는 것이 다음 단계입니다.

Q.직접 업로드가 항상 더 좋은 선택인가요

아닙니다. 파일 크기와 동시 업로드 수가 선택을 정합니다.

하루 열 건에 100KB 짜리 설정 파일이라면 앱 서버가 받아 처리하는 편이 낫습니다. 서명 발급 경로, 완료 통보, 고아 객체 정리를 만드는 비용이 얻는 것보다 큽니다.

조건맞는 선택
작고 드문 파일앱 서버가 받아 스토리지에 넘긴다
크거나 동시 업로드가 많다클라이언트가 스토리지로 직접
업로드 즉시 내용을 검사해야 한다앱을 거치거나, 직접 올린 뒤 비동기로 검사한다

직접 업로드는 앱이 경로에서 빠지므로 업로드가 끝났는지 앱이 모릅니다. 완료 통보와 메타데이터 기록을 따로 만들어야 하고, 그 사이에 실패하면 스토리지에만 남은 고아 객체가 생깁니다.

흔한 실수: 서명 방식을 최신이라서 고르는 것. 사다리 위 칸이 항상 나은 것이 아니라 어떤 제약을 충족하는가로 이름 붙여야 합니다. 제약이 없으면 아래 칸이 맞습니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

파일 업로드 시스템 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.