훌륭한 질문입니다. 서비스는 안정적으로 동작해야 합니다. 당연히 좋은 앱들은 오프라인 모드를 고려하죠. 운동앱인데, 서버에 업로드하려고 하는데 음영지역이면? 날려버릴 건가요? 당연히 그렇게 하면 안됩니다.
서버에서 데이터를 받아서 받은 데이터를 그대로 파일로 저장합니다. 그리고 기존처럼 처리하죠.
서버에 데이터를 받아올 때, Internet이 안되면, 파일을 읽어 옵니다.
json이라면, gson을 사용하면 간단하게 파일에 저장하고, 파일에서 객체를 읽어 올 수 있습니다.
Data Model를 사용한다면, 객체에 담고, 객체를 저장하거나, 파일에서 객체를 불러오는 방식을 사용해도 됩니다. (저의 경우는 이 방시을 사용했죠. 서버로 데이터를 업로드할 때 인터넷이 안되거나 통신에 오류가 나면, 파일로 저장해 두고, 다음에 접속했을 때 올리는 형태로 안정적으로 구현합니다.)
중요한 것은 서버에서 가져올 때 쿼리 파라미터가 어떤 거냐에 따라서 같은 Request라도 몇개를 보관할 것이냐가 문제가 되겠죠.
만약에 서버에서 가져오는 것은 아주 심플하거나 파라미터가 거의 유사하다면 크게 문제될 것이 없습니다.
아래는 와이파이던, 블루투스던, 이통사 네트워크던 인터넷이 되어 있는지 확인하는 코드입니다.
// 어떤 네트워크던 연결되어 인터넷이 되는지 확인용.
public static boolean isNetworkAvailable(Context ctx) {
ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
if (networkInfo == null) return false;
return networkInfo.isConnected();
}
아래는 Object Instance를 Gson으로 저장하는 로직입니다. (objReceived는 클래스의 인스턴스입니다. 통신한 뒤에 객체에 저장된 놈이죠. Retrofit2 같은 걸 쓰면 json 같은 데이터는 자동으로 객체에 들어가므로, 그걸 그냥 파일로 저장하면 됩니다. 반대도 있습니다. gson.fromFile인가 그래요. 구글링하면 금방 나옵니다.)
if (objReceived != null) {
Gson gson = new Gson();
String gsonStr = gson.toJson(objReceived);
writeToFile(filePath, gsonStr);
}
훌륭한 질문이라고 했던 것은,
개발을 하면서 드는 이런 질문들을 포기하지 말고 끝까지 구현해 나가기를 바라는 의도입니다.
이런 질문들이 없었다면, 훌륭한 개발자들이 나오지 않았겠죠.
이렇게 드는 질문들을 지금 하시는 프로젝트 기간안에 구축하려고 노력하는 바로 그 순간이 훌륭한 개발자인 것입니다. 10년 20년을 코딩했다고 훌륭한 개발자가 되는 게 아닙니다. :) 즉 훌륭한 개발자는 지금 그순간에 진행중인 것이지, 완성되는게 아닙니다. 질문을 멈추는 순간, 꼰대 개발자가 되는 거죠.
글을 쓰면서도 찔리네요. :)