Firebase와 Cloud Firestore로 실시간 메신저 서비스 이전 Part 2

신규 메신저 서비스 개발

Bubble(김동현)
번개장터 기술 블로그
12 min readSep 8, 2022

--

현재의 개발 인력으로도 관리할 수 있는 새로운 메신저 서비스를 구현하기 위해서는 기존 메신저 서비스에서 개발 및 관리 비용이 많이 들어가는 부분들의 개선이 필요했는데,

그 중 가장 많은 비용을 차지하는 실시간 통신 로직을 개선하기 위해 여러 서비스와 솔루션들을 찾던 중 Firebase의 Realtime Database와 Cloud Firestore를 알게됐습니다.

이번 포스트에서는 Firebase와 Realtime Database, Cloud Firestore에 대해 알아보고, 이들을 통해 새로운 메신저 서비스를 구현하는 과정을 정리해보겠습니다.

Firebase

Firebase는 Google에서 지원하는 클라우드 기반의 모바일, 웹 애플리케이션 개발 플랫폼으로, 다양한 클라우드 기반 서비스를 통해 서버리스 애플리케이션 개발 시 필요한 여러 기능과 리소스들을 지원하고 있습니다.

현재까지도 Firebase에서 지원하는 다른 클라우드 기반 서비스를 운영 환경에서 문제없이 사용하고 있으며, 다양한 언어 및 플랫폼 별로 구현된 SDK를 통해 Firebase의 클라우드 기반 서비스를 쉽게 연동할 수 있었습니다.

Realtime Database

Realtime Database는 Firebase의 클라우드 기반 서비스 중 하나로, 실시간 데이터 변경 이벤트를 지원하는 JSON Tree 구조의 NoSQL 데이터베이스를 제공하고 있습니다.

아래와 같이 Realtime Database는 여러 개의 Field로 이루어진 루트 경로의 JSON Object에 하위 경로의 JSON Object를 추가 및 변경하는 방식으로 전체 데이터를 관리하고 있으며, 슬래시 (/) 를 통해 원하는 경로의 데이터에 접근할 수 있습니다.

아래와 같이 Realtime Database에서 특정 경로의 데이터 변경 이벤트를 구독할 경우, 해당 경로의 데이터가 변경될 때마다 이벤트 리스너의 콜백 로직을 통해 실시간으로 변경된 데이터를 조회할 수 있습니다.

아래와 같이 Realtime Database 에서 하위 경로의 데이터 변경 이벤트를 구독할 경우에는 하위 경로의 데이터가 변경될 때마다 이벤트 리스너의 콜백 로직을 통해 실시간으로 변경된 하위 경로의 데이터를 조회할 수 있습니다.

아래와 같이 Realtime Database 에서 특정 경로의 데이터에 OnDisconnect 이벤트를 설정할 경우, 해당 클라이언트와 연결이 종료될 때 OnDisconnect 이벤트에 설정된 데이터가 반영되면서 Realtime Database에 특정 클라이언트의 연결 및 접속 상태를 기록할 수 있습니다.

아래와 같이 Realtime Database 에서 ‘/.info/connected’의 데이터 변경 이벤트를 구독할 경우, Realtime Database와의 연결이 생성 및 종료될 때마다 이벤트 리스너의 콜백 로직을 통해 변경된 연결 및 접속 상태를 조회할 수 있습니다.

하지만 Realtime Database는 단일 필드에 대한 쿼리와 정렬만 지원하고 있으며, 정해진 클라이언트의 연결과 쓰기 작업의 한도를 초과하면 새로운 데이터베이스를 생성해서 데이터의 분리 보관해야 되는 단점이 있었습니다.

Cloud Firestore

Cloud Firestore는 Firebase의 클라우드 기반 서비스 중 하나로, 실시간 데이터 변경 이벤트를 지원하는 Document 기반의 NoSQL 데이터베이스를 제공하고 있습니다.

아래와 같이 Cloud Firestore는하나의 Collection에서 JSON Object같이 여러 개의 Field로 이루어진 Document를 추가 및 변경하는 방식으로 전체 데이터를 관리하고 있으며, 슬래시 (/) 를 통해 원하는 경로의 Collection과 Document에 접근할 수 있습니다.

아래와 같이 Cloud Firestore에서 특정 Document의 데이터 변경 이벤트를 구독할 경우, 해당 Document의 데이터가 변경될 때마다 이벤트 리스너의 콜백 로직을 통해 실시간으로 변경된 Document의 데이터를 조회할 수 있습니다.

아래와 같이 특정 Collection의 Document 변경 이벤트를 구독할 경우에는 해당 Collection에서 Document가 생성 및 변경될 때마다 이벤트 리스너의 콜백 로직을 통해 실시간으로 생성 및 변경된 Document의 데이터를 조회할 수 있습니다.

Cloud Firestore는 Collection과 Document를 통해 계층별로 데이터를 관리할 수 있으며, 다중 필드에 대한 쿼리와 인덱스, 정해진 클라이언트의 연결과 쓰기 작업의 한도를 초과하면 데이터베이스를 자동으로 확장시키는 기능 등 Realtime Database의 여러 단점이 개선되었습니다.

하지만 OnDisconnect 이벤트와 ‘/.info/connected’ 같이 클라이언트의 연결 및 접속 상태를 조회할 수 있는 기능은 따로 지원하지 않고 있어서 연결 및 접속 상태와 관련된 부분은 Realtime Database나 다른 서비스를 통해 구현이 필요했습니다.

Realtime Database vs Cloud Firestore

Realtime Database와 Cloud Firestore 모두 실시간 데이터 변경 이벤트를 지원하고 있으며 각각의 장단점이 존재했지만 많은 양의 데이터를 읽고 써야 하는 메신저 서비스의 특성상

Collection과 Document를 통한 계층별 데이터 관리, 다중 필드에 대한 쿼리와 인덱스, 데이터베이스의 자동 확장과 같이 많은 양의 데이터 읽기와 쓰기를 위한 기능들을 지원하는 Cloud Firestore 를 선택했으며,

Cloud Firestore로 메신저 서비스의 데이터를 관리하고 실시간 데이터 변경 이벤트로 메신저 서비스의 실시간 통신 로직을 구현하면서 전보다 간단한 구조로 메신저 서비스를 구현할 수 있었습니다.

--

--