안녕하세요! 오늘은 채팅 로직과 더불어 채팅 데이터를 어디에 저장할지에 대해 고민해본 내용입니다!
일단 채팅 로직에 대해 먼저 알아보아야 합니다. 채팅의 핵심은 실시간 데이터 처리와 사용자 경험의 일관성 유지입니다. 이를 고려하여 제가 구현한 채팅 조회 로직은 다음과 같습니다.
- 서버로부터 최신 채팅 내역을 받아옵니다.
- 받아온 데이터는 로컬 DB에 저장됩니다.
- 이후, 필요시 서버로부터 추가 데이터를 가져와 Realm과 동기화하여 데이터의 일관성을 유지합니다.
이 과정을 통해 사용자는 온라인과 오프라인 상태를 가리지 않고 원활한 사용 경험을 얻을 수 있습니다.
저는 처음에 채팅 조회 로직을 찾아보면서 '서버에서 다 가져오면 되지 왜 로컬 DB에 저장하지...?' 싶었습니다. 근데 다 이유가 있더라구요..
서버에서 모든 데이터를 실시간으로 받아오는 방식은 여러 한계가 있습니다.
첫째, 네트워크 지연이 발생하면 사용자 경험이 저하될 수 있습니다.
둘째, 네트워크 연결이 불안정하거나 끊겼을 때 사용자는 채팅 내역을 확인하거나 메시지를 보낼 수 없게 됩니다.
반면, Realm에 채팅 내역을 저장하면 로컬 DB에서 데이터를 빠르게 읽어올 수 있어 이러한 문제를 해결할 수 있습니다. 사용자는 오프라인 상태에서도 이전 채팅 내역을 확인하고 메시지를 작성할 수 있으며, 네트워크가 복구되면 자동으로 서버와 동기화하여 데이터 일관성을 유지할 수 있습니다.
그럼 여기서 고민할 지점이 하나 더 생기게 됩니다. '로컬 DB 중 어느 걸 써야할까?' 저는 결론적으론 Realm을 선택했습니다. 로컬 DB 종류와 그 장단점들을 비교해보면서 Realm이 적합하다고 생각했기 때문인데요!
Realm
장점 -> 메모리 효율성이 뛰어나고, 데이터 접근 속도가 빠르며, 데이터 모델링이 직관적입니다. 특히, Realm의 자동 동기화 기능은 실시간 데이터 동기화가 중요한 애플리케이션에 매우 유용합니다.
또한 데이터베이스 파일 크기를 작게 유지할 수 있습니다.
단점 -> 데이터 모델 변경 시 마이그레이션이 필요하며, 특정 복잡한 쿼리를 처리하는 데 한계가 있을 수 있습니다.
Core Data
장점 -> Apple의 네이티브 프레임워크로 iOS와 깊이 통합되어 있어, 강력한 데이터 모델링 기능과 성능 최적화를 제공합니다. 자동 마이그레이션 기능과 같은 편의 기능도 제공합니다.
단점 -> 사용법이 복잡하며, 초기 설정과 학습에 많은 시간이 소요됩니다. 데이터베이스 액세스 속도가 상대적으로 느릴 수 있으며, 실시간 동기화 기능이 부족합니다.
SQLite
장점 -> SQL 기반으로 강력한 쿼리 기능을 제공하며, 경량화된 DB로 메모리 사용량이 적습니다. 다른 시스템과의 호환성이 높고, 다양한 플랫폼에서 사용 가능합니다.
단점 -> SQL을 직접 사용해야 하므로 데이터 모델링이 복잡해질 수 있으며, 개발자가 데이터 무결성과 일관성을 직접 관리해야 합니다.
Realm은 실시간 동기화가 필요한 채팅 앱에 가장 적합한 선택이었다고 생각합니다. 퍼포먼스가 가장 좋기도 하고, 카카오톡 등 여러 채팅 앱에서 사용중이기 때문에 Realm을 선택하는 게 합리적이라고 여겨졌습니다.
물론 여러 사이드 문제들이 있어 안전하지 않은 경우가 있다고 듣긴 했으나, 간단한 개인 프로젝트이기에 Realm을 적용해도 결과적으로 무리가 없었습니다.
프로젝트 특성에 따라서 선택하시면 좋을 것 같습니다.