
개인 개발한 일기 앱 「Daily Diary」를 Claude Fable 5로 리뷰해 본 기록 — 발견된 버그와 소감
요약
개인 개발 중인 Flutter 기반 일기 앱 'Daily Diary'를 Claude Fable 5를 활용해 코드 리뷰하고 버그를 수정한 기록입니다. 비동기 처리 시 발생할 수 있는 잠재적 크래시와 테스트 코드 부재, Deprecated API 문제를 해결한 과정을 담고 있습니다.
핵심 포인트
- Claude Fable 5를 활용한 Flutter 앱의 잠재적 버그(비동기 후 setState 호출) 탐지
- 실질적인 테스트 코드(12개) 작성 및 CI 환경 구축
- Deprecated API(withOpacity 등) 및 Lint 경고 일괄 수정
- Anthropic의 수출 관리 명령으로 인한 Fable 5 서비스 중단 상황 언급
개인 개발로 만들고 있는 일기 앱 「Daily Diary」(Flutter 제작, Google Play 공개 중)를, 출시 전에 한 차례 품질 체크를 하고 싶어져서, Claude Fable 5에게 코드 리뷰와 수정을 맡겨 보았습니다. 그 기록입니다.
Fable 5가 공개된 것은 2026년 6월 9일. 그 3일 후인 6월 12일(미국 동부 시간 밤), 미국 상무부의 수출 관리 명령에 의해 전 세계에서 이용이 중지되었습니다. 명령은 「Fable 5와 Mythos 5에 대해, 미국 국내외를 불문하고 모든 외국 국적 사용자(외국 국적의 자사 직원 포함)의 액세스를 금지한다」는 내용으로, Anthropic은 미국 사용자와 외국 국적 사용자를 즉시 구분할 수 없기 때문에 결과적으로 모든 사용자 대상으로 중지되었습니다. 이유는 국가 안보(서신에 구체적인 내용 명시는 없음)로 알려졌으며, 보도에서는 「Fable 5의 안전 기구(Safety Mechanism)를 회피하는 수법이 발견된 것」이 배경이라고 전해지고 있습니다. 집필 시점(6월 15일)에도 복구되지 않았으며, Anthropic은 「오해다」라며 조기 복구를 목표로 하고 있고, 당분간은 Opus 4.8로 안내하고 있습니다. 짧은 기간이었지만, 중지되기 전에 자신의 앱으로 실제로 수행하게 한 내용과 함께 개인 개발자로서의 소감을 남겨둡니다.
「다른 모델이 놓친 버그를 찾았다」와 같은 일반론이 아니라, 자신의 리포지토리 커밋에 남아 있는 실제 수정 사항만을 작성합니다.
심플한 오프라인 일기 앱입니다.
📱
오프라인 퍼스트 (Offline-first): 데이터는 단말기 내에만 저장, 클라우드 불필요 -
🌐
5개 언어 대응: 일본어 / 영어 / 중국어 / 한국어 / 스페인어 -
🌙
다크 모드 (Dark Mode) (시스템 설정 추종) -
📅 캘린더 표시 (기분 인디케이터 포함) / 📊 통계 (연속 기록·기분 트렌드)
🔍 전체 검색 / 🎲 과거 엔트리 랜덤 표시 / 💾 JSON으로 내보내기·가져오기
Google Play: https://play.google.com/store/apps/details?id=com.diary.daily
기술 스택은 Flutter 3.x / Dart, 상태 관리 Provider, 로컬 저장 Hive (NoSQL), 로컬라이즈(Localization)는 Flutter intl입니다.
「전부 고쳐줘」가 아니라, 「품질 면에서 신경 쓰이는 부분을 찾아내서 고쳐줘」 정도의 입도로 요청했습니다. 구체적으로는 flutter analyze 경고 해소, 테스트 정비, CI 추가입니다.
await를 사이에 두고 setState나 BuildContext (로컬라이즈 참조나 Navigator)를 건드리는 곳이 여러 군데 있었는데, 화면이 파괴된 후에 호출되면 크래시가 발생하는 잠재적 버그였습니다. 내보내기/가져오기 처리 등에서 현상화될 수 있는 것입니다.
// 수정 전 (개념): await 이후, 위젯이 파괴되었음에도 건드림
await databaseService.importData(file);
setState(() { /* ... */ }); // 파괴 후라면 예외 발생
...
통상적인 조작으로는 좀처럼 겪을 일이 없어서, 스스로 테스트를 하더라도 알아차리기 어려운 타입이었습니다.
템플릿 그대로 남아 있던 widget_test.dart가 존재하지 않는 MyApp을 참조하고 있어 컴파일조차 되지 않는 상태였습니다 (= 실질적으로 테스트 제로). 이를 모델과 Hive 영속화(Persistence)에 대한 실제 테스트 12개로 교체해 주었습니다. 아울러 push/PR 시 analyze와 테스트를 돌리는 CI도 추가했습니다.
withOpacity 권장되지 않음(Deprecated) → withValues로의 치환 27곳, 권장되지 않는 ColorScheme API, RadioListTile에서 RadioGroup으로의 이행 등, 방치해 두었던 경고 47건을 0으로 만들었습니다. 덤으로 주요 의존성도 최신 메이저 버전으로 업데이트했습니다.
솔직히 말하자면, Fable이 찾아낸 것은 「화려한 신기능」이 아니라, 나 혼자였다면 체계적으로 체크하지 않았을 종류의 버그였습니다.
- async gap의 mounted → 타이밍에 따라서만 발생하는 크래시
- 망가진 테스트 → 「테스트가 있다」고 생각했지만 실제로는 없음
- 권장되지 않는(Deprecated) API의 산 → 동작은 하지만 언젠가 깨질 것
기능을 작성하는 것까지는 저 스스로도 할 수 있지만, 이러한 "특정 조건이 갖춰졌을 때만 발생하는 현상", "테스트의 실효성", "비권장(Deprecated) API의 정리"와 같은 부분은 리뷰 전담 인력이 없으면 놓치기 쉽습니다. 그 부분을 한 번 제대로 짚어주었다는 의미에서, 개인 개발의 품질 체크(Quality Check)에는 충분히 유용했습니다.
반면 한계도 있었습니다. 광고 표시나 내보내기/가져오기 공유와 같은 실기기 UI 의존적 동작은 CI(지속적 통합) 환경에서 확인할 수 없으므로, 마지막에는 직접 실기기로 체크해야 합니다. 앱의 기획·설계·실기기 테스트·스토어 신청·최종 코드 리뷰는 계속해서 저의 몫이라는 역할 분담이 느껴집니다.
공개 3일 만에 멈춰버린 것은 아쉽지만, 멈추기 전에 이 과정을 한 번 거칠 수 있었던 것은 기록으로서 남겨둘 가치가 있다고 생각합니다.
일기 앱 「Daily Diary」는 Google Play에서 공개 중입니다. 괜찮으시다면 한 번 사용해 보세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기