사진 올리기 기능은 견적서에서 한 줄로 끝나는 경우가 많습니다. 실제로 개발도 며칠이면 붙고, 열어 보면 잘 동작합니다. 그런데 서비스를 반년쯤 돌리고 나면 클라우드 청구서에서 이 항목만 조용히 자라 있습니다.
업로드 기능은 한 번 만들고 끝나지만, 올라간 파일은 지우기 전까지 매달 돈을 먹는 자산이 됩니다. 저장한 용량과 밖으로 내려받는 전송량, 파일에 손대는 횟수가 각각 따로 계산되기 때문입니다.
업로드 기능은 한 번 만들지만 요금은 매달 새로 나옵니다
파일 저장 서비스의 요금표는 회사가 달라도 구성이 비슷합니다. 저장 용량, 밖으로 나가는 전송량, 파일을 읽고 쓰는 요청 건수 이렇게 세 가지로 나뉩니다. Cloudflare R2와 Vercel Blob의 공식 요금 문서도 같은 방식으로 항목을 끊어 놓았습니다.
그래서 "파일 서버 유지비가 매달 얼마입니까"라는 질문에는 정액 답이 나오지 않습니다. 답을 내려면 월 업로드 용량, 이미지 한 장의 크기, 월 조회수 세 가지를 먼저 잡아야 합니다. 이 셋이 없으면 어떤 견적도 추정입니다.
저장 요금은 지운 만큼이 아니라 쌓인 만큼 붙습니다
저장 요금의 단위는 GB-월입니다. 이번 달에 새로 올린 양이 아니라, 그 달 내내 보관하고 있던 총량에 요금이 붙습니다. 지우지 않으면 매달 밑돌이 커지는 구조입니다.
하루 100장, 장당 2MB짜리 사진이 올라오는 서비스라면 한 달에 약 6GB, 1년이면 약 72GB가 쌓입니다. 공식 요금 기준으로 Cloudflare R2는 GB당 월 0.015달러, Vercel Blob은 0.023달러, Supabase Pro는 포함분 100GB를 넘긴 뒤 0.0213달러입니다. Backblaze B2는 TB당 월 6.95달러입니다.
즉 72GB를 1년 내내 들고 있어도 저장 요금 자체는 월 1~2달러 수준입니다. 이 숫자만 보면 파일 보관은 싸 보입니다. 문제는 다음 항목입니다.
청구서를 실제로 키우는 쪽은 저장이 아니라 전송입니다
전송량은 사용자가 그 파일을 내려받을 때마다 발생합니다. 같은 이미지 한 장도 1만 명이 보면 1만 번 나갑니다. Vercel Blob은 데이터 전송이 GB당 0.05달러, Supabase Pro는 포함분 250GB를 넘기면 GB당 0.03달러이고, Amazon S3도 공식 요금 페이지에 인터넷으로 드나드는 대역폭에 요금을 매긴다고 적어 두었습니다.
앞의 예에서 이미지가 한 달에 300GB만큼 조회됐다고 하면, Vercel Blob 기준으로 포함분 100GB를 뺀 200GB에 10달러가 붙습니다. 같은 달 저장 요금 약 1.5달러의 여섯 배가 넘습니다.
이미지 요금은 얼마나 쌓였는지보다 얼마나 보여졌는지를 따라갑니다.
파일을 읽고 쓰는 횟수에도 따로 값이 매겨집니다
세 번째 항목은 요청 건수입니다. R2는 쓰기와 목록 조회 같은 Class A 작업이 100만 건당 4.50달러, 읽기 위주인 Class B 작업이 100만 건당 0.36달러입니다. Vercel Blob은 업로드와 복사, 목록 조회가 100만 건당 5달러, 단순 조회가 100만 건당 0.40달러입니다.
목록 화면 한 번에 썸네일 30장이 뜨면 요청도 30건입니다. 방문자가 많지 않아도 화면 설계에 따라 요청 수는 쉽게 곱해집니다. 다만 Vercel Blob 문서 기준으로 캐시에 적중한 조회는 요청 건수로 세지 않으므로, 캐시 설정이 이 항목을 직접 줄여 줍니다.
이미지 리사이즈는 저장·전송과 또 다른 항목입니다
원본을 그대로 내보내는 서비스는 거의 없습니다. 목록용 썸네일, 상세용 중간 크기처럼 크기를 바꿔서 내보내고 이 변환에도 값이 붙습니다. Cloudflare Images 공식 요금은 고유 변환 5,000건까지 무료이고, 그 뒤로는 1,000건당 0.50달러입니다.
여기에 저장은 이미지 10만 장당 월 5달러, 전송은 10만 장당 월 1달러가 따로 붙습니다. 변환본을 미리 만들어 두면 저장 요금이 늘고, 볼 때마다 변환하면 변환 요금이 늡니다. 어느 쪽이 싼지는 이미지 한 장이 몇 번 보이는지로 갈립니다.
전송비를 받는 곳과 받지 않는 곳이 갈립니다
같은 파일 저장 서비스인데 전송 요금 정책은 크게 세 갈래로 나뉩니다. 이 차이가 월 청구서에서 가장 큰 금액 차를 만듭니다.
- 전송 무료: Cloudflare R2는 모든 스토리지 클래스에서 밖으로 나가는 전송이 무료입니다.
- 조건부 무료: Backblaze B2는 월평균 저장량의 3배까지 다운로드가 무료이고, 초과분은 GB당 0.01달러입니다.
- 전부 과금: Amazon S3, Vercel Blob, Supabase는 포함분을 넘긴 전송량에 GB당 요금을 매깁니다.
앞의 72GB·월 300GB 조회 예를 그대로 대입하면, R2는 무료 10GB를 뺀 62GB에 약 0.93달러가 나오고 전송은 0달러입니다. 같은 조건에서 Vercel Blob은 저장과 전송을 합쳐 약 11.5달러입니다. 이미지가 많이 보이는 서비스일수록 이 격차는 그대로 벌어집니다.
원본 한 장이 파일 서너 개로 늘어납니다
업로드 한 번에 원본과 목록용 썸네일, 상세용 중간 크기가 함께 만들어지는 구조가 흔합니다. 사용자는 사진 1장을 올렸다고 생각하지만 저장소에는 3개가 들어갑니다. 저장 요금과 요청 건수가 같이 3배로 잡힙니다.
더 큰 문제는 지우는 쪽입니다. 게시글을 삭제해도 파일은 남는 서비스가 많고, 업로드하다 만 임시 파일과 탈퇴 회원의 사진도 그대로 남습니다. Vercel Blob은 삭제 작업에 요금을 매기지 않는다고 문서에 적어 두었습니다. 지우는 일은 공짜인데 안 지워서 매달 돈을 내는 셈입니다.
무료 한도는 시작할 때만 무료입니다
대부분의 서비스가 무료 구간을 둡니다. R2는 저장 10GB와 Class A 100만 건, Class B 1,000만 건이 매달 무료입니다. Backblaze B2는 첫 10GB가 무료이고, Supabase 무료 요금제는 저장 1GB와 전송 5GB까지입니다.
하루 100장씩 올라오는 서비스라면 R2의 10GB 무료 구간은 두 달을 채우기 어렵습니다. 그래서 초반 몇 달의 0원 청구서를 보고 파일 비용은 안 나온다고 판단하면 어긋납니다. 무료 한도를 월 증가량으로 나눠 언제 유료로 넘어가는지 먼저 계산하세요.
이 구조를 신경 쓰지 않아도 되는 경우가 있습니다
사내 업무 시스템처럼 사용자가 수십 명이고 첨부가 문서 위주라면 이야기가 다릅니다. 전송량이 무료 구간 안에서 끝나기 때문에, 저장소를 최적화하려고 개발비를 더 쓰는 쪽이 손해입니다. 이럴 때는 지금 쓰는 서버에 그대로 저장해도 문제가 되지 않습니다.
반대로 상품 사진이 곧 매출인 쇼핑몰, 이미지가 본문인 커뮤니티, 사용자 사진을 모두 보관해야 하는 서비스는 첫 설계에서 저장 위치와 삭제 정책을 정해야 합니다. 나중에 옮기려면 파일을 통째로 복사해야 하고, 그 복사에도 전송 요금이 붙습니다.
요금 항목을 직접 확인하려면 Cloudflare R2 공식 요금 문서를 보시고, 비슷한 운영 비용 이야기는 실무 가이드에 모아 두었습니다. 서비스 상황에 맞는 저장 구조가 필요하면 Codeforest로 문의해 주세요.
결론: 저장 용량이 아니라 조회수로 견적을 잡으세요
파일 업로드 요금은 저장 용량, 전송량, 요청 건수 세 항목으로 갈라집니다. 저장은 72GB에 월 1~2달러 수준으로 예측하기 쉽지만, 전송은 조회수에 그대로 비례해 같은 조건에서 열 배 가까이 벌어집니다. 견적을 낼 때 몇 GB를 쓸지보다 이미지가 한 달에 몇 번 보일지를 먼저 답해야 하는 이유입니다.
판단 기준은 두 개입니다. 이미지 조회가 많으면 전송이 무료인 R2나 조건부 무료인 B2 쪽이 유리하고, 조회가 적고 개발 편의가 중요하면 포함분 안에서 쓰는 편이 낫습니다. 어느 쪽이든 삭제 정책과 무료 한도 소진 시점을 먼저 계산해 두면, 반년 뒤 청구서에 놀랄 일은 없습니다.