참참참

참참참

말 한마디를 구조화된 영농일지로 바꾸고, 쌓인 기록을 AI 리포트와 코칭으로 되돌려주는 농업인용 iOS 앱입니다.

개요

신한 스퀘어브릿지 청년 해커톤 3기 출품작입니다. 스타트업 바이루트를 기업 파트너로 진행했고, 2026년 6월 10일 시작해 7월 21일 App Store 심사를 통과했습니다. 팀은 PD 2명 · BE 2명 · FE 1명이었고, iOS 앱 전체(아키텍처, 전 화면 구현, 백엔드 연동, 배포·운영)를 혼자 담당했습니다.

농업인 9명을 직접 농가 방문 인터뷰한 결과, 문제를 “농업인이 기록을 안 한다”가 아니라 **“기록 방식이 불편하다”**로 재정의했습니다. 그래서 기록을 의무가 아니라 되돌려받는 것이 있는 행위로 바꿨습니다 — 음성으로 말하면 기록이 되고(입력 비용 제거), 기록은 리포트와 AI 코칭으로 돌아옵니다(효용 제공).

주요 기능

  • 온보딩 — Apple/카카오 로그인, 지도에서 농장 폴리곤 직접 그리기 (JUSO 주소검색 + V-World 연속지적도)
  • 영농기록 — 음성으로 말하면 자동 분류·저장, 작업 유형 8종별 텍스트 작성, 기록별 AI 코칭
  • 리포트 — 작업 유형별 누적 통계, 도넛/막대 차트, 오프라인 캐시
  • 커뮤니티 / 통합검색 / 마이페이지 — 작물별 게시판, 영농기록·커뮤니티·정책 통합 검색

기술 스택

SwiftUI (iOS 17+) · Swift 6 strict concurrency · Observation (@Observable) · SwiftData (스키마 V1→V3 마이그레이션) · URLSession + async/await · Swift Testing · WebRTC · OpenAI Realtime API

서드파티 의존성을 최소로 유지하는 것이 원칙이었습니다. 네트워킹·상태관리·영속성 모두 애플 1st-party만 사용했고, 외부 SDK는 SPM으로 3개(kakao, naver, WebRTC)가 전부입니다.

규모 — Swift 257개 파일 / 약 30,000 LOC(앱) + 61개 테스트 파일 / 약 9,000 LOC

기술적으로 어려웠던 것

  1. 오프라인 우선 설계 — 타깃 사용자는 밭 한가운데에서 앱을 씁니다. LTE가 끊기는 건 예외가 아니라 기본값이라, 쓰기는 로컬 큐(PendingFarmStore)에 먼저 남기고 읽기는 SwiftData 캐시로 버티는 구조를 기본값으로 잡았습니다. 캐시 폴백 시 enum Source { case remote, cache(updatedAt: Date) }데이터 기준 시점까지 UI에 전달해, 사용자가 “지금 보는 게 언제 기준인지” 알 수 있게 했습니다.

  2. Swift 6 strict concurrency에서 WebRTC 다루기 — WebRTC 객체는 non-Sendable이고 델리게이트는 라이브러리 자체 스레드에서 호출됩니다. @unchecked Sendable로 덮는 대신, 모든 RTC 객체를 actor WebRTCVoiceTransport 내부에서만 조작하고 외부 콜백은 Sendable 프로퍼티만 가진 순수 전달자로 분리해, 데이터 경합을 런타임 규율이 아니라 구조적으로 제거했습니다.

  3. AI 에이전트 워크플로우 설계frontend/ 커밋 269개 중 143개가 AI 에이전트와의 페어 작업입니다. AGENTS.md 규칙 계층을 저장소에 커밋하고, 스펙(50건) → 계획(52건) → 코드 순서를 강제하고, TalkToFigma MCP로 Figma 노드 속성을 문서로 먼저 고정한 뒤 구현하는 파이프라인을 만들었습니다.

배포

dev 브랜치 push → GitHub Actions → fastlane match → TestFlight → Beta Review 자동 제출까지 전 과정 자동화.

링크

기간: 2026.06.10 ~ 2026.07.22