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

요구사항 정리와 범위 자르기

숫자 하나가 설계 하나를 정한다

시스템 설계는 요구사항을 기능비기능으로 나누고 범위 밖을 먼저 잘라내는 것에서 시작합니다. 이 토픽은 아래 하나의 요구사항을 끝까지 풉니다.

항목
서비스팀 파일 공유 서비스
파일 크기평균 20MB, 최대 50GB
업로드하루 200만 건, 합계 약 40TB
사용자월 활성 500만, 모바일 60퍼센트
우선순위가용성. 업로드 실패보다 잠깐 늦게 보이는 편이 낫다

기능 요구사항과 범위 밖

구분내용
이번에 만든다파일 업로드, 다운로드, 링크 공유
범위 밖실시간 협업 편집, 버전 관리, 전문 검색, 권한 그룹 관리

범위 밖을 말하는 것이 실력입니다. 다 만들겠다고 하면 무엇도 깊게 못 하고, 면접에서는 우선순위를 못 정하는 것으로 읽힙니다.

비기능 요구사항이 설계를 정한다

비기능 요구사항 네 개가 각각 어떤 설계 결정을 정하는지 비기능 요구 정해지는 설계 최대 50GB 멀티파트가 필수 하루 40TB 앱을 통과시킬 수 없다 모바일 60퍼센트 재개와 멱등이 필요 가용성 우선 최종 일관성을 받는다 평균 20MB 는 반대로 작동한다. 대부분의 파일에는 멀티파트가 과설계다

숫자를 그냥 적어두면 장식입니다. 각 숫자가 어떤 결론을 강제하는지까지 가야 요구사항 정리가 끝난 것입니다.

숫자강제하는 것
최대 50GB멀티파트단일 요청 크기 상한을 넘는다. 대안이 없다
하루 40TB직접 업로드앱 서버가 통과시킬 수 있는 양이 아니다
모바일 60퍼센트재개와 멱등끊김이 예외가 아니라 정상 상황이다
가용성 우선최종 일관성쓰기를 막기보다 잠깐 어긋나는 편을 택한다

평균값은 반대로 읽는다

평균 20MB 라는 숫자는 과설계를 막는 쪽으로 씁니다. 최대가 50GB 라서 멀티파트가 필요하지만, 실제 파일 대부분은 한 번에 올려도 됩니다.

그래서 설계는 하나가 아니라 두 갈래가 됩니다. 작은 파일은 단순 경로로, 큰 파일만 멀티파트로 보냅니다. 최대값만 보고 모든 파일을 멀티파트로 처리하면 대부분의 요청에 불필요한 왕복과 상태 관리를 붙이는 셈입니다.

용량 산정은 자릿수만 맞으면 된다

하루 200만 건 를 초로 환산하면 약 23건입니다. 피크를 평균의 다섯 배로 잡아도 초당 100건 남짓입니다. 쓰기 자체는 크지 않고, 문제는 건수가 아니라 바이트입니다.

이 구분이 설계를 바꿉니다. 초당 100건은 어떤 데이터베이스든 받아냅니다. 하루 40TB 는 앱 서버가 통과시킬 수 없습니다. 그래서 병목은 메타데이터가 아니라 파일 전송 경로입니다.

면접에서 이렇게 나옵니다

Q.파일 공유 서비스의 요구사항을 어떻게 정리하시겠습니까

기능과 비기능으로 나누고 범위 밖을 먼저 자릅니다.

구분내용
기능업로드, 다운로드, 링크 공유
범위 밖실시간 협업 편집, 버전 관리, 전문 검색
비기능최대 50GB, 하루 40TB, 모바일 60퍼센트, 가용성 우선

그다음 각 비기능 숫자가 어떤 설계를 강제하는지 말합니다. 최대 50GB 는 단일 요청 상한을 넘으므로 멀티파트가 필수이고, 하루 40TB 는 앱 서버가 통과시킬 수 없으므로 직접 업로드입니다.

흔한 실수: 비기능 요구사항을 "고가용성, 확장성, 저지연" 처럼 형용사로 나열하는 것. 숫자와 그 숫자가 강제하는 결론이 없으면 아무 설계도 정해지지 않습니다. 면접관은 형용사가 아니라 그 값에서 무엇이 따라오는지를 봅니다.

Q.이 요구사항에서 병목은 어디라고 보시나요

건수가 아니라 바이트입니다. 이 구분이 설계를 바꿉니다.

하루 200만 건 를 초로 나누면 약 23건
피크를 평균의 5배로 잡아도 초당 100건 남짓
같은 기간 전송량은 약 40TB

초당 100건은 어떤 데이터베이스든 받아냅니다. 메타데이터 쓰기는 병목이 아닙니다. 40TB 는 앱 서버가 통과시킬 수 있는 양이 아닙니다.

후보판정
메타데이터 데이터베이스병목 아니다. 초당 100건 수준
파일 전송 경로병목이다. 앱을 통과시키면 대역폭이 먼저 죽는다

그래서 설계의 첫 결정이 "파일이 앱을 지나가지 않게 한다" 가 됩니다.

흔한 실수: 초당 요청 수만 계산하고 끝내는 것. 파일 업로드는 요청 하나가 무거운 종류라서, 건수로 환산한 숫자만 보면 병목을 반대로 짚습니다.

Q.최대 파일 크기가 50GB 인데 모든 업로드를 멀티파트로 처리하면 되나요

아닙니다. 평균이 20MB 이므로 대부분의 파일에는 과설계입니다.

멀티파트는 공짜가 아닙니다. 업로드를 시작하고, 파트마다 서명을 받고, 완료를 알리고, 중단된 조각을 정리하는 상태 관리가 붙습니다.

파일 크기맞는 경로
평균 20MB 수준한 번에 올린다. 상태 관리가 필요 없다
단일 요청 상한을 넘는다멀티파트

그래서 설계는 두 갈래가 됩니다. 클라이언트가 파일 크기를 보고 경로를 고르고, 서버는 둘 다 받아들입니다.

흔한 실수: 최대값만 보고 하나의 경로로 통일하는 것. 요구사항에 평균이 함께 적혀 있는 이유가 이것입니다. 최대는 무엇이 가능해야 하는지를 정하고, 평균은 무엇이 흔한지를 정합니다. 흔한 경우를 무겁게 만들면 전체가 느려집니다.

Q.가용성을 일관성보다 우선한다는 것이 이 설계에서 무엇을 뜻하나요

업로드를 받는 쪽을 막지 않고, 잠깐 어긋나는 것을 받아들인다는 뜻입니다.

구체적으로는 이렇게 나타납니다.

상황가용성 우선 선택
메타데이터 기록이 잠깐 늦다업로드는 성공으로 처리하고 목록에 늦게 나타난다
복제본 간 차이방금 올린 파일이 다른 지역에서 몇 초 뒤에 보인다
완료 통보 유실나중에 정리 작업이 맞춘다

반대 선택도 가능합니다. 결제나 재고라면 어긋난 상태를 보이는 대신 쓰기를 거절하는 편이 맞습니다. 같은 구조에서 이 우선순위만 바꿔도 설계가 달라집니다.

파일 공유에서 가용성을 고르는 이유는 실패 비용의 비대칭입니다. 업로드가 거절되면 사용자는 작업을 잃지만, 목록에 몇 초 늦게 나타나는 것은 대개 눈치채지 못합니다.

흔한 실수: 가용성 우선을 "장애가 없다" 로 이해하는 것. 무엇을 포기했는지를 함께 말해야 합니다. 여기서 포기한 것은 방금 쓴 것을 즉시 읽을 수 있다는 보장입니다.

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

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

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