[flutter] 플러터에서 오프라인 데이터 복구 방법

플러터는 크로스 플랫폼 개발을 위한 강력한 프레임워크로, 오프라인 상황에서도 데이터를 복구할 수 있는 기능을 제공합니다. 이번 글에서는 플러터에서 오프라인 데이터를 복구하는 방법에 대해 알아보겠습니다.

1. 로컬 데이터베이스 사용

플러터에서는 SQFlite라는 로컬 데이터베이스 라이브러리를 제공합니다. 이를 사용하여 앱 내부에 데이터베이스를 생성하고, 오프라인 상황에서 데이터를 저장하고 복구할 수 있습니다.

먼저, sqflite 라이브러리를 pubspec.yaml 파일에 추가하세요:

dependencies:
  sqflite: ^2.0.0+3

다음으로, 데이터베이스를 생성하고 오프라인 상황에서 데이터를 저장할 테이블을 정의합니다. 예를 들어, 사용자 정보를 저장하는 User 테이블을 생성하려면 다음과 같이 코드를 작성합니다:

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

class UserDatabase {
  static final UserDatabase instance = UserDatabase._init();
  static Database? _database;

  UserDatabase._init();

  Future<Database> get database async {
    if (_database != null) {
      return _database!;
    }

    _database = await _initDB('user.db');
    return _database!;
  }

  Future<Database> _initDB(String dbName) async {
    final dbPath = await getDatabasesPath();
    final path = join(dbPath, dbName);
    return await openDatabase(path, version: 1, onCreate: _createDB);
  }

  Future<void> _createDB(Database db, int version) async {
    await db.execute('''
      CREATE TABLE users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT,
        age INTEGER
      )
    ''');
  }

  Future<List<User>> getUsers() async {
    final db = await instance.database;
    final users = await db.query('users');
    return users.map((user) => User.fromMap(user)).toList();
  }

  Future<void> addUser(User user) async {
    final db = await instance.database;
    await db.insert('users', user.toMap());
  }

  // 데이터 업데이트, 삭제 등의 메서드도 추가할 수 있습니다.
}

class User {
  final int id;
  final String name;
  final int age;

  User({required this.id, required this.name, required this.age});

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'age': age,
    };
  }

  factory User.fromMap(Map<String, dynamic> map) {
    return User(
      id: map['id'],
      name: map['name'],
      age: map['age'],
    );
  }
}

위 코드에서는 UserDatabase 클래스를 통해 데이터베이스를 생성하고, getUsers() 메서드를 통해 저장된 사용자 정보를 가져올 수 있습니다. 또한, addUser() 메서드를 사용하여 새로운 사용자를 추가할 수 있습니다.

오프라인 상황에서 사용자 정보를 저장하려면 addUser() 메서드를 사용하면 됩니다.

2. 데이터 동기화

플러터에서는 오프라인 상황에서 데이터를 복구하기 위해 데이터 동기화를 사용할 수 있습니다. 데이터 동기화는 앱이 온라인으로 전환이 되었을 때, 서버에 변경된 데이터를 동기화하는 과정을 의미합니다.

데이터 동기화는 http 라이브러리를 사용하여 서버와 통신하여 변경된 데이터를 받아오는 방식으로 구현됩니다. 예를 들어, 서버에 저장된 사용자 정보를 받아와서 로컬 데이터베이스에 저장하는 과정을 다음과 같이 코드로 작성할 수 있습니다:

import 'package:http/http.dart' as http;
import 'dart:convert';

Future<void> syncData() async {
  final url = Uri.parse('http://your-api.com/users');
  final response = await http.get(url);

  if (response.statusCode == 200) {
    final data = json.decode(response.body);
    // 받아온 데이터를 로컬 데이터베이스에 저장
    for (Map<String, dynamic> user in data) {
      final newUser = User.fromMap(user);
      await UserDatabase.instance.addUser(newUser);
    }
  } else {
    throw Exception('Failed to sync data');
  }
}

위 코드에서는 서버에서 사용자 정보를 받아와서 로컬 데이터베이스에 저장하는 syncData() 함수를 정의하였습니다. http 라이브러리를 사용하여 서버에 GET 요청을 보내고, 받아온 데이터를 로컬 데이터베이스에 저장합니다. 이 함수를 필요한 곳에서 호출하여 데이터를 동기화하면 됩니다.

마무리

이번 글에서는 플러터에서 오프라인 데이터를 복구하는 방법에 대해 알아보았습니다. 로컬 데이터베이스를 사용하여 데이터를 저장하고, 데이터 동기화를 통해 서버에서 변경된 데이터를 받아와 복구할 수 있습니다. 플러터는 오프라인 상황에서도 원활한 데이터 관리를 제공하기 때문에, 앱의 사용성과 안정성을 높일 수 있습니다.