오프라인 모드 구현 — 캐시 저장을 활용한 네트워크 없는 상황 대응

2025. 5. 27. 17:11·Flutter/Flutter 뉴스 앱 만들기
728x90
반응형

뉴스 앱은 기본적으로 온라인 기반이다.
하지만 출근길 지하철이나 해외 여행 중, 네트워크가 없는 순간에도 읽던 기사를 다시 보고 싶을 때가 있다.

이 글에서는 Flutter에서 오프라인 모드를 구현하는 방법,
즉 네트워크가 없을 때 캐시된 뉴스 데이터를 불러오는 전략을 정리해본다.


📦 기본 아이디어

핵심 흐름은 단순하다.

  1. 뉴스를 받아올 때 JSON으로 SharedPreferences에 저장
  2. 앱 시작 시 네트워크 연결 여부 확인
  3. 오프라인이면 로컬에 저장된 JSON을 불러오기

이 구조는 작지만 강력한 사용자 경험을 만든다.


📡 네트워크 상태 확인

// pubspec.yaml
dependencies:
  connectivity_plus: ^5.0.2
Future<bool> hasNetwork() async {
  final result = await Connectivity().checkConnectivity();
  return result != ConnectivityResult.none;
}

Wi-Fi, 모바일 데이터 여부까지 파악 가능하다.


💾 뉴스 캐싱 로직 구현

✅ 뉴스 저장

Future<void> saveNewsToCache(List<News> newsList) async {
  final prefs = await SharedPreferences.getInstance();
  final jsonString = jsonEncode(newsList.map((n) => n.toJson()).toList());
  await prefs.setString('cached_news', jsonString);
}

✅ 캐시 로드

Future<List<News>> loadNewsFromCache() async {
  final prefs = await SharedPreferences.getInstance();
  final jsonString = prefs.getString('cached_news');
  if (jsonString == null) return [];
  
  final List decoded = jsonDecode(jsonString);
  return decoded.map((e) => News.fromJson(e)).toList();
}

이때 News 모델에는 toJson()과 fromJson()이 구현되어 있어야 한다.


🔁 전체 흐름 연결

Future<List<News>> fetchNewsWithFallback() async {
  if (await hasNetwork()) {
    final news = await fetchNewsFromApi();
    await saveNewsToCache(news);
    return news;
  } else {
    return await loadNewsFromCache();
  }
}

단 한 줄의 조건 분기로 네트워크 상황에 따라 앱이 우아하게 대처할 수 있게 된다.


📌 UX 팁: 오프라인 알림

  • AppBar 또는 Snackbar에 “오프라인 모드” 안내
  • 최신 데이터가 아님을 표시
  • 업데이트 버튼 또는 자동 동기화 로직 추가
if (!await hasNetwork()) {
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(content: Text("현재 오프라인 상태입니다")),
  );
}

🧘 마무리하며

앱이 항상 온라인 상태일 거라는 가정은 너무 낭만적이다.
Flutter 뉴스 앱에 오프라인 대응을 추가하면, 사용자 신뢰도는 눈에 띄게 올라간다.

끊긴 인터넷보다, 연결된 경험이 중요하다.

✍️ 이 글은 터미널 밖으로 나온 개발자의 Flutter 뉴스 앱 만들기 여정입니다.

728x90
반응형

'Flutter > Flutter 뉴스 앱 만들기' 카테고리의 다른 글

Firebase로 푸시 알림 추가 — 속보 알림으로 더 빠른 뉴스 경험  (0) 2025.05.27
다크 모드 대응하기 — 눈에 편안한 뉴스 보기  (0) 2025.05.27
좋아요 및 북마크 기능 추가 — 내가 좋아한 뉴스 저장하기  (0) 2025.05.27
카테고리 탭 만들기 — 정치, 경제, 스포츠를 손쉽게 구분하기  (0) 2025.05.27
뉴스 상세 페이지 — 이미지, 본문, 공유 버튼까지 세련되게  (0) 2025.05.27
'Flutter/Flutter 뉴스 앱 만들기' 카테고리의 다른 글
  • Firebase로 푸시 알림 추가 — 속보 알림으로 더 빠른 뉴스 경험
  • 다크 모드 대응하기 — 눈에 편안한 뉴스 보기
  • 좋아요 및 북마크 기능 추가 — 내가 좋아한 뉴스 저장하기
  • 카테고리 탭 만들기 — 정치, 경제, 스포츠를 손쉽게 구분하기
코드를 걷는 사람
코드를 걷는 사람
devwanderer 님의 블로그 입니다.
  • 코드를 걷는 사람
    터미널 밖으로 나온 개발자
    코드를 걷는 사람
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Flutter
        • Flutter 게시판 앱 만들기
        • Flutter 뉴스 앱 만들기
        • Flutter 메모 앱 만들기
        • Flutter 캘린더 앱 만들기
        • Flutter 날씨 앱 만들기
      • Next.js
      • Ruby On Rails
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    북마크기능
    정적사이트
    RubyOnRails
    Firebase
    메모앱
    fluttertips
    UI디자인
    모바일앱개발
    rails보안
    table_calendar
    백엔드개발
    Nextjs
    openweather
    flutter디자인
    캘린더앱
    UIUX
    감성앱
    ActiveRecord
    flutter게시판
    flutterui
    뉴스앱
    개발블로그
    날씨앱
    Flutter
    flutter상태관리
    코드를걷는사람
    flutter기초
    다크모드
    flutter앱개발
    flutter개발
  • 최근 댓글

  • 최근 글

  • 반응형
    250x250
  • hELLO· Designed By정상우.v4.10.3
코드를 걷는 사람
오프라인 모드 구현 — 캐시 저장을 활용한 네트워크 없는 상황 대응
상단으로

티스토리툴바