![[모두의 청약] 온디바이스 기반 청약앱](https://blxpvgsvfakkqmoddjui.supabase.co/storage/v1/object/public/media/projects/mt42e2d8-rv3pg-moodu-1.webp)
[모두의 청약] 온디바이스 기반 청약앱
공공 API와 청약 공고문 PDF를 결합해 누락된 주거 정보를 자동 추출·보강하고 모바일에서 제공하는 AI 기반 청약정보 플랫폼
- React Native
- Expo
- TypeScript
- Hono
- Hext.js
- PDF Parsing
- OpenAI
- Antropic
- Gemini
공공 API와 PDF·LLM 분석을 결합한 청약정보 통합 플랫폼
01. 프로젝트 소개
공공주택 청약정보는 API를 통해 제공되지만, 난방방식·동수·주차대수·입주예정월·문의전화 등 실제 주거 판단에 필요한 일부 정보는 API에서 누락되고 공고문 PDF에만 존재하는 경우가 있습니다.
모두의 청약은 공공 API의 구조화 데이터와 청약 공고문 PDF의 비정형 데이터를 결합하여 흩어진 정보를 자동 수집·정규화·보강하고, React Native + Expo 기반 모바일 앱에서 쉽게 탐색할 수 있도록 개발한 청약정보 플랫폼입니다.
API · Mobile · Admin을 하나의 저장소에서 관리하는 Monorepo 구조로 설계했으며, API에서 제공하지 않는 데이터는 Regex-first → LLM Fallback → Confidence & Evidence 검증으로 이어지는 하이브리드 추출 파이프라인으로 보완합니다.
02. 주요 기능

① 🏠 청약정보 통합 제공
공공데이터 API에서 청약·임대주택 공고를 수집하고 서로 다른 형태의 데이터를 모바일 앱에서 활용할 수 있도록 정규화합니다. API에서 제공되지 않는 단지 세부정보는 원본 공고문 PDF 분석 결과로 자동 보완하여 사용자가 여러 사이트와 문서를 직접 확인해야 하는 과정을 줄였습니다.
핵심 기능
- 공공 API 기반 청약·임대주택 공고 자동 수집
- 공고 및 단지정보 표준화·정규화
- API 누락 데이터를 공고문 PDF에서 자동 보완
- React Native + Expo 기반 모바일 탐색 환경 제공
② 🏗️ Monorepo 기반 서비스 아키텍처
Mobile · API · Admin을 독립적인 애플리케이션 영역으로 분리하면서 하나의 저장소에서 관리할 수 있도록 Monorepo Architecture를 적용했습니다. Mobile은 React Native + Expo, API는 TypeScript + Hono를 기반으로 구성했으며, 향후 Next.js Admin을 동일한 Monorepo에 추가하여 운영·데이터 관리 기능을 확장할 수 있도록 설계했습니다.
③ 📄 공고문 PDF 자동 분석
청약 API만으로 확보할 수 없는 정보를 얻기 위해 원본 공고문 PDF를 자동 다운로드하고 텍스트 데이터로 변환하는 Document Processing Pipeline을 구현했습니다. 변환된 문서에서 난방방식 · 동수 · 주차대수 · 입주예정월 · 문의전화 등의 정보를 탐색하여 기존 API 데이터에 결합합니다.
처리 대상 예시
- 난방방식
- 단지 동수
- 주차대수
- 입주예정월
- 문의전화
Public Housing API
│
├── Structured Data
│
└── Announcement PDF
↓
PDF → Text
↓
Data Extraction
↓
Normalize / Enrich
↓
Mobile App④ 🧠 Context-aware LLM Fallback
PDF의 표 구조가 텍스트 변환 과정에서 깨지거나 기관마다 표현 방식이 달라 정규식으로 안정적으로 추출하지 못한 항목에 대해서만 LLM 기반 2차 분석을 수행합니다. complex-runner.ts에서 전체 PDF를 LLM에 전달하지 않고 난방 · 주차 · 층 · 동 · 세대 등의 키워드로 관련 가능성이 높은 페이지만 선별한 뒤 complex-llm.ts에서 필요한 정보를 구조화하여 추출합니다.
핵심 최적화
- Regex 추출 실패 항목만 LLM Fallback
- 관련 페이지 Candidate Selection
- 전체 PDF 대신 필요한 Context만 전달
- Token 사용량 및 API 비용 절감
- 불필요한 LLM 추론 범위 축소
export async function extractComplexDetailFromPdf(
pdfBytes: Uint8Array,
options: ExtractComplexOptions,
): Promise<ComplexLlmExtraction> {
const pages = await extractPdfPages(pdfBytes)
const { text, usedPages } = selectRelevantText(pages, options.maxChars ?? MAX_INPUT_CHARS)
if (text.trim().length === 0) throw new Error('PDF 텍스트 레이어가 비어 있습니다(스캔본 가능).')
return extractComplexDetailFromText(text, usedPages, options)
}Regex Extraction
│
Success ──────────────→ Normalize
│
Failed
↓
Candidate Page Selection
↓
Relevant Context Only
↓
LLM Extraction
↓
Value + Confidence + Evidence⑤ 🔄 Multi-LLM Provider Architecture
특정 AI 서비스에 종속되지 않도록 llm-providers.ts에서 LLM 호출 계층을 추상화했습니다. OpenAI · Anthropic · Gemini를 동일한 인터페이스에서 사용할 수 있는 Provider Adapter 구조를 적용하여 데이터 추출 로직과 실제 모델 호출 구현을 분리했습니다. 모델의 성능·비용·API 정책 변화에 따라 핵심 추출 로직을 수정하지 않고 Provider를 교체할 수 있도록 설계했습니다.
주요 특징
OpenAI / Anthropic / Gemini 지원
- 공통 Provider Interface
- 추출 로직과 모델 호출 계층 분리
- 모델 교체 및 확장 용이
- 특정 LLM Vendor 종속성 최소화
⑥ Evidence-based AI Extraction
LLM이 생성한 값을 그대로 신뢰하지 않고 각 결과를 Value · Confidence · Evidence 구조로 반환하도록 설계했습니다. Value에는 최종 추출값, Confidence에는 결과에 대한 신뢰도, Evidence에는 실제 판단의 근거가 된 공고문 원문을 함께 기록합니다. 이를 통해 AI가 추출한 정보의 출처를 추적하고, 신뢰도가 낮은 결과를 별도로 식별할 수 있도록 하여 LLM 기반 데이터 처리의 검증 가능성을 높였습니다.

⑦ 📱 온디바이스 청약 가점 계산
사용자가 입력한 청약 조건을 기반으로 청약 가점을 디바이스 내부에서 직접 계산할 수 있도록 구현했습니다. 무주택기간·부양가족수·청약통장 가입기간 등 가점 산정에 필요한 사용자 정보를 입력하면 각 항목별 점수와 총점을 계산하여 결과를 즉시 제공합니다. 계산 과정은 외부 AI나 서버에 의존하지 않고 온디바이스 로직으로 처리하여 빠른 응답성을 확보하고, 가점 계산에 사용되는 개인 입력정보가 불필요하게 외부 서버로 전송되지 않도록 설계했습니다.
핵심 기능
- 무주택기간 기반 가점 계산
- 부양가족수 기반 가점 계산
- 청약통장 가입기간 기반 가점 계산
- 항목별 점수 및 총 청약가점 제공
- 서버 요청 없이 On-device 계산
- 민감할 수 있는 사용자 입력정보의 외부 전송 최소화
Mobile
- React Native
- Expo
- TypeScript
On-device
- Local Scoring Engine
- Privacy-first Processing
Admin
- Next.js
API / DB
- TypeScript
- Hono
- PostgreSQL
- Drizzle-orm
Data Source
- Data.go.kr Public API
- PDF Parsing
- RegExp
AI Model
- Gemini
- OpenAI
- Anthropic
AI Architecture
- Regex-first
- LLM Fallback
- Multi-provider Adapter
Reliability
- Confidence Scoring
- Evidence Tracking