준비하고 있는건 목표 관리 앱이구요. 목표 데이터가 핸드폰(혹은 타블렛) 간에 동기화 되도록 하는 기능을 고민하고 있습니다.
제가 고민해본 구조는 다음과 같습니다.
서버를 각 사용자들의 구글 드라이브로 설정하고, 서버는 파일을 단순히 각 기기로 업로드/다운로드 하는 용도로만 사용합니다. (각 기기들이 Drive Api로 요청을 하면 파일을 받거나 주거나 하는거죠.)
파일은 sqlite 파일로, 서버에 저장된 db파일을 받으면(서버에 db가 없으면 단순히 클라이언트의 파일을 서버로 업로드) 클라이언트가 변경 사항을 확인하고 파일을 동기화 시켜줍니다. 그리고 동기화 된 파일을 다시 서버에 전송합니다.
여기서 문제가 두개의 클라이언트가 있다고 할 때, 서버(드라이브)에서 파일을 동시에 받아서 동시에 수정된 사항을 적용시키고 업로드 해버리면 0.1초라도 나중에 전송되는 파일이 다른 파일을 덮어 씌우게 되죠.
제대로 작동 되게 하려면 한번에 하나의 클라이언트만 접근 가능하게 설정 해서 순차적으로 서버의 데이터와 동기화 시키도록 만들어야 할텐데 드라이브에는 파일에 접근할 때, 한번에 하나의 클라이언트만 접근 가능하도록 하는 기능이 없다더군요.(
https://www.google.co.kr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&sqi=2&ved=0ahUKEwjF48zpoLXTAhWGjZQKHdCzC4EQFgguMAE&url=https%3A%2F%2Fproductforums.google.com%2Fd%2Fmsg%2Fdrive%2FBTuKcnQvd8M%2FG8B20kxt51AJ&usg=AFQjCNGZoqGZ-qgVU_Vku2uvdgSTlQpLjQ&sig2=nKHcMlpXqrfHKNn4wj4cJw)
어떤 해외 포럼에서 제안된 방법은 클라이언트가 접근했을때 서버의 db파일을 바꿔서 다른 클라이언트가 접근중이라는걸 알리는 방법이었는데 (거의 있을 수 없는 일이긴 하지만) 두 클라이언트가 완전히 같은 시간에 접근하게 되면 무용지물이 되는 방법이죠.
관련 api들을 뒤져보니 firebase realtime database는 모든 클라이언트가 하나의 서버에 접속하는 채팅앱 등에 사용되는 서비스인거 같고, 딱히 나와있는 레퍼런스도 없더군요..(무더기의 일반적인(?) 서버 상에서 동기화 작업을 해주는 레퍼런스들을 제외하고 말이죠.)