Shelter Signal
보호 종료가 가까운 구조동물 공고를 어떻게 먼저 확인하게 할 것인가?
공공 구조동물 공고를 최신순 목록이 아니라 보호 종료일·공고 상태·사진·연락처·지역 신호에 따른
우선 검토 흐름으로 재구성한 모바일 우선 PWA입니다.
질문이 바뀐 순간
이 프로젝트가 단순 분석에서 의사결정 구조로 넘어간 핵심 장면입니다.
- Key Evidence
- 보호 종료일, 공고 상태, 사진·연락처 여부, 지역 신호를 조합한 Rescue Window Score
- Final Deliverable
- Neon-backed /api/notices, static·mock fallback, /api/shelters, Vite React PWA
- What this proves
- 공공데이터 조회 문제를 우선순위 판단 문제로 재정의하고, 해석 가능한 신호를 모바일 검토 흐름으로 연결할 수 있음
근거 스냅샷
숫자가 있는 프로젝트는 검증 지표를 먼저, 데이터가 부족한 프로젝트는 확인 가능한 산출물 중심으로 정리했습니다.
문제와 맥락
- 주요 도메인
- 공공데이터
- 역할
- 데이터 파이프라인 설계 / 서버리스 API 연결 / PWA 구현
- 기간
- 2026
- 형태
- 개인 프로젝트
구조동물 공고는 보호 종료일, 공고 상태, 사진·연락처 여부, 지역 정보가 흩어져 있어 보호 종료가 가까운 공고를 먼저 확인하기 어렵습니다. 이 프로젝트는 공고 조회가 아니라 오늘의 검토 순서를 정하는 문제에 초점을 맞췄습니다.
구조동물 공고를 최신순으로 나열하면 보호 종료가 가까운 공고와 추가 확인이 필요한 공고를 한눈에 구분하기 어렵습니다.
사용자는 전체 공고를 반복해서 조회하기보다 오늘 먼저 확인할 공고와 그 판단 근거를 빠르게 파악할 필요가 있기 때문입니다.
데이터와 접근
- data.go.kr 구조동물 공고 API 응답
- Neon PostgreSQL operational records
- 정적 JSON / mock fallback
- 공고에서 보호 종료일, 공고 상태, 사진·연락처 여부, 지역 신호를 추출·정규화
- 신호를 조합해 Rescue Window Score를 계산하고 긴급 확인·종료 임박·검토 필요 라벨로 분류
- 결과를 Neon-backed `/api/notices`와 Golden Time·Notice Filters·Region Explorer·Detail Sheet에 연결
- `/api/notices` 장애 또는 빈 응답 시 static JSON과 mock 데이터로 fallback
- `/api/shelters`에서 공고 기반 보호소·연락처 맥락을 추출하고 dedupe
- 보호 종료일까지 남은 일수
- 공고 진행 상태
- 사진·보호소 연락처·특이사항 신호
- notice-derived shelter/contact count
- V2 local smoke test: dry-run, HTML export, Mailpit SMTP capture and inbox verification PASS
결과물
공공 구조동물 공고에서 우선순위 신호를 추출해 Rescue Window Score와 검토 라벨로 정리하고, Golden Time·Notice Filters·Region Explorer·Detail Sheet에 연결했습니다. 배포 앱은 Neon-backed `/api/notices`를 우선 사용하고 static JSON과 mock 데이터로 fallback하며, `/api/shelters`는 공고에서 확인 가능한 보호소 연락 맥락을 요약합니다.
핵심 포인트
- 공공데이터 조회를 보호 종료가 가까운 공고부터 확인하는 우선순위 판단 문제로 재정의
- 공고 수준 데이터를 해석 가능한 Rescue Window Score와 검토 라벨로 변환
- 우선순위 신호를 검토 화면, API read path, fallback 구조, 모바일 PWA 전달까지 연결
한계와 검토 메모
검증 범위와 추가로 확인해야 할 조건을 숨기지 않고 함께 남겼습니다.
- 현재 배포 범위는 포트폴리오용 PWA 프로토타입이며 실제 운영 보호소 서비스가 아닙니다.
- 사용자 계정과 인증은 구현 범위에 포함하지 않았습니다.
- 저장 공고의 영구 보관은 구현하지 않았으며 화면에는 placeholder만 있습니다.
- 배포 앱에는 push·email·SMS 알림이 포함되지 않습니다. V2 n8n/Mailpit 흐름은 별도 브랜치의 로컬 자동화 검증입니다.
- `/api/shelters`는 전체 공식 보호소 디렉터리가 아니라 구조동물 공고에 포함된 보호소·연락처 정보의 notice-derived summary입니다.
- Rescue Window Score는 공식 위험 점수나 입양 결과 예측 모델이 아니라 내부 우선순위 탐색 신호입니다.
- 배포된 `/api/notices`는 Neon operational DB를 우선 읽지만, 현재 hosted 데이터는 로컬 검증용 mock/export 20건을 기반으로 합니다.
- `/api/notices`가 실패하거나 빈 응답을 반환하면 `app/public/data/*.json` 정적 JSON과 앱 내부 mock 데이터로 fallback합니다.
- API key와 운영용 비밀값은 저장소와 배포 문서에 포함하지 않았습니다.
확인 가능한 산출물
Live Demo에서는 Neon-backed `/api/notices` operational read path와 static/mock fallback, `/api/shelters`의 notice-derived 보호소 연락 맥락을 확인할 수 있습니다. DB URL과 API key는 브라우저에 노출하지 않습니다.