Skip to content

feat(funding): discover Bizinfo notices as unconfirmed candidates - #38

Merged
jhjh0512 merged 1 commit into
mainfrom
feat/5-bizinfo-discovery
Sep 29, 2026
Merged

jhjh0512 merged 1 commit into
mainfrom
feat/5-bizinfo-discovery

Conversation

@jhjh0512

Copy link
Copy Markdown
Contributor

Refs #5, #13

변경 내용

ADR 0006 후속 4번(기업마당 공고 탐색)이다. funding:sync에 기업마당 지원사업정보 Open API 수집기를 등록했다. 기업마당만으로 확인된 상품은 사업 단계·지원 유형을 알 수 없으므로 추가 확인에 머문다(ADR 0006 1·2절).

  • 수집기 app/src/features/funding/sources/bizinfo.ts
    • BIZINFO_API_KEY로 요청 한 번(searchCnt 5000)에 현재 공고 전체를 JSON으로 받는다.
    • 수집 범위: 지원대상(trgetNm)에 소상공인 또는 창업벤처가 있는 공고만 올린다.
    • 빼는 공고: 서울 밖 공고(공고명 [지역] 표시·소관기관), 신청 종료일이 지난 공고, 형식이 깨진 공고, 중복 공고. 사유별 개수를 명령 출력에 남긴다.
    • 지역: 서울 자치구가 확인되면 DISTRICTS, 서울이면 SEOUL, 그 밖에는 전국으로 추측하지 않고 UNKNOWN.
    • 신청기간은 YYYY-MM-DD ~ YYYY-MM-DD만 날짜로 읽는다. 기준일이 그 사이면 OPEN, 아니면 UNKNOWN이다. 문장은 note에 그대로 남긴다.
    • 실패로 기록하는 경우: 키 없음, 403·429(다시 시도하지 않음), 서버·연결 오류가 세 번 이어짐, JSON 아님, jsonArray 없음, totCnt보다 적게 받음.
    • 키는 요청 주소에만 쓰고, 오류 문장과 CLI 출력에서 가린다.
  • 추측하지 않고 기록하기(카탈로그 스키마 funding-catalog-v1.2.0)
    • 지원 유형 UNKNOWN을 추가했다. 화면에는 "유형 미확인(원 공고 확인)"으로 표시한다.
      • DB enum FundingSupportType에 값을 더하는 migration 20260928020000_funding_support_type_unknown이 있다.
      • 상환방식은 UNKNOWN이어야 하고 확정 금리·기간을 기록할 수 없다. 상환 계산 대상이 아니다.
    • eligibleBusinessStages를 빈 배열로 두면 사업 단계 미확인이다. 사업 단계 판정은 UNKNOWN이고 사업 단계 근거를 요구하지 않는다.
    • v1.0.0·v1.1.0 릴리스도 그대로 읽는다. catalog.json은 스키마만 올려 2026-09-28.2가 되었고 상품은 그대로다.
  • 판정: 새 공고를 찾는 데만 쓰는 출처(DISCOVERY_ONLY_SOURCES = 기업마당)의 자동 상품은 두 스위치가 켜져 있어도 현재 후보가 되지 않는다. 사람이 같은 공고를 sourceRef로 기록하면 사람 기록이 우선한다(feat(funding): add funding:sync with automation settings and source freshness #37).
  • 새 공고 보고: funding:sync 결과에 직전 ACTIVE 릴리스에 없던 공고를 출처별로 나열한다. 운영자가 서울시 육성자금 같은 사람 관리 상품의 새 공고·변경공고를 찾는 데 쓴다.
  • 문서: docs/domains/funding.md(v1.2.0, 기업마당 규칙, 출처 표), docs/DEVELOPMENT.md와 app/.env.example(BIZINFO_API_KEY), docs/ARCHITECTURE.md, 카탈로그 README.

검증

  • 이 branch는 docs(funding): accept ADR 0006 on automating funding candidates #33·feat(funding): keep unknown industry and purpose as pre-application checks #36·feat(funding): add funding:sync with automation settings and source freshness #37 병합 뒤 main에서 새로 만들었다. 커밋 하나를 옮겼고, 트리는 아래 검증을 마친 커밋(a01f638)과 한 바이트도 다르지 않다.
  • npm --prefix app run verify:fast: 통과(Vitest 269 passed / 41 skipped, skipped는 모두 DB 테스트).
  • DB 모드(로컬 PostgreSQL 16 전용 테스트 DB, node scripts/run-tests.ts database): 304 passed / 6 skipped. 6개는 #37과 같은 원본 대조 테스트(data/raw/ 없음)다.
  • migration:
  • E2E(Playwright, 로컬 Chromium): 6 passed.
  • 화면 직접 확인: 가짜 기업마당 응답을 runFundingSync로 적재한 뒤 /funding을 desktop·Pixel 7 폭으로 열었다.
    • 유형 미확인 배지, "추가 확인 필요", 사업 단계 미확인 사유, "상환 계산 대상 아님"이 보였다.
    • 가로 넘침은 없었다.
  • 실행하지 못한 검사: 실제 기업마당 API 호출. 이 환경의 프록시가 www.bizinfo.go.kr을 막고 인증키도 없다.
    • 응답 필드 이름(pblancId, pblancNm, pblancUrl, jrsdInsttNm, excInsttNm, reqstBeginEndDe, trgetNm, pldirSportRealmLclasCodeNm, totCnt)은 공개 명세와 ADR 0006 Context를 따랐다.
    • 병합 전에 키가 있는 환경에서 npm --prefix app run funding:sync -- --dry-run으로 확인해야 한다. 필드가 다르면 조용히 성공하지 않고 기업마당 출처가 실패로 기록된다.

위험·후속

  • DB·스키마: 새 migration(enum 값 추가)과 카탈로그 스키마 v1.2.0. 이전 릴리스는 그대로 읽는다. app/prisma 단일 PR 규칙 때문에 feat(funding): add funding:sync with automation settings and source freshness #37 병합 뒤에 이 PR을 열었다.
  • 데이터 계약: AGENTS.md §3의 계약은 바꾸지 않는다. 확인하지 못한 지원 유형·사업 단계를 0이나 추정값 대신 UNKNOWN으로 남긴다(§3의 2번).
  • ADR 0006 1절의 "새 enum을 만들지 않는다": 갈래 enum은 만들지 않았다. 기존 supportType에 값 하나(UNKNOWN)를 더했고, 이 값은 정책자금이 아닌 쪽(자동 승격 없음)으로 다룬다.
  • 알려진 한계:
    • 음식점 창업과 무관한 소상공인 공고도 추가 확인으로 쌓일 수 있다.
    • 지원대상 태그에 소상공인·창업벤처가 없는 서울시 육성자금 변경공고는 빠질 수 있다.
    • 첫 실제 실행 뒤 받은 공고 수와 상품 수를 ADR 0006 Validation에 기록한다.
  • 후속: 후보 화면을 두 갈래로 나누고 자동 상품에 "자동 확인" 표시를 붙이는 일(ADR 0006 1·7절)은 이 PR 위에 쌓은 PR에서 한다. 이 PR만으로는 자동 상품도 "검수 최신"으로 보인다.

🤖 Generated with Claude Code

https://claude.ai/code/session_015LCE4DgT5qdHP8y8V5qtbL


Generated by Claude Code

Add the Bizinfo (기업마당) Open API collector to funding:sync. Notices
tagged 소상공인 or 창업벤처 in Seoul or without a region signal become
automated products that stay NEEDS_CONFIRMATION until a person reviews
them (ADR 0006 sections 1-2).

- Add supportType UNKNOWN (catalog and Prisma enum, new migration) and
  treat an empty eligibleBusinessStages as an unconfirmed stage, so the
  collector records what Bizinfo does not tell us without guessing.
- Bump the catalog schema to funding-catalog-v1.2.0 and keep reading
  v1.0.0 and v1.1.0 releases.
- Hold discovery-only sources out of current candidates even when the
  policy loan switch is on.
- Report notices that were not in the previous ACTIVE release, and mask
  BIZINFO_API_KEY in every error and CLI line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015LCE4DgT5qdHP8y8V5qtbL
@jhjh0512

Copy link
Copy Markdown
Contributor Author

실제 기업마당 API 확인 (2026-09-29)

본문의 "실행하지 못한 검사"였던 실제 API 호출을 인증키가 있는 로컬 환경에서 확인했다.

  • 실행: 로컬 PostgreSQL 17 앱 DB에 npm --prefix app run funding:sync를 실행했다.
    • 이 PR 위에 쌓은 작업 브랜치에서 실행했다.
    • bizinfo.ts·sync.ts·schema.ts는 이 PR 커밋(835420d)과 같다.
  • 기업마당 출처: SUCCEEDED
    • 받은 공고 1,514건. 응답 전체 건수(totCnt)와 같아 잘린 응답이 아니다.
    • 수집 범위에 든 추가 확인 상품 84건. 그중 신청기간 안이라 OPEN인 공고는 38건이다.
    • 응답 필드 이름이 명세대로 읽혔다. 필드가 달랐다면 출처가 실패로 기록됐을 것이다.
  • 릴리스 trendbench-funding-catalog@2026-09-29.1이 ACTIVATED됐다.
    • 기업마당 상품은 두 스위치와 관계없이 모두 "추가 확인"으로 판정됐다(유형 미확인 갈래 84건).
  • 받은 공고 수와 상품 수는 후속 PR에서 ADR 0006 Validation의 "첫 실행 기록"에 남긴다.

🤖 Generated with Claude Code

@jhjh0512
jhjh0512 merged commit 7fc1b34 into main Sep 29, 2026
1 check passed
@jhjh0512
jhjh0512 deleted the feat/5-bizinfo-discovery branch September 29, 2026 09:34
jhjh0512 added a commit that referenced this pull request Sep 29, 2026
…ches

main의 #38 squash 커밋은 이 브랜치의 835420d와 내용이 같다. 이 브랜치가 그 위에 #39 변경을 더했으므로 이 브랜치 쪽 내용을 그대로 둔다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants