Skip to content

오프라인에서 사용할 수 있는 기능은?

p-chanmin edited this page Jan 27, 2024 · 2 revisions

네트워크 연결 환경

MeetMeet 앱은 기본적으로 API 호출을 통해 거의 모든 로직이 수행되기 때문에 네트워크 연결 상태는 필수적이다.

하지만 기본 내장 캘린더앱과 같이 오프라인에서도 캘린더 앱을 사용할 수 있도록 하기 위해서 고민하였다.

API통신으로 모든 일정을 다 받아와서 로컬에 저장하는 로직은 시간이 오래걸리는 문제가 있었기 때문에 기간을 정해서 일정 정보를 가져와 일정 정보를 로컬에 저장하고, 오프라인 상태에서는 로컬에 저장된 일정 정보를 통해서 일정을 사용자에게 보여주어 캘린더앱의 기본적인 기능을 제공하기로 하였다.

로컬 데이터 vs 서버 데이터

처음에는 일정 정보에 대한 데이터는 로컬 데이터와 서버 데이터의 형태가 서로 다르게 설계되었다.

사용자에게 보여주고, 일정이 사용자마다 다르게 적용되는 일정 색깔이나, 일정 알림의 데이터는 로컬에서만 저장하고, 서버에서는 저장하지 않도록 하였다.

이 경우 문제가 발생했다.

서버에서 일정 정보를 가져올 경우, 기존 데이터를 삭제하고 새로 받아온 데이터로 덮어쓰지 못 하고, 일정 색깔과 일정 알림을 유지한 상태로 데이터를 업데이트해서 로컬에 저장해야 했고, 로컬 데이터베이스와 서버 데이터 베이스의 일정을 비교하면서 변경되거나 추가된 일정을 업데이트 해야 했다.

이 문제를 해결하기 위해서 로컬 데이터와 서버 데이터의 형태를 통일하는 과정을 거쳤고, 일정 색깔과 일정 알림에 대한 정보도 서버에 저장하도록 변경하였으며, 일정에 초대되는 경우 초대된 사용자는 일정 주인이 설정한 값을 기본으로 하고 개개인이 수정할 수 있도록 변경하였다.

어디까지 기능을 제공할 것인가?

일정 정보를 보여주는 기능은 로컬 데이터를 통해 오프라인에서도 기능을 제공할 수 있었다.

하지만 그 외 다른 기능을 사용할 수 있도록 할 수 있지 않을까?

적어도 일정 추가/삭제/수정 등의 기능을 제공하기 위해서 고민하였다.

발생할 수 있는 동기화 문제

  • 오프라인에서 일정을 수정하고 로그아웃 한 경우, 서버에 반영되지 않음
  • 다중기기 트랜젝션 처리의 어려움
  • 오프라인에서 추가/삭제의 경우 서버와 로컬 데이터 별도의 비교가 필요
  • 서비스의 기준이 되는 Local DB

오프라인 상태에서 기능을 제공하기 위해 동기 문제를 고민했을 때, 위와 같은 문제가 발생할 수 있었다.

1. 오프라인에서 일정을 수정하고 로그아웃 한 경우, 서버에 반영되지 않음

오프라인 상태에서 일정에 대한 수정이 발생한 후, 네트워크 연결 없이 로그아웃 된다면 해당 데이터들은 모두 삭제된다.

오프라인에서 데이터를 수정하고 이를 서버에 반영하는 부분에서 어떻게 처리할지 어려움이 있었고, 어떤 플래그나 태그를 세워서 추가적인 작업이 필요로 해보였다.

2. 다중기기 트랜젝션 처리의 어려움

서버와 동기화를 진행하는 것과 비슷하게 다중기기에서 트랜젝션 처리에 대해서도 어려움이 있다.

여러 개의 기기에서 서비스를 이용하고 있고, 두 기기가 오프라인 상태에서 일정에 대한 수정이나 변경이 발생했을 경우 어떤 기기의 작업을 우선순위로 처리해야할 지 파악하는 것에 어려움이 있었다.

3. 오프라인에서 추가/삭제의 경우 서버와 로컬 데이터 별도의 비교가 필요

또 서비스의 특성 상 사용자가 아닌 타인에 의해 일정이 수정될 수 있기 때문에 이것을 판별하기 위한 별도의 플래그가 필요하다.

다중 기기와 비슷하게, 같은 일정을 공유하는 경우, 오프라인 상황에서 사용자A가 일정을 수정하고, 사용자B가 일정을 수정했을 경우를 어떤 우선순위로 처리할 지에 대한 어려움이 있으며,

단순히 DB 비교만 한다면 사용자A가 오프라인 상황에서 앱 데이터를 모두 삭제한다면, 네트워크가 연결되었을 때 모든 일정에 대한 삭제 작업이 진행되어 원하지 않은 데이터 소실이 발생할 수 있다.

4. 서비스의 기준이 되는 Local DB

그렇다면 사용자가 계획한 일정 정보와 가장 일치하는 주요 데이터 베이스는 로컬이 되어야 할지 서버가 되어야 할지 고민했다.

만약 일정 추가/삭제/수정에 대한 기능을 제공한다면 주요 데이터 베이스는 로컬이 되며, 그렇지 않는다면 주요 데이터 베이스는 서버가 될 것이다.

MeetMeet앱은 일정의 정보와 추억을 공유하는 서비스에 초점을 맞추고 있기 때문에, 하나의 일정을 동시에 다양한 사용자가 접근할 수 있다.

그렇기 때문에 사용자가 계획한 일정 정보와 가장 일치하는 주요 데이터 베이스는 서버가 될 필요성을 느꼈고, 오프라인 상태에서 일정 추가/삭제/수정 기능은 제공하지 않기로 하였다.

이러한 문제들과 관련하여 CalDAV를 사용하여 동기화 문제를 해결할 수 있음을 알게 되었고, 이후에 CalDAV를 반영하여 개선한다면, 동기화 문제 및 다른 캘린더 서비스와의 연동도 고려해 볼 수 있을 것으로 예상한다.

그렇다면 오프라인에서 사용할 수 있는 기능은?

서버의 데이터 베이스가 주요 데이터 베이스라고 했을 때, 서버에서 받아온 데이터를 로컬에 저장하고 그 데이터를 오프라인에서도 보여주는 기능까지 제공할 수 있었다.

오프라인에서 일정 추가/삭제/수정의 기능을 제공하지 않기 때문에 오프라인 환경에서 추가로 사용자에게 제공할 수 있는 기능은 어떤 것이 있을지 고민하였다.

일정 정보를 로컬에 저장하기 때문에 알정 알림에 대한 기능을 제공할 수 있을 것으로 생각하고, 로컬 데이터 베이스를 기반으로 일정 알림에 대한 기능을 오프라인에서도 제공하기로 정하였다.


관련문서

일정 알림을 놓치지 않고 받는 법

⚽️협업 룰

코딩 컨벤션

📔회고

팀 회고

개인 회고

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

👨‍🏫멘토링 회의록

💻개발일지

Android

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

💡트러블슈팅

Android

K004 김근범

K016 박찬민

K032 이해림

J153 차세찬

J156 최다정

📋회의록

스크럼 회의

스프린트 회의

밋밋 회의

공통

BackEnd

Android

기획

Clone this wiki locally