축산고객사 비공개앱·웹 플랫폼 개발AI 업무자동화

한우 IoT 모니터링 앱과 통합 API 구축

한우 체온·활동량을 농장주가 현장에서 보고 발정·질병 이상을 푸시로 받는 앱과 기존 운영 시스템 연동 API

  • ~ 2026.07

    진행 기간

농가 대시보드, 이상 알림 목록, AI 리포트 세 화면을 나란히 보여주는 한우 모니터링 앱 구성

배경과 목표

어떤 문제에서 시작했나요?

고객사는 LoRa 캡슐 센서로 소의 체온·활동량·반추·급수 데이터를 모으고 AI로 발정·분만·질병·체온이상을 분석하는 축산 관리 서비스를 이미 운영하고 있었습니다. 다만 운영 시스템이 웹(PHP) 기반이고 REST API가 없어서, 농장주가 축사에서 바로 개체 상태를 확인하거나 이상 징후 알림을 즉시 받을 방법이 없었습니다. 운영 DB는 실제 축산 데이터가 쌓이는 곳이라 구조 변경 없이 그대로 두어야 한다는 제약도 있었습니다.

목표: 농장주가 모바일 앱에서 농장 현황과 개체별 AI 분석 결과를 확인하고, 이상 징후가 생기면 SMS와 푸시로 즉시 통지받게 하는 것. 이를 운영 DB의 스키마를 바꾸지 않고 달성하는 것. 이후 앱을 App Store와 Play Store에 제출할 수 있는 상태로 만드는 것.

네오렉트의 역할

어디까지 수행했나요?

네오렉트가 모바일 앱(Flutter, Android·iOS)과 통합 API 게이트웨이 서버를 설계·구현했고, 운영 서버 배포와 스토어 제출용 빌드·심사 대응 구성까지 수행했습니다. LoRa 캡슐 센서와 기존 웹(PHP) 운영 시스템, AI 통합분석 로직은 고객사가 보유한 자산으로, 네오렉트는 이를 읽어 모바일에서 쓸 수 있게 연동하는 범위를 맡았습니다. 화면은 고객 측 Figma(MVP v0.5) 디자인을 기준으로 구현했습니다.

주요 기능

무엇을 만들었나요?

  • SMS 인증번호(OTP) + JWT 로그인 — 인증번호 자동입력, 약관 동의, 자동 토큰 갱신
  • 농장 홈 — 전체·발정·임신·분만예정 요약과 경고·주의·정상 개체 카드, 목장 현황 통계 차트
  • 개체 목록 — 상태 아이콘·정렬·고급 필터(임신·경산·체온·활동)·검색
  • 개체 등록·수정·삭제와 프로필 이미지 업로드, 임신·산차·우사 위치·품종 입력
  • 개체 상세 AI 리포트 — 분석 요약·근거·권장 조치와 음성 안내
  • 데이터 차트 — 체온 분포 히트맵, 24시간 활동량·반추량 차트
  • 시세정보 — 등급별 경락가 조회 후 도체중·비용을 반영한 예상 매출 계산
  • 알림 큐 워커 기반 FCM 푸시·SMS 동시 통지와 개체 상세 딥링크 이동

해결 과정

제약을 어떻게 풀었나요?

  1. 제약 1

    기존 웹(PHP) 운영 시스템에 REST API가 없고, 운영 DB(MSSQL)는 실데이터가 쌓이는 곳이라 구조를 바꿀 수 없었습니다.

    의사결정: 운영 DB를 원칙적으로 읽기 전용으로 연동하고 DDL은 건드리지 않기로 정했습니다. 앱 전용 데이터는 서버가 소유한 별도 보조 테이블에만 저장하기로 했습니다.

    구현: Controller→Service→Model 계층의 통합 API 게이트웨이를 신규 구축해 운영 DB를 모바일용 /api/mobile/* 네임스페이스로 중계했습니다. 운영 DB 쓰기는 최종 로그인 시각과 알림 확인 정보 3개 컬럼으로만 제한했고, 인증번호·리프레시 토큰·푸시 토큰은 보조 테이블에 두었습니다.

  2. 제약 2

    운영 DB는 한글 enum 값을 쓰고 농장별 데이터가 한 테이블에 섞여 있어, 그대로 앱에 내보내면 상태 표기가 흔들리고 다른 농장 데이터가 보일 위험이 있었습니다.

    의사결정: 게이트웨이에서 값과 권한을 정규화한 뒤 앱에 넘기기로 했습니다.

    구현: 한글 enum을 앱용 영문 enum으로 정규화하고, 농장 권한(adminid) 기준으로 데이터를 격리했습니다. AI 통합분석 결과도 게이트웨이에서 단일 소스로 가공해 상태 우선순위에 따라 대표 상태 하나를 고르도록 했습니다.

  3. 제약 3

    이상 징후는 알림이 늦으면 의미가 없는데, 알림은 운영 시스템의 알림 큐에만 쌓이고 있었습니다.

    의사결정: 큐를 주기적으로 소비하는 워커를 게이트웨이에 두고, SMS와 푸시를 함께 보내기로 했습니다.

    구현: AlarmQueue의 PENDING 알림을 수집해 FCM으로 발송하고 이력을 기록하는 워커를 구현했습니다. 앱에서는 알림을 누르면 딥링크(livecare:// · App/Universal Links)로 해당 개체 상세 화면으로 이동합니다.

  4. 제약 4

    스토어 심사자는 실제 휴대전화 SMS 인증과 실 농장 데이터가 없어 앱 전 기능을 확인할 수 없었고, 실데이터를 열어주면 개인정보가 노출됩니다.

    의사결정: 실 운영 데이터와 완전히 분리된 심사 전용 경로를 따로 만들기로 했습니다.

    구현: 지정된 심사용 번호로 로그인하면 SMS 발송 없이 심사 전용 데모 농장으로 들어가도록 서버에 분기를 넣었습니다. 데모 농장은 실 농장 한 곳의 구조를 복제하되 농장명·소유주·연락처·주소·개체식별번호를 모두 더미 값으로 치환했고, 전체 데모 데이터는 스크립트로 원복할 수 있게 구성했습니다.

화면

실제 화면과 구조

체온 39.5도 이상 고온 지속과 활동량 급증을 근거로 강한 발정 징후를 판정하고 권장 조치를 제시하는 AI 리포트 화면, 아래에 주간 시간대별 체온 분포 히트맵
AI 리포트 — 체온·활동량 이상을 근거와 함께 판정하고 조치를 권고합니다
발정확인, 건강위급, 분만징후, 음수없음으로 구분된 알림 목록과 각 알림의 발생 시각 및 확인 버튼, 아래에 반추량과 벡터활동량 그래프
알림 목록 — 발정·건강·분만·음수 이상을 구분해 즉시 통지합니다
1++부터 2등급까지 등급별 예상 매출과 경락가 기준 매출 내역, 도매시장 수수료와 도축비 등 공제 항목을 보여주는 시세정보 화면
시세정보 — 축산물품질평가원 공개 경매 자료로 등급별 예상 매출을 계산합니다
품종, 성별, 개체 분류, 월령, 산차, 출생일을 정리한 개체 상세 기본 정보 화면
개체 상세 — 개체별 기본 정보와 센서 연결 상태를 확인합니다

사용 기술

Flutter (Dart)Node.js · TypeScript · ExpressMSSQLDocker SwarmFirebase Cloud Messaging

발행 2026.09.30

비슷한 프로젝트를 준비 중이신가요?

배경과 제약 조건을 알려주시면 이 사례의 경험을 바탕으로 진행 방식과 예상 범위를 제안드립니다.