반응형
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 설정
- Google Cloud Console에서 프로젝트를 생성합니다.
- OAuth 2.0 클라이언트 ID를 설정하고 JSON 파일을 다운로드하세요.
- 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
반응형
'Flutter > Package' 카테고리의 다른 글
Flutter WorkManager 패키지 사용법: 백그라운드 작업을 간편하게 처리하는 방법 (0) | 2025.01.27 |
---|---|
플러터에서 flutter_screenutil 패키지 린트 추가하기 (2) | 2024.12.23 |
플러터 패키지 adaptive_dialog 2.3.0 사용법: 다양한 다이얼로그 쉽게 구현하기 (1) | 2024.12.03 |
플러터에서 http 패키지를 사용한 The Movie Database API사용 방법 (2) | 2024.11.12 |
플러터에서 Moor 패키지 사용 방법(sql 쿼리) (3) | 2024.11.09 |