개발

3weeks 개발기 8편 — UIKit에서 Flutter로, 기술 스택 전환의 현실

2026-03-22·2분 읽기
3weeks 개발기 8편 — UIKit에서 Flutter로, 기술 스택 전환의 현실

같은 기능, 다른 코드

재개발은 기존 앱을 레퍼런스 삼아 진행했습니다.

기존 3weeks를 실행해서 화면을 보면서, Flutter로 똑같이 만드는 방식이었습니다. 스마트로또 재개발 때와 같은 방법입니다.

다른 점이 있다면, 이번엔 기존 Swift 소스코드가 있었습니다. 로직을 Flutter로 옮기는 작업이었습니다.


알림 시스템이 핵심

3weeks에서 가장 중요한 기능은 알림입니다.

매일 정해진 시간에 알림이 오지 않으면 앱의 존재 이유가 없습니다. 습관 추적 앱의 핵심은 "잊지 않게 해주는 것"이니까요.

Flutter에서 로컬 알림을 구현할 때 flutter_local_notifications 패키지를 사용했습니다. iOS에서는 UNUserNotificationCenter, Android에서는 알림 채널을 각각 설정해야 합니다.

크로스플랫폼이라고 해서 모든 게 같은 코드로 처리되는 건 아닙니다. 플랫폼별로 다른 설정이 필요한 부분들이 있었고, 특히 Android의 알림 권한과 배터리 최적화 예외 설정이 까다로웠습니다.


로컬 DB: Realm에서 Hive로

기존 iOS 앱에서 Realm Swift를 쓰던 걸, Flutter에서는 Hive로 교체했습니다.

Hive는 Flutter에 최적화된 경량 로컬 데이터베이스입니다. 사용법이 단순하고, 3weeks처럼 복잡하지 않은 데이터 구조에 잘 맞았습니다.

저장해야 하는 데이터 구조는 단순합니다.

  • 습관: 이름, 설명, 시작일, 알림 시간, 보상 텍스트
  • 체크 기록: 습관 ID + 날짜 + 체크 여부

Realm에서 하던 걸 Hive로 이전하는 과정은 생각보다 빠르게 됐습니다.


UI 리디자인

기존 UI는 2019년 기준이었습니다. 지금 다시 보면 좀 오래된 느낌이 났습니다.

Flutter의 장점 중 하나가 UI 커스터마이징의 자유도입니다. 원하는 대로 만들 수 있습니다.

이번 리디자인에서 신경 쓴 부분들입니다.

홈 화면: 진행 중인 습관들의 오늘 상태를 한눈에. 체크가 됐는지 안 됐는지 바로 알 수 있도록.

습관 상세: 21일 중 몇 일이 채워졌는지 시각적으로 표시. 달력 형태로 어느 날 체크했는지 볼 수 있도록.

완성 화면: 21일을 채웠을 때의 축하 화면을 더 임팩트 있게. 애니메이션을 넣어 특별한 순간처럼 만들었습니다.


음성 메모 구현

기존 앱의 음성 녹음 기능도 Flutter로 옮겼습니다.

record 패키지로 녹음, just_audio 패키지로 재생을 처리했습니다. 녹음된 파일은 앱 내 로컬 저장소에 저장됩니다.

iOS에서는 마이크 접근 권한, Android에서는 녹음 권한을 각각 요청해야 합니다. 권한 처리를 꼼꼼히 하지 않으면 앱이 크래시 나거나 권한 없이 진행되는 경우가 생깁니다.


기존 사용자 데이터 마이그레이션

기존 iOS 앱 사용자들은 Realm에 저장된 데이터가 있습니다.

새 앱으로 업데이트되면, 기존 데이터를 이어받을 수 있어야 합니다. 습관 기록이 초기화되면 사용자 입장에서 굉장히 불쾌한 경험입니다.

Flutter 앱에서 기존 Realm 파일을 직접 읽는 건 불가능합니다. 그래서 iOS 업데이트 시점에 기존 Realm 데이터를 Hive 형식으로 변환하는 마이그레이션 로직을 추가했습니다.

단순하지 않은 작업이었지만, 기존 사용자 경험을 지키기 위해 꼭 필요한 부분이었습니다.