Notice
Recent Posts
Recent Comments
관리 메뉴

즐겁게, 코드

토이 프로젝트 스토리지 결정하기 본문

👨🏻‍💻 기록

토이 프로젝트 스토리지 결정하기

Chamming2 2022. 6. 11. 19:12

최근 새로운 토이 프로젝트를 개발하면서, 빠른 개발을 위해 firebase strorage 를 활용해 갤러리 서비스를 구현하고 있었습니다.

처음에는 firebase storage가 5GB의 스토리지를 항상 무료로 제공한다는 점에서 무료로 프로젝트를 운영할 때 적합할 것 같았지만, "대역폭 요금" 이라는 예상치 못했던 요인으로 인해 스토리지를 포기하게 된 과정을 간단히 소개해보려 합니다.

TL;DR

  • 스토리지를 결정할 때는 저장 용량뿐만 아니라 대역폭 요금 역시 염두에 두어야 한다.
  • 스토리지는 AWS 프리 티어를 적용받는 S3가 가장 경제적이다.
  • 만약 AWS 프리 티어 기간이 만료됐다면 월 5GB, 30GB 대역폭(약 4천원 상당)을 무료로 제공하는 firebase storage가 괜찮은 선택이 될 수도 있다.
  • 만약 서비스를 완전히 무료로 운영하고자 한다면, https://imgbb.com/ 등의 무료 이미지 호스트 서비스와 연계해 서비스를 구성할 수 있다.

처음 firebase storage 를 선택한 이유는 크게 다음과 같습니다.

  • 기존의 채팅, 인증 등의 기능이 firebase로 구현되어 있음.
  • AWS S3가 5GB의 스토리지를 1년 동안만 무료로 제공하는 데에 비해, firebase는 프로젝트당 5GB의 스토리지를 항상 제공함.

대역폭의 한계

처음에는 스토리지 용량이 무료라는 점에서 좋아했지만 미처 생각하지 못한 부분에서 firebase를 적용하기 어렵다는 결론을 내리게 되었는데요, 크롬 익스텐션 으로 개발되는 프로젝트 특성상 일반적인 방법으로는 애드센스나 애드핏 등의 광고 플랫폼을 사용할 수 없어 100% 무료로 운영이 가능한 경제적인 아키텍처가 필요했습니다.

 

하지만 걸림돌이 된 부분은 firebase storage의 전송 대역폭 요금으로, firebase에서 클라이언트로 파일을 내려받을 때 발생하는 네트워크 전송 비용입니다. 후술할 S3에서는 100GB/월의 대역폭을 제공하고 firebase에서는 1GB/일의 대역폭을 제공하는데, 아무리 업로드 시 이미지를 압축하고 이미지 크기를 제한하는 규칙을 둔다고 해도 1GB/일 이라는 대역폭은 수많은 이미지를 보여주는 갤러리 서비스를 제공하기에는 부족한 용량이라고 생각했습니다.

✅ TMI : browser-image-compression 이라는 라이브러리를 사용하면 클라이언트에서도 이미지를 압축할 수 있습니다.
import imageCompression from "browser-image-compression";  

const handleImageUpload = async (e: ChangeEvent<HTMLInputElement>) => {
  try {
    if (e.target.files) {
      const fileName = e.target.files[0];
      const compressedFile = await imageCompression(fileName, compressOptions);
      const dataUrl = URL.createObjectURL(compressedFile);
      setPhotoFile(fileName);
      setPhotoUrl(dataUrl);
    }
  } catch (err) {
    setPhotoFile(null);
    setPhotoUrl(null);
  }
};
  • 유저가 혼자뿐인 상황에서도 몇 번 갤러리에 진입하니 대역폭 사용량이 2.4%에 이르렀습니다.

저장용량 5GB / 대역폭 1GB * 30은 약 4천원어치 혜택입니다.

S3는 과연 저렴할까?

firebase를 사용할 경우 대역폭 제한으로 인해 높은 확률로 비용이 발생할 것임을 인지하고, 대안으로 S3을 알아본 결과입니다.

 

S3는 약 10GB의 사진을 저장한다 해도 월 300원 정도만이 부과되어 사실상 비용이 나가지 않는 수준으로 관리할 수 있었고, 대역폭 또한 월 100GB를 무료로 활용할 수 있다고 소개되어 있어 제가 예상하는 프로젝트 규모를 커버하기에 적합하다고 느껴졌습니다. 

분명 이것만 봤을땐 문제가 없었는데...

객체당 수명주기를 적용해 최대 약 1 ~ 2GB의 사진을 저장하고, 대역폭이 일 3GB정도 발생한다고 하면 다음과 같이 비용이 발생했습니다.

  • firebase Storage : 스토리지 비용 무료 / 대역폭 2(GB, 유료분) * 30(일) * 0.12$ = 약 8,000원
  • AWS S3 : 스토리지 비용 2(GB) * 0.025$ / 대역폭 무료 = 약 100원 안팎

하지만, 혹시나 하는 생각에 실제 계산기를 사용해봤을 때는 완전히 의외의 결과가 나왔습니다.

firebase : 약 8,000원
...??? 분명 AWS 고객에게는 월 100GB의 대역폭을 준다면서!! 🥲

요금 계산기를 실제로 돌려보니 대역폭 혜택 역시 S3 프리 티어 사용시에만 무료로 제공되는 것을 확인할 수 있었고, 오히려 대역폭 비용이 firebase보다 더 비싸 소규모 프로젝트에서는 firebase storage가 *S3보다 저렴한 것을 알 수 있었습니다.

🔎 Read 횟수가 적은 파일을 단순히 저장만 하는 상황에는 Intelligent Tiering을 활용할 수 있는 AWS S3가 적합하겠지만, 이번 사진 갤러리처럼 Read가 자주 일어나는 상황에서는 오히려 firebase가 더 저렴할 수 있을 것 같습니다.

기존에는 스토리지 서비스를 선택할 때, 제공하는 스토리지 용량만을 생각했지만 데이터를 주고받는 대역폭 또한 스토리지 서비스를 결정하는 중요한 척도가 될 수 있음을 깨달을 수 있었습니다.

 

+ 저는 결국 완전 무료로 서비스를 운영하기 위해 클라우드 스토리지를 사용하는 대신, imgbb 라는 무료 이미지 호스팅 서비스에 이미지를 업로드하고 해당 이미지의 참조를 firebase database에서 불러오는 방법으로 아키텍처를 수정했습니다.

 

다음 글에서 이 방법 역시 소개드리도록 하겠습니다. 🙂


참고 : firebase / AWS 요금 계산기

 

Firebase Pricing

무료로 Firebase를 시작하고 전 세계 수백만 명의 사용자로 확장하세요. 무료 할당량 소진 후 사용한 만큼만 비용을 지불하면 됩니다.

firebase.google.com

 

AWS Pricing Calculator

 

calculator.aws

 

반응형
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆