'로또 사고 싶은날' 개발기 9편: 내 소중한 기록을 안전하게! 백업 및 복원 시스템 구축기

2026. 4. 22. 06:33AI Product Building/Lotto App

반응형

 

앱을 열심히 개발하다 보면 기능 구현만큼이나 중요한 것이 바로 '데이터의 안전'입니다. 사용자가 수개월 동안 스캔해온 로또 당첨 내역과 통계 데이터가 휴대폰 교체 한 번에 사라진다면 그 허탈함은 이루 말할 수 없겠죠. '바이브 로또'는 별도의 회원가입 없이도 데이터를 안전하게 지킬 수 있도록 로컬 백업 및 복원 시스템을 도입했습니다. 오늘은 V3 아키텍처(ViewModel-View-Validator) 구조 내에서 어떻게 데이터를 추출하고 복구하는지 그 과정을 공유합니다.

 

1. JSON 기반의 이식성 높은 데이터 구조 설계

백업 시스템의 핵심은 어떤 환경에서도 데이터를 읽을 수 있는 '범용성'입니다. Hive DB 자체의 바이너리 파일을 복사하는 방법도 있지만, 앱 버전이 올라감에 따라 스키마가 변경될 경우 복원이 실패할 위험이 있습니다. 그래서 '바이브 로또'는 모든 데이터를 JSON 포맷으로 직렬화(Serialization)하여 내보내는 방식을 택했습니다. 이렇게 하면 나중에 iOS에서 안드로이드로 기기를 변경하더라도 텍스트 기반의 데이터라 훨씬 안정적으로 마이그레이션이 가능합니다.

2. 데이터 무결성을 위한 V3 아키텍처 적용

단순히 파일을 쓰고 읽는 것을 넘어, 복원 시 발생할 수 있는 데이터 오염을 막기 위해 V3(Validator) 단계를 추가했습니다. 복원 파일을 불러올 때 해당 데이터가 우리 앱의 규격에 맞는지, 필수 필드(회차, 번호, 날짜 등)가 유실되지는 않았는지 검증하는 과정입니다. 아래 코드는 Hive에 저장된 객체를 JSON 파일로 변환하여 외부 저장소로 내보내는 핵심 로직의 일부입니다.


// 핵심 소스 코드: 데이터 백업 서비스 (backup_service.dart)
import 'dart:convert';
import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'package:hive/hive.dart';

class BackupService {
  Future<String> createBackup() async {
    final box = Hive.box<LottoHistory>('lotto_box');
    final List<Map<String, dynamic>> jsonData = box.values
        .map((history) => history.toJson())
        .toList();

    final String encodedData = jsonEncode(jsonData);
    
    // 외장 메모리 혹은 다운로드 폴더에 저장
    final directory = await getApplicationDocumentsDirectory();
    final file = File('${directory.path}/vibe_lotto_backup.json');
    
    await file.writeAsString(encodedData);
    return file.path;
  }
  
  // 복원 시 데이터 유효성 검사 로직(Validator)
  bool validateBackupData(String content) {
    try {
      final decoded = jsonDecode(content);
      return decoded is List && decoded.isNotEmpty && decoded[0].containsKey('round');
    } catch (e) {
      return false;
    }
  }
}

3. 사용자가 체감하는 안정적인 복원 경험(UX)

복원 과정은 사용자에게 매우 예민한 작업입니다. 기존 데이터가 덮어씌워지는지, 아니면 합쳐지는지 명확하게 알려줘야 합니다. '바이브 로또'는 복원 시 "기존 내역에 추가하기""기존 내역 삭제 후 새로 가져오기"라는 두 가지 옵션을 제공합니다. 또한, 파일 선택기(File Picker)를 활용해 사용자가 클라우드(Google Drive, iCloud)나 로컬 폴더 어디에 저장했든 쉽게 파일을 찾아올 수 있도록 동선을 최적화했습니다.

 

4. 보안 및 공유 기능으로 편의성 증대

백업 파일은 사용자의 소중한 자산이기에, 생성 직후 바로 공유 시트(Share Sheet)를 띄워 이메일이나 카카오톡 나에게 보내기 등으로 전송할 수 있게 구현했습니다. 기기 내부에만 저장하면 폰을 잃어버렸을 때 대처가 불가능하기 때문입니다. 이러한 꼼꼼한 설계 덕분에 "폰 바꿨는데 데이터 어떻게 옮겨요?"라는 사용자 문의에 자신 있게 대답할 수 있는 완성도 높은 앱이 되었습니다.

데이터 걱정 없는 안전한 로또 관리, 지금 시작하세요!

👉 바이브 로또 다운로드 바로가기

데이터를 안전하게 보호하는 시스템까지 갖추니 이제 앱이 제법 든든해졌습니다. 하지만 '무료 앱'으로서 지속 가능한 운영을 위해서는 수익화 모델도 고민해야겠죠? 다음 10편에서는 앱의 퀄리티를 해치지 않으면서 수익을 창출하는 "Google AdMob(애드몹) 광고 연동 및 최적화 전략"에 대해 자세히 다뤄보겠습니다.

반응형