농업용수 정보를 읽기 쉬운 웹과 앱으로
개인 프로젝트에서 디자이너와 협업하며 Next.js 웹, Android 앱, API 개발을 전담했습니다. 저수율을 쉬운 행동 안내로 보여주고 웹과 앱이 같은 API 명세를 사용하도록 구성했습니다. AI 장애 시에도 기본 안내를 제공합니다.
저수율과 함께 오늘 할 일을 보여줍니다
수신호는 한국농어촌공사의 공공데이터를 활용한 물관리 안내 서비스입니다. 숫자와 그래프를 확인하는 데서 그치지 않고, 농업인이 지역 상황과 오늘 할 일을 함께 볼 수 있도록 기획했습니다.
개발자 1명과 디자이너 1명으로 진행했고, 저는 웹, Android, API 설계와 개발을 전담했습니다. 고령 농업인을 고려해 읽기 쉬운 표현과 로그인 없이 시작하는 흐름을 우선했습니다.
웹과 Android가 같은 API 명세를 사용합니다
Next.js 웹과 Kotlin, Jetpack Compose 앱을 모노레포에서 개발했습니다. 공통 OpenAPI 명세와 응답 예시를 별도 패키지에 두고, 문서, 픽스처와 두 클라이언트의 데이터 형식이 어긋나지 않도록 CI 검사 기준을 구성했습니다.
지역 설정은 기기에 보관하고 주소 원문은 서버에 저장하지 않도록 설계했습니다. 연결이 끊긴 경우에는 마지막 화면을 유지해 사용자가 보던 정보를 계속 확인할 수 있도록 했습니다.
관측값, 자체 추세와 공식 전망을 구분합니다
한국농어촌공사의 논가뭄지도, 저수지 수위 및 저수율, 가뭄 예경보 자료를 사용합니다. 연간 갱신 파일은 포털 갱신일을 확인해 수동 적재하고, 수위 API는 요청 시 조회해 60분 캐시합니다. 서버 응답에는 기준일과 출처를 담고, 조회 실패로 저장된 스냅샷을 사용하면 stale 상태를 전달합니다.
자체 예측은 평년 대비 저수율 시계열에 통계 모델을 적용한 30일 참고 추세입니다. 마지막 값 유지, 7일 평균, 선형회귀, 지수평활을 백테스트로 비교하며 LLM이 수치를 예측하지 않습니다. 다음 단계 도달 시점은 최근 14일 관측 기울기를 별도로 사용합니다. 공식 가뭄 예보와 경보가 우선합니다.
AI가 답하지 않아도 기본 안내는 제공하도록 했습니다
단계, 수치, 행동 목록은 서버가 정하고, LLM은 정해진 내용을 쉬운 문장으로 설명하도록 역할을 나눴습니다. 모델이 새로운 판단이나 근거 없는 행동을 추가하지 않도록 응답을 제한했습니다.
외부 AI 장애나 예산 초과 시에는 정적 안내로 전환합니다. 수치 예측과 문장 생성을 분리해, LLM 응답 실패가 기본 안내를 막지 않도록 구성했습니다.
| 조건 | 제공하는 정보 |
|---|---|
| 정상 | 서버가 정한 단계와 행동을 LLM이 쉬운 문장으로 설명 |
| AI 실패 / 응답 검증 실패 | 허용된 행동 목록 기반의 정적 안내 |
| 예산 한도 초과 | AI 호출 대신 정적 안내 |
| 오프라인 | 마지막 화면 유지 / 최신 정보로 간주하지 않음 |
기능별 검증 기준을 두고 공모전에 출품했습니다
웹, API, Android, 공통 계약, AI 응답을 나눠 검증하도록 저장소 지침을 작성했습니다. AI 응답은 형식 검사뿐 아니라 허용된 행동만 담았는지와 기본 안내로 전환되는 경우도 검증 대상으로 두었습니다.
제3회 KRC AI 디지털 혁신 공모전에 출품하고 웹, 소스코드와 Android 릴리즈를 공개했습니다.
Android 온보딩 / 회원가입 없이 내 지역 설정으로 시작
지역 선택부터 시작하는 Android 온보딩입니다. 웹과 앱의 화면을 구현하고 공통 API 응답에 맞춰 연결했습니다.
지금 팀이 풀고 있는
문제는 무엇인가요?
서비스 출시 부터 운영까지,
제가 기여할 수 있는 일을 함께 하고 싶습니다.



