본문 바로가기
Flutter/Package

플러터 앱에 Hive 데이터 구글 드라이브 백업 및 복원 기능 구현하기

by Maccrey Coding 2025. 1. 27.
반응형

Flutter 앱에 데이터를 안전하게 저장하고 복원할 수 있는 Google Drive 연동 기능을 추가하는 방법을 소개합니다.

이 글에서는 초보자도 따라 할 수 있도록 모든 과정을 자세히 설명하겠습니다.

📦 사전 준비

다음 패키지를 pubspec.yaml에 추가하고 설치하세요.

dependencies:
  google_sign_in: ^5.4.0
  googleapis: ^11.0.0
  googleapis_auth: ^2.0.0
  http: ^0.15.0
  path: ^1.8.0

설치 명령어

flutter pub get

🔑 Google API 설정

  1. Google Cloud Console에서 프로젝트를 생성합니다.
  2. OAuth 2.0 클라이언트 ID를 설정하고 JSON 파일을 다운로드하세요.
  3. android/app/src/main/res/values/strings.xml에 google_app_id와 google_api_key를 추가하세요.
<string name="default_web_client_id">YOUR_CLIENT_ID</string>

🚀 Google 인증을 위한 클래스 만들기

구글 인증 헤더를 처리하는 GoogleAuthClient를 작성합니다.

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

class GoogleAuthClient extends http.BaseClient {
  final Map<String, String> _headers;
  final _client = http.Client();

  GoogleAuthClient(this._headers);

  @override
  Future<http.StreamedResponse> send(http.BaseRequest request) {
    request.headers.addAll(_headers);
    return _client.send(request);
  }
}

🌐 Google Drive API 클래스

구글 드라이브 작업을 처리하는 클래스입니다.

import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:google_sign_in/google_sign_in.dart';
import 'package:googleapis/drive/v3.dart' as drive;
import 'google_drive_auth_client.dart';

class GoogleDriveService {
  final GoogleSignIn _googleSignIn = GoogleSignIn(
    scopes: [drive.DriveApi.driveAppdataScope],
  );

  GoogleSignInAccount? _currentUser;
  drive.DriveApi? _driveApi;

  Future<GoogleSignInAccount?> signInGoogle() async {
    try {
      _currentUser = await _googleSignIn.signInSilently() ?? await _googleSignIn.signIn();
      if (_currentUser != null) {
        final headers = await _currentUser!.authHeaders;
        final client = GoogleAuthClient(headers);
        _driveApi = drive.DriveApi(client);
      }
    } catch (e) {
      print('Google Sign-In Error: $e');
    }
    return _currentUser;
  }

  Future<drive.File?> uploadFile(File file) async {
    if (_driveApi == null) return null;

    final driveFile = drive.File()
      ..name = path.basename(file.path)
      ..parents = ["appDataFolder"];

    final response = await _driveApi!.files.create(
      driveFile,
      uploadMedia: drive.Media(file.openRead(), file.lengthSync()),
    );
    return response;
  }

  Future<File?> downloadFile(String fileId, String localPath) async {
    if (_driveApi == null) return null;

    final media = await _driveApi!.files.get(fileId, downloadOptions: drive.DownloadOptions.fullMedia) as drive.Media;
    final data = await media.stream.toList();
    final file = File(localPath)..writeAsBytesSync(data.expand((element) => element).toList());
    return file;
  }
}

🐝 Hive 데이터베이스 백업 및 복원

Hive 데이터를 Google Drive에 저장하고 복원하는 기능을 추가합니다.

import 'dart:io';
import 'package:hive/hive.dart';
import 'google_drive_service.dart';

class HiveBackupRestore {
  final GoogleDriveService _driveService = GoogleDriveService();

  Future<void> backupHiveBox(String boxName) async {
    final box = Hive.isBoxOpen(boxName) ? Hive.box(boxName) : await Hive.openBox(boxName);
    final file = File(box.path!);

    await _driveService.signInGoogle();
    final uploadedFile = await _driveService.uploadFile(file);
    print('Backup completed: ${uploadedFile?.name}');
  }

  Future<void> restoreHiveBox(String boxName) async {
    await _driveService.signInGoogle();
    final box = Hive.isBoxOpen(boxName) ? Hive.box(boxName) : await Hive.openBox(boxName);

    final driveFileId = 'your-drive-file-id'; // 업로드된 파일 ID
    final file = await _driveService.downloadFile(driveFileId, box.path!);
    print('Restore completed: ${file?.path}');
  }
}

🌟 UI 구현

앱의 UI에 "백업"과 "복원" 버튼을 추가합니다.

import 'package:flutter/material.dart';
import 'hive_backup_restore.dart';

class BackupRestorePage extends StatelessWidget {
  final HiveBackupRestore backupRestore = HiveBackupRestore();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('백업 & 복원')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () async => await backupRestore.backupHiveBox('boxName'),
              child: Text('백업하기'),
            ),
            ElevatedButton(
              onPressed: () async => await backupRestore.restoreHiveBox('boxName'),
              child: Text('복원하기'),
            ),
          ],
        ),
      ),
    );
  }
}

🎉 결론

이제 앱에서 Google Drive를 이용해 데이터를 안전하게 백업하고 복원할 수 있습니다. Flutter 앱에 데이터 보호 기능을 추가하고 싶다면 이 가이드를 따라 해보세요! 😊

추가적으로 궁금한 점이 있으면 댓글로 알려주세요! 🚀

 

 

구독!! 공감과 댓글,

광고 클릭은 저에게 큰 힘이 됩니다.

 

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

 

 

반응형