센드버드(SendBird)가 너무 비싸서 자체 채팅 서비스 구현했던 썰. [Firebase + React-Native = Production Ready Chat Service] (Part 1)

소진호
소진호
Nov 8 · 6 min read

미인하이를 운영하면서 성형외과고객이 소통할 수 있는 채팅 서비스 구현을 앞두고 있었다.

새로운 기능 추가를 앞두고 가용할만한 개발 인력이 없었기 때문에, 센드버드챗킷같은 서비스를 도입할 계획이었다.

몇가지 서비스들을 비교해보고, 나는 아무래도 꼬레안이기 때문에 왠지 센드버드가 끌렸다.

센드버드 홈페이지에 접속해서 Pricing 탭을 클릭하고 미인하이 활성화 유저 대비 얼마만큼의 비용이 드는지 확인하려고 했는데, 그런 기능은 없었고 그냥 Free와 Custom 밖에 없었다.

하.. 귀찮지만 해당 담당자에게 비용을 물어보기 위해서 컨퍼런스 콜하자고 이메일을 보냈다.

시간이 많이 없었기 때문에 답장을 기다리는 동안, 센드버드 SDK 를 이용해서 클라이언트단을 개발하고 있었다. 생각보다 SDK 문서화가 잘되어 있어서 구현하는데는 특별히 문제가 없었다.

그러나 이틀이 지나도 돌아오지 않는 답장.. 마음이 급해져서 한국 오피스 사무실에 전화를 걸어 영업 담당자와 겨우 통화할 수 있었다.

영업 담당자께서 우리 활성화 유저, 목적등을 물어보시고 비용에 대해서 간략히 안내를 받았다. 서비스는 정말 좋은데 생각보다 비용이 너무 높아서👿 다른 서비스로 갈아타기로 마음 먹었다.

흠.. 한 번 센드버드를 경험하니까 다른 서비스들이 너무 허접하게 보였고, 서비스가 커질 경우에는 타종간의 마이그레이션까지 고려해야할 상황이었다. 고민하다가 예전에도 간단한 채팅 서버를 구현해본 경험이 있었기 때문에, 그리고 요새는 클라우드 서비스가 너무 좋아서, 이를 적극 활용하여 자체적으로 채팅 서비스를 구현하기로 했다.😇

전통적인 채팅 서비스 구성도(이 그림 그리는데 2시간 걸림)

Traditional Chat Architecture
Traditional Chat Architecture
Traditional Chat Architecture

Chat Server: REST API, Web Socket, Polling(Web Socket 미지원시) 으로 구성된 최소 단위의 인스턴스, 트래픽에 따라 Scale Out이 용이하도록 설계되어야 한다.

  • REST API: 사용자 인증, 친구 추가등을 위하여 사용된다.
  • Web Socket: 사용자간에 메세지를 주고 받을때 사용된다.
  • Polling: Web Socket을 지원하지 않는 기기에서 사용된다.

Presence Server: 이 서버는 스토커 같이 어떤 사용자가 온라인이고 현재 어느 채팅방에서 채팅중인지(Room or Channel)를 실시간으로 기록하고 있는 저장소이다. 보통 실시간 처리를 위하여 Redis를 많이 사용한다.

왜 필요하지?Chat Server가 하나면 상관없지만 다중으로 구성될 때를 고려해야한다. 
예를 들어 스티브잡스는 A라는 Chat Server Instance에 접속해 있고, 빌게이츠는 Z라는 Chat Server Instance에 접속해 있으면, A와 Z Instance는 매번 메세지를 보낼때마다 해당 유저가 접속해 있는지를 서로 확인해야하는 복잡한 프로세스를 거쳐야 한다.
이를 해결하기 위해 사용자의 온라인 유무등을 저장하는 공용 저장소를 따로 만들어 A, B, ... Z 인스턴스들이 접속해 있거나 접속을 끊은 유저들의 정보를 실시간으로 업데이트 시킨다.
그러면 A Instance는 B ... Z Instance에게 빌게이츠가 접속되어 있는지 일일이 물어볼 필요 없이 Presence Server에 빌게이츠가 접속해 있는지만 물어보면 된다.

Push Service: 스티브잡스가 빌게이츠에게 메세지를 보냈는데, Presence Server를 살펴보니 빌게이츠가 offline일때, Chat Server는 해당 메세지를 Push Service로 보낸다. 이 Push Service를 iOS에서는 APN이라고 부르고 Android에서는 GCM이라고 부르는데, Firebase Cloud Message(FCM)을 사용하면 운영체제를 구분하지 않고 푸시 메세지를 보낼 수 있다.

자.. 대충 전통적인 채팅 서비스를 살펴보았는데, Chat Server, Presence Server, Media Storage Server, DB는 각각 Firebase의 Functions+ Firestore, Realtime Database, Storage, FireStore로 대체할 수 있다.

Can be replaced with Firebase
Can be replaced with Firebase
Servers can be replaced with Firebase

장점은 일단 비용이 매우 저렴하다. 채팅 서비스들보다 최소 10배 이상은 저렴한 것 같다. 그리고 Scale Out과 같은 상황을 대비할 필요도 없다.

다만 Firebase의 Realtime Database는 동시 연결이 최대 10만개만 지원을 하기 때문에 동시 접속자수가 10만명이 넘는 서비스에 적용하기에는 무리가 있다. (물론 다수의 Realtime Database 연결하여 동시 접속자 수를 늘리는 방법이 있는데 추천하고 싶지는 않다. https://firebase.google.com/docs/database/usage/sharding)

AWS를 사용하는 사용자라면 AppSync를 이용해서 Firebase보다 더욱 간단하게 처리할 수 있지만 AppSync는 내부적으로 Cognito와 DynamoDB를 사용하기 때문에 기존 서비스가 Cognito를 사용하지 않거나 DynamoDB에 익숙하지 않은 사용자가 이용하기에는 다소 무리가 있다.

Firebase Chat
Firebase Chat

다음 파트2에서는 직접 코드로 해당 기능을 설명하겠다.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade