[flutter] - Flutter에서의 오프라인 모드 지원 방법

Flutter는 다양한 플랫폼에서 동작하는 크로스 플랫폼 앱 개발 프레임워크로써, 온라인이 아닌 환경에서도 사용할 수 있는 앱을 개발할 수 있습니다. Flutter에서 오프라인 모드를 지원하기 위해서는 몇 가지 방법을 활용할 수 있습니다. 이 글에서는 그 중 일부를 소개하겠습니다.

1. 네트워크 연결 여부 체크하기

오프라인 모드에서 앱이 동작할 수 있도록 하려면, 먼저 네트워크 연결 상태를 체크해야 합니다. 이를 위해 Flutter에서는 connectivity 패키지를 제공하고 있습니다. 이 패키지를 사용하면 앱이 현재 네트워크에 접속되어 있는지 여부를 확인할 수 있습니다.

import 'package:connectivity/connectivity.dart';

Future<bool> checkInternetConnectivity() async {
  var connectivityResult = await (Connectivity().checkConnectivity());
  if (connectivityResult == ConnectivityResult.none) {
    // 오프라인 상태
    return false;
  }
  
  // 온라인 상태
  return true;
}

위의 코드는 connectivity 패키지를 사용하여 네트워크 연결 상태를 체크하는 방법을 보여줍니다. checkInternetConnectivity 함수를 호출하면 현재의 연결 상태를 확인할 수 있습니다.

2. 캐시 활용하기

오프라인 모드에서는 네트워크로부터 데이터를 가져오는 대신, 이전에 저장한 캐시 데이터를 활용할 수 있습니다. Flutter에서는 shared_preferences 패키지를 사용하여 간단한 키-값 쌍을 로컬에 저장하고 가져올 수 있습니다.

import 'package:shared_preferences/shared_preferences.dart';

Future<void> saveDataToCache(String key, String value) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  await prefs.setString(key, value);
}

Future<String> getDataFromCache(String key) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  return prefs.getString(key);
}

위의 코드는 shared_preferences 패키지를 사용하여 캐시 데이터를 저장하고 가져오는 방법을 보여줍니다. saveDataToCache 함수를 사용하여 데이터를 저장하고, getDataFromCache 함수를 사용하여 데이터를 가져올 수 있습니다.

3. 로컬 데이터베이스 사용하기

더 복잡한 데이터를 오프라인 환경에서 사용해야 할 경우, 로컬 데이터베이스를 사용하는 것이 좋습니다. Flutter에서는 sqflite 패키지를 통해 SQLite 데이터베이스에 접근할 수 있습니다.

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

Future<Database> openDatabaseConnection() async {
  var databasesPath = await getDatabasesPath();
  String path = join(databasesPath, 'my_database.db');
  return openDatabase(path, version: 1,
      onCreate: (Database db, int version) async {
    await db.execute('CREATE TABLE IF NOT EXISTS my_table (id INTEGER PRIMARY KEY, name TEXT)');
  });
}

Future<void> insertDataToDatabase(String name) async {
  Database db = await openDatabaseConnection();
  await db.insert('my_table', {'name': name});
}

Future<List<Map<String, dynamic>>> fetchDataFromDatabase() async {
  Database db = await openDatabaseConnection();
  return db.query('my_table');
}

위의 코드는 sqflite 패키지를 사용하여 로컬 데이터베이스에 접근하는 방법을 보여줍니다. openDatabaseConnection 함수를 사용하여 데이터베이스 연결을 열고, insertDataToDatabase 함수를 사용하여 데이터를 저장하고, fetchDataFromDatabase 함수를 사용하여 데이터를 가져올 수 있습니다.

결론

Flutter에서는 오프라인 모드를 지원하기 위해 다양한 기능과 패키지를 제공하고 있습니다. 네트워크 연결 체크, 캐시 활용, 로컬 데이터베이스 사용 등을 통해 오프라인 환경에서도 확장성과 성능을 갖춘 앱을 개발할 수 있습니다.