이미지 업로드 설계 면접 질문: 올리다 만 파일이 저장소에 쌓일 때
시스템 디자인 Vol.1 · 17장 「올리다 만 파일이 쌓입니다」에서
이런 화면입니다
상품 등록 화면에서 사진을 올립니다. 손님이 파일을 고르면 브라우저가 우리 서버로 보내고, 서버가 받아서 저장소에 올리고, 주소를 데이터베이스에 적습니다. 잘 돌아갑니다.
몇 달 뒤 저장소 요금이 이상하게 늘어 있습니다. 열어 보니 아무 상품도 가리키지 않는 파일이 잔뜩 쌓여 있습니다.
면접관이 이렇게 묻습니다
이미지 업로드를 설계해 보세요. 상품 하나에 사진이 최대 열 장이고, 손님이 올리다 그만두기도 합니다.
범위부터 좁힙니다
규모를 먼저 묻습니다. 상품이 하루 3,000개 등록되고 사진이 평균 네 장, 한 장이 평균 2메가라면 하루 24기가입니다. 그리고 등록을 끝까지 안 하는 비율을 묻습니다. 셋에 하나가 중간에 나갑니다.
이 숫자를 묻지 않으면 이 문제가 보이지 않습니다. 하루 24기가가 어디를 지나가는지, 중간에 나간 손님의 사진은 어떻게 되는지. 이 두 가지가 요구사항이 됩니다.
등록을 끝내지 않고 나간 손님의 파일은 언제부터 상품 사진일까요. 이 질문에 답하지 못하면 저장소에 주인 없는 파일이 쌓입니다.
가장 많이 나오는 답
브라우저에서 우리 서버로, 우리 서버에서 저장소로 올리고, 그다음 데이터베이스에 주소를 적습니다.
브라우저 → 우리 서버 (10MB)
우리 서버 → 저장소 (같은 10MB 한 번 더)
우리 서버 → DB (주소 저장)
업로드 한 장, 등록 한 번으로 시험하면 문제없이 돕니다.
그런데 여기서 깨집니다
같은 바이트가 두 번 흐릅니다. 그동안 우리 서버의 스레드 하나가 묶여 있고, 요청 크기 제한과 메모리와 시간 제한이 전부 이 파일에 걸립니다. 사진 열 장을 한꺼번에 고른 손님 한 명이 서버를 오래 붙듭니다.
파일을 먼저 올리고 행을 나중에 만드는 순서에서는, 중간에 그만둔 손님이 곧 쓰레기 파일입니다. 셋에 하나가 그만두면 그만큼이 매일 쌓입니다.
떨어지는 답은 이런 모양입니다
- 서버가 받아서 올리는 그림으로 끝냅니다.
- 중간에 그만두는 손님을 면접관이 물을 때 처음 생각합니다.
- 손님이 준 파일 이름을 그대로 저장소 이름으로 씁니다.
면접관은 여기서 멈추지 않습니다
같은 사진을 두 번 올리면요?
같은 파일이 두 번 붙는 일을 어디서 막을지 봅니다.
.jpg로 끝나면 이미지라고 믿어도 되나요?
확장자와 실제 형식을 구분하는지 봅니다.
상품 사진과 사업자등록증 사본을 같은 곳에 둬도 되나요?
공개해도 되는 파일과 안 되는 파일을 가르는지 봅니다.
이 다음 판단은 책에서 이어집니다
책은 파일이 어디를 거쳐 저장소에 닿을지, 쓰기로 하지 않은 파일을 어떻게 다룰지 정하고, 그 판단이 테이블과 실패 처리에 어떻게 들어가는지 풉니다. 여기서 자주 놓치는 세 가지도 같이 다룹니다.
17장에서 이어지는 것
- 파일이 저장소에 닿는 길
- 쓰지 않은 파일을 다루는 순서
- 여기서 자주 놓치는 세 가지
- 같은 파일을 두 번 올리면