[실전 서버리스 12] egress 0의 오브젝트 스토리지 R2, S3와 뭐가 다른가

커뮤니티에는 이미지와 동영상이 넘친다. 이 파일들을 어디에 저장할까. 데이터베이스에 넣기엔 너무 크고 무겁다. 파일 전용 저장소가 필요한데, 이게 오브젝트 스토리지다. 내가 쓴 건 R2인데, 가장 큰 특징이 egress 비용이 0이라는 점이다. 이번 편은 R2가 무엇이고 기존 오브젝트 스토리지와 뭐가 다른지를 다룬다.


미디어가 많은 커뮤니티에 오브젝트 스토리지 선택은 비용을 크게 좌우한다. 특히 이 egress 0이라는 특성이 왜 결정적인지를 이해하는 게 이번 편의 핵심이다.

1. 오브젝트 스토리지란

오브젝트 스토리지는 파일을 통째로 저장하고 꺼내는 저장소다. 이미지, 동영상, 문서 같은 걸 하나의 객체로 저장한다. 데이터베이스가 정형화된 데이터를 다룬다면, 오브젝트 스토리지는 이런 비정형 파일을 다룬다. 각 파일은 고유한 키로 식별되어 저장되고 꺼내진다.


웹 서비스에서 이게 왜 필요하냐면, 파일은 데이터베이스에 넣기엔 부적합하기 때문이다. 큰 파일을 데이터베이스에 넣으면 무거워지고 비효율적이다. 대신 파일은 오브젝트 스토리지에 두고, 데이터베이스에는 그 파일의 위치, 즉 주소만 저장한다. 데이터와 파일의 역할을 나누는 것이다.


내 커뮤니티도 이 구조다. 글과 댓글, 사용자 정보는 D1에 있고, 이미지와 동영상 같은 미디어 파일은 R2에 있다. 글에 이미지를 올리면 그 파일은 R2에 저장되고, D1의 글 데이터에는 그 파일 주소가 기록된다. 각자 잘하는 걸 맡는 분업이다.


오브젝트 스토리지가 파일과 데이터를 나눈다는 게 좋은 설계다. 큰 파일은 스토리지에, 그 파일의 위치는 데이터베이스에 둔다. 데이터베이스는 가볍게 유지되고, 파일은 파일에 특화된 곳에서 다뤄진다. 각자 잘하는 걸 맡기는 이 분업이 시스템을 효율적으로 만든다. 파일을 데이터베이스에 넣는 실수를 피해야 한다.


한 가지 더, R2를 쓰면 파일 접근 권한도 관리할 수 있다. 아무나 접근하면 안 되는 비공개 파일과, 누구나 볼 수 있는 공개 파일을 구분해 다룰 수 있다. 커뮤니티라면 공개 이미지는 누구나 보게 하되, 민감한 파일은 접근을 제한하는 식이다. 이 권한 관리도 파일을 안전하게 다루는 한 부분이다.

2. egress 비용이란

이제 핵심인 egress를 보자. egress는 데이터가 저장소 밖으로 나가는 것, 즉 사용자에게 전송되는 것을 말한다. 사용자가 이미지를 보면 그 이미지 데이터가 저장소에서 사용자에게 나간다. 이게 egress다. 문제는 많은 클라우드가 이 나가는 데이터에 비용을 매긴다는 점이다.


대표적인 오브젝트 스토리지인 S3 같은 서비스는 이 egress에 요금을 부과한다. 파일을 저장하는 비용과 별개로, 사용자가 그 파일을 볼 때마다 나가는 데이터양만큼 돈이 나간다. 이미지가 많이 조회되는 사이트일수록 이 egress 비용이 커진다. 인기 있는 이미지 하나가 계속 조회되면 그만큼 계속 과금된다.


이게 미디어가 많은 사이트에 부담이 크다. 커뮤니티처럼 이미지와 동영상이 많고 자주 조회되는 사이트는, egress 비용이 저장 비용을 훌쩍 넘길 수 있다. 사용자가 콘텐츠를 볼 때마다 돈이 나가는 구조라, 사이트가 인기를 끌수록 비용이 눈덩이처럼 불어난다.


egress 비용이 뭔지 모르고 스토리지를 고르면 나중에 청구서에 놀란다. 저장 비용만 보고 골랐는데, 사용자가 파일을 볼 때마다 나가는 egress에 돈이 붙는 걸 몰랐던 것이다. 미디어가 많고 조회가 많은 사이트일수록 이 egress가 저장 비용을 넘는다. 그래서 스토리지 선택 시 egress 정책을 꼭 봐야 한다.


조금 더 배경을 주면, egress 0은 앞서 다룬 워커스의 대역폭 0과 짝을 이룬다. 워커스가 페이지를 보내는 대역폭이 0이고 R2가 파일을 보내는 egress가 0이면, 사용자에게 무언가를 전송하는 비용이 통째로 사라진다. 미디어 중심 사이트에 이 조합은 비용 구조를 근본적으로 바꾸는 결정적 이점이다.

3. R2의 egress 0

R2의 결정적 차이가 여기 있다. R2는 egress 비용이 0이다. 파일을 저장하는 비용은 있지만, 그 파일이 사용자에게 아무리 많이 전송돼도 나가는 데이터에 대한 요금은 없다. 이미지가 백만 번 조회돼도 egress 비용은 0이다.


이게 미디어가 많은 사이트에 얼마나 큰지는 계산해보면 안다. egress에 요금을 매기는 스토리지를 썼다면, 인기 이미지들이 조회될 때마다 비용이 쌓였을 것이다. 그런데 R2에서는 그 부분이 통째로 0이다. 저장 비용만 내면 되고, 사용자가 콘텐츠를 아무리 봐도 전송 비용은 안 나간다.


앞서 워커스의 대역폭 0과 이 R2의 egress 0이 합쳐지면, 미디어를 서빙하는 비용이 거의 저장 비용만 남는다. 이미지와 동영상이 아무리 많이 조회돼도 그 전송에는 돈이 안 든다. 미디어 중심 커뮤니티에 이건 결정적인 비용 이점이다. 내가 R2를 택한 가장 큰 이유다.


R2의 egress 0이 미디어 커뮤니티에 결정적이라는 걸 계산으로 실감했다. egress 과금 스토리지였다면 인기 이미지들이 조회될 때마다 비용이 쌓였을 텐데, R2는 그게 0이다. 저장 비용만 내고 조회는 아무리 많아도 전송 비용이 없다. 이 하나가 미디어 사이트의 비용 구조를 통째로 바꾼다.

4. S3 호환성

R2의 또 다른 장점은 기존 표준과 호환된다는 점이다. 오브젝트 스토리지의 사실상 표준인 S3의 방식과 호환되어서, S3용으로 만들어진 도구와 라이브러리를 R2에도 대체로 쓸 수 있다. 완전히 새로운 방식을 배울 필요 없이 익숙한 방식으로 다룰 수 있다.


이 호환성이 주는 실용적 이점이 크다. 오브젝트 스토리지를 다루는 지식과 도구가 이미 S3 중심으로 쌓여 있는데, R2가 그걸 그대로 활용하게 해준다. 기존 지식을 버리지 않고 egress 0의 이점만 취하는 것이다. 새 기술로 옮기는 부담이 적다.


물론 완전히 같지는 않아서 일부 차이는 있다. 하지만 기본적인 파일 저장과 조회는 익숙한 방식으로 된다. 그래서 오브젝트 스토리지를 다뤄본 사람이라면 R2 적응이 빠르다. 표준을 따르면서 자기만의 강점을 더한 게 R2의 영리한 점이다.


S3 호환성이 주는 실용적 이점을 무시하면 안 된다. 오브젝트 스토리지 지식과 도구가 S3 중심으로 쌓여 있는데, R2가 그걸 그대로 쓰게 해준다. 새 방식을 처음부터 배울 필요 없이 익숙한 방식으로 egress 0의 이점만 취한다. 표준을 따르면서 강점을 더한 이 영리함이 R2 채택을 쉽게 한다.


조금 더 실무적으로, R2를 쓸 때 파일 키 설계도 신경 써야 한다. 파일을 식별하는 키를 어떻게 짓느냐가 관리 편의를 좌우한다. 나는 파일 종류와 용도가 드러나게 키를 체계적으로 지었다. 그래야 나중에 특정 종류의 파일을 찾거나 정리하기 쉽다. 무질서한 키는 파일이 쌓일수록 관리를 어렵게 한다.

5. 워커스와의 통합

R2는 워커스와 같은 생태계라 통합이 매끄럽다. 앞서 다룬 바인딩으로 워커에 R2를 연결하면, 코드에서 파일을 저장하고 꺼내는 게 간단하다. 별도의 인증이나 복잡한 연결 없이 바인딩 하나로 붙는다. 데이터베이스를 바인딩으로 붙이던 것과 같은 방식이다.


이 통합 덕에 파일을 다루는 흐름이 단순해진다. 사용자가 이미지를 올리면 워커가 그걸 받아 R2에 저장하고, 그 주소를 D1에 기록한다. 사용자가 이미지를 보면 R2에서 꺼내 전송한다. 이 모든 게 한 생태계 안에서 매끄럽게 이어진다. 다만 큰 파일 업로드에는 더 나은 방식이 있는데, 그건 다음 편에서 다룬다.


정리하면 R2는 파일을 다루는 오브젝트 스토리지인데, egress 비용이 0이라 미디어가 많은 사이트에 결정적으로 저렴하고, S3와 호환되며, 워커스와 매끄럽게 통합된다. 다음 편에서는 R2에 파일을 올리는 정석적인 방법, presigned URL을 이용한 2단계 업로드를 다룬다. 큰 파일을 워커의 부담 없이 올리는 방법이다.


워커스와 R2의 통합이 파일 흐름을 단순하게 한다. 바인딩 하나로 붙으니 별도 인증이나 복잡한 연결이 없다. 사용자가 올린 파일을 워커가 R2에 저장하고 주소를 데이터베이스에 기록하는 흐름이 한 생태계 안에서 매끄럽게 이어진다. 여러 서비스를 조합할 때 생기는 연결의 복잡함이 없다.


다음 편에서는 R2에 파일을 올리는 정석적인 방법, presigned URL을 이용한 2단계 업로드를 다룬다. 큰 파일을 워커의 한도에 부딪히지 않고 안전하게 올리는, 오브젝트 스토리지 업로드의 표준 패턴이다.