Skip to main content

Flutter 앱 성능을 한 단계 끌어올리는 방법 – Hive 캐시, 재생성 흐름, 에러 카드, GitHub Actions 적용 가이드

Published 4 min readMarkdown

# 서론: “앱이 느려서 사용자가 떠난다?”

Flutter로 만든 Daily‑Recap 같은 일일 요약 앱은 사용자에게 매일 새로운 정보를 제공해야 하기에 빠른 로딩과 안정적인 동작이 필수입니다. 하지만 네트워크 호출이 빈번하거나 오류 처리 로직이 부족하면 사용자는 금방 이탈하게 됩니다. 이번 포스팅에서는 Hive 캐시, 재생성 흐름(regenerate flow), 에러 카드, 그리고 GitHub Actions를 활용해 Flutter 앱을 성능·안정성·자동화 측면에서 개선하는 실전 방법을 초보자도 이해하기 쉽게 정리합니다.

핵심 키워드: Flutter, Hive 캐시, GitHub Actions


# 1️⃣ Hive 캐시로 데이터 로딩 속도 2배 올리기

# 1-1. Hive란?

Hive는 경량 NoSQL 로컬 데이터베이스로, 파일 기반 저장소이며 플러터에서 가장 빠른 키‑값 저장소 중 하나입니다. SharedPreferences보다 큰 데이터를 다루기에 적합하고, 비동기 API를 제공해 UI 스레드 차단을 방지합니다.

# 1-2. 프로젝트에 Hive 도입하기

yaml

# pubspec.yaml

dependencies:

  hive: ^2.2.3

  hive_flutter: ^1.1.0

  path_provider: ^2.0.15
dart

// main.dart

await Hive.initFlutter();               // 초기화

await Hive.openBox('dailyRecapBox');    // 박스 열기

# 1-3. API 응답을 캐시하는 흐름

  1. 앱 시작 → 로컬 dailyRecapBox에서 최신 요약 조회

  2. 캐시 존재 → UI에 바로 표시 (네트워크 대기 없음)

  3. 동시 백그라운드 → 최신 데이터 fetch → 성공 시 캐시 업데이트

  4. 오류 발생 → 기존 캐시 유지 + 에러 카드 표시

이렇게 하면 첫 화면 로딩이 0.5초 이하로 단축되고, 네트워크가 불안정해도 사용자에게 빈 화면을 보여주지 않게 됩니다.


# 2️⃣ 재생성 흐름(regenerate flow)으로 최신 데이터 보장

# 2-1. 왜 재생성 흐름이 필요한가?

일일 요약은 매일 새롭게 생성돼야 합니다. 사용자가 앱을 오래 열어두면 오래된 데이터가 표시될 위험이 있습니다. 따라서 일정 주기(예: 24 시간)마다 데이터를 자동 재생성하고 캐시를 갱신해야 합니다.

# 2-2. 구현 방법

# (1) 타이머 기반 자동 재생성

dart

Timer.periodic(Duration(hours: 24), (_) async {

  await _fetchAndCacheDailyRecap();

});

# (2) 사용자가 직접 강제 재생성

dart

ElevatedButton(

  onPressed: () => _fetchAndCacheDailyRecap(),

  child: Text('오늘 요약 새로고침')

);

# (3) 재생성 로직

dart

Future<void> _fetchAndCacheDailyRecap() async {

  try {

    final response = await http.get(Uri.parse('https://api.example.com/recap'));

    if (response.statusCode == 200) {

      final box = Hive.box('dailyRecapBox');

      await box.put('latest', response.body);

    } else {

      throw Exception('API 오류');

    }

  } catch (e) {

    // 에러는 에러 카드에 위임

    _showErrorCard(e.toString());

  }

}

이 흐름을 적용하면 데이터 최신성을 보장하면서도 네트워크 비용을 최소화할 수 있습니다.


# 3️⃣ 에러 카드로 사용자 경험(UX) 향상

# 3-1. 에러를 숨기지 말고 시각화하라

네트워크 오류, 파싱 실패 등은 빈 화면 대신 에러 카드를 띄워 사용자에게 상황을 명확히 알려야 합니다.

# 3-2. 에러 카드 UI 예시

dart

class ErrorCard extends StatelessWidget {

  final String message;

  const ErrorCard({required this.message});

  @override

  Widget build(BuildContext context) {

    return Card(

      color: Colors.red.shade50,

      margin: EdgeInsets.all(16),

      child: ListTile(

        leading: Icon(Icons.error, color: Colors.red),

        title: Text('데이터를 불러오는 데 실패했어요.'),

        subtitle: Text(message),

        trailing: TextButton(

          child: Text('다시 시도'),

          onPressed: () => _fetchAndCacheDailyRecap(),

        ),

      ),

    );

  }

}

# 3-3. 에러 카드 표시 로직

dart

if (snapshot.hasError) {

  return ErrorCard(message: snapshot.error.toString());

}

에러 카드는 문제 원인과 재시도 버튼을 제공해 사용자가 스스로 해결할 수 있게 돕습니다.


# 4️⃣ GitHub Actions로 CI/CD 자동화

# 4-1. 왜 GitHub Actions인가?

앱을 빌드·테스트·배포하는 과정을 자동화하면 인간 실수를 줄이고, 배포 속도를 크게 향상시킬 수 있습니다. Flutter 프로젝트에 최적화된 워크플로우를 만들면 PR마다 자동 테스트와 린트 검사를 수행하고, 태그(tag) 기반 배포까지 자동화됩니다.

# 4-2. 기본 워크플로우 파일 (.github/workflows/flutter.yml)

yaml

name: Flutter CI

on:

  push:

    branches: [ main ]

  pull_request:

    branches: [ main ]

jobs:

  build:

    runs-on: ubuntu-latest

    steps:

      - uses: actions/checkout@v3

      - name: Flutter 설치

        uses: subosito/flutter-action@v2

        with:

          flutter-version: '3.19.0'

      - name: 의존성 캐시

        uses: actions/cache@v3

        with:

          path: |

            ~/.pub-cache

            .dart_tool

          key: ${{ runner.os }}-pub-${{ hashFiles('pubspec.yaml') }}

      - name: 의존성 설치

        run: flutter pub get

      - name: 코드 분석

        run: flutter analyze

      - name: 테스트 실행

        run: flutter test --no-pub

      - name: APK 빌드 (Release)

        if: github.ref == 'refs/heads/main'

        run: flutter build apk --release

# 4-3. 배포 자동화 (GitHub Pages 혹은 Firebase App Distribution)

  • Firebase App Distribution: firebase-action을 추가해 PR마다 테스트용 앱을 자동 전송.

  • GitHub Pages: 웹 버전(flutter build web)을 빌드해 gh-pages 브랜치에 푸시.

CI/CD가 적용되면 코드 푸시 → 자동 테스트 → 자동 빌드 → 자동 배포가 한 번에 이루어져 개발 효율이 크게 상승합니다.


# 결론: 지금 바로 적용하고 차이를 체감하세요!

Flutter 앱의 성능과 안정성을 높이는 핵심은 로컬 캐시(Hive), 데이터 재생성 흐름, 명확한 에러 처리, 그리고 자동화된 CI/CD(GitHub Actions)에 있습니다.

1️⃣ 프로젝트에 Hive를 도입해 첫 화면 로딩을 2배 빠르게 만들고,

2️⃣ 24시간 주기의 재생성 흐름으로 최신 데이터를 보장하고,

3️⃣ 에러 카드를 통해 사용자가 문제를 바로 인식·해결하게 하며,

4️⃣ GitHub Actions로 빌드·테스트·배포를 자동화하면 개발 속도가 눈에 띄게 빨라집니다.

지금 바로 위 네 가지 항목을 하나씩 적용해 보세요. 작은 변화가 모여 Daily‑Recap 같은 앱이 사용자에게 사랑받는 서비스로 거듭날 수 있습니다.

행동 유도: 이 포스팅이 도움이 되었다면, 댓글로 여러분의 적용 경험을 공유하거나, GitHub 레포에 ⭐️를 눌러 주세요! 그리고 최신 Flutter 개발 팁을 놓치지 않으려면 구독 버튼도 잊지 마세요. 🚀

No comments yet. Be the first to comment.

More from this blog