← Back to Devlog
😊2026년 02월 22일 (Sunday)

산책도감 NatureSnap: AI 듀얼 엔진으로 동식물을 식별하다

GPT-4o + Claude 듀얼 AI, 5가지 아트 스타일 일러스트, TTS 음성 가이드까지. Flutter 크로스플랫폼 필드가이드 앱 개발기.

#Flutter#AI#GPT-4o#Claude#NatureSnap#DevLog

🌿 산책을 기록으로 바꾸는 앱

산책하다 길가에 핀 꽃이 뭔지, 나무 위에 앉은 새가 뭔지 궁금했던 적이 있다. 사진을 찍고 검색하면 되긴 하는데, 매번 그러기엔 번거롭다.

사진 한 장이면 종 이름부터 생태 이야기, 일러스트, 음성 해설까지 자동으로 만들어주는 앱을 만들기로 했다.

🤖 듀얼 AI 엔진: GPT-4o + Claude

단일 AI만 쓰면 간헐적으로 식별이 실패할 때가 있다. 그래서 OpenAI GPT-4o를 메인 엔진, Claude Sonnet을 폴백 엔진으로 설계했다.

하나의 사진에 대해 3개 후보 종을 신뢰도(Confidence)와 함께 제시한다. AI가 100% 정확할 수 없다는 걸 솔직하게 보여주는 게 오히려 신뢰감을 준다고 판단했다.

// 듀얼 엔진 폴백 로직
try {
  result = await openAIService.identify(image);
} catch (e) {
  result = await claudeService.identify(image);
}

Rate Limit(429)이 걸릴 때는 지수 백오프(3초→6초→12초, 최대 3회)로 자동 재시도한다.

🎨 5가지 아트 스타일 일러스트

종이 식별되면 AI가 해당 종의 일러스트를 자동 생성한다. 사용자가 5가지 스타일 중 원하는 것을 고를 수 있다.

스타일느낌
수채화식물도감 풍 보태니컬 아트
수묵화동양적 미니멀
동화풍아이들도 좋아하는 따뜻한 느낌
사실적하이퍼리얼리스틱 디지털 페인팅
픽셀아트16비트 레트로 게임 스타일

마지막으로 선택한 스타일을 기억해서 다음 식별 때 기본값으로 설정해준다.

🔊 TTS 음성 가이드

OpenAI TTS(음성: nova, 속도: 0.95x)로 생태 이야기를 읽어준다. 산책하면서 이어폰으로 들을 수 있게 만들었다.

캐시 전략이 중요했다. 같은 종에 대해 매번 TTS를 생성하면 비용이 크기 때문에 종 ID 기반 파일명으로 캐싱하고, 200MB 한도를 넘으면 오래된 파일부터 자동 정리한다.

🏆 게이미피케이션: 스트릭 & 일일미션

단순히 도감만 채우면 질릴 수 있다. 그래서 두 가지 동기부여 시스템을 넣었다.

연속 발견 스트릭: 매일 하나 이상 발견하면 스트릭이 쌓인다. 7일, 14일, 30일, 100일 마일스톤에 알림을 준다.

일일미션: "오늘은 식물 1종을 발견하세요" 같은 카테고리별 미션. 식물·조류·곤충·포유류 5개 카테고리, 각 50종 목표로 진행도를 보여준다.

📱 기술 스택

  • Framework: Flutter (Dart) — Android + iOS 크로스플랫폼
  • 상태관리: Riverpod (불변 상태 패턴)
  • 로컬 DB: Hive (NoSQL, TypeAdapter 코드 생성)
  • 네트워크: Dio (HTTP 클라이언트 + 재시도 로직)
  • 카메라: image_picker + flutter_image_compress
  • 다국어: 한국어·영어·일본어 (시스템 로케일 자동 감지)

📋 현재 상태 (v2.0)

  • AI 식별 + 3후보 제시 ✅
  • 5종 아트 스타일 일러스트 ✅
  • TTS 음성 가이드 ✅
  • 스트릭 + 일일미션 ✅
  • 컬렉션 검색·정렬·필터 ✅
  • 삭제 실행 취소 (5초 복구) ✅
  • Hive DB 백업 보호 ✅

🔜 다음 단계

  • v2.1: iCloud/Google Drive 동기화, 컬렉션 페이지네이션, 오프라인 모드
  • App Store + Google Play 동시 출시 목표
  • 한국 도심 주변 종에 특화된 데이터 튜닝

바로맵이 "급할 때 1초" 앱이라면, 산책도감은 "여유로운 산책을 풍요롭게" 만드는 앱이다. 두 앱이 정반대의 템포를 가지고 있어서 만드는 재미가 있다.