Skip to content

Latest commit

 

History

History
172 lines (152 loc) · 9.92 KB

File metadata and controls

172 lines (152 loc) · 9.92 KB

TODO.md

0. 기본 준비

  • hono-template 기반으로 프로젝트 시작
  • npm 기준 스크립트 정리(dev/start/lint 등)
  • docker-compose: postgres, redis
  • .env.example 작성(DATABASE_URL, REDIS_URL 등)
  • init-sql.db(또는 init SQL 파일) 추가: events 테이블 + 인덱스

1. Infra 구성

  • Postgres 연결(Kysely) 세팅
  • Redis 연결 세팅
  • BullMQ queue/worker 세팅(단일 앱 내에서 같이 구동)
  • Redis Pub/Sub publish/subscribe 세팅
  • Kysely 마이그레이션 실행기 추가
  • 초기 마이그레이션 추가(스키마 빌더)
  • 초기 마이그레이션을 Kysely 스키마 빌더로 정리
  • regions 테이블 생성 및 regions.json 적재 마이그레이션 추가
  • regions 중심 좌표 컬럼 추가(스키마/타입)
  • GeoJSON 기반 regions 중심 좌표 적재(마이그레이션/init-db.sql)

2. 이벤트 저장/조회

  • UUID 기반 이벤트 id 생성 유틸
  • events insert/list repo(또는 서비스) 구현
  • GET /events 구현(최신 목록, limit/kind/source 정도)
  • GET /events since 파라미터 추가
  • events 스키마 본문/level 타입 변경 및 enum 정리
  • events 테이블 link 컬럼 제거
  • 이벤트 모델 geo/region 필드 추가
  • events region -> region_codes 배열 전환
  • 이벤트 단건 상세 조회 API 추가(payload 포함)

3. SSE(멀티 인스턴스 포함)

  • 로컬 SSE 클라이언트 관리(Set 등) 구현
  • GET /events/stream 구현
    • (선택) since 파라미터로 DB에서 먼저 보내고 live 전환
  • SSE Last-Event-ID 헤더 기반 catch-up 전환
  • SSE afterId 쿼리 파라미터 지원(헤더보다 우선)
  • 새 이벤트 fanout:
    • 이벤트 insert 성공 후 Pub/Sub로 eventId publish
    • subscribe 측에서 eventId 수신 → DB 조회 → 로컬 SSE broadcast
  • SSE 응답 charset=utf-8 명시 및 인코딩 점검

4. Ingest(소스 실행)

  • "소스 클래스" 인터페이스/형식 정리(sourceId, pollIntervalSec, run())
  • 소스 registry 작성(활성화된 소스 목록)
  • 앱 부팅 시 repeatable job 등록(소스별 주기)
  • repeatable job 업데이트를 위해 repeat.key 고정 적용
  • Job Scheduler로 ingest 스케줄 등록 전환
  • worker에서 sourceId로 소스 run() 실행 → events insert → publish
  • INGEST_ENABLED 플래그로 수집 역할 분리
  • DB 체크포인트(소스별 state) 저장/조회
  • 소스별 수집 중복 실행 방지 인터락 추가
  • 수집 소스 상태 조회 API 추가
  • YNA 응답 코드 22는 재시도하지 않도록 처리

5. 실제 소스 어댑터 구현 전 사전 파악(중요)

  • 사람과 함께 각 소스별로 수집 방식 파악(정적 HTML / 내부 JSON / RSS / 인증/쿠키 필요 여부)
  • 폴링 주기/변경 빈도 대략 파악(너무 잦은 요청 방지)
  • 파싱에 필요한 최소 필드 합의(title, occurred_at, region_text, payload 후보)
  • 실패 케이스 파악(요청 차단, 응답 포맷 변경, 빈 목록 등) 및 최소 대응(로그/타임아웃)

6. 실제 소스 어댑터 구현

  • 재난문자(DisasterSmsList) 엔드포인트 확인 및 요청 파라미터 정리
  • 재난문자 필드 매핑 합의(title/occurred_at/region_text/level/payload)
  • 재난문자 폴링 주기 초안 결정
  • 재난문자 실패 케이스 최소 대응(타임아웃/빈 목록/포맷 변경)
  • 재난문자 제목에 발송 주체 반영
  • 재난문자 region 콤마 공백 정규화
  • EventKinds 재난 종류 확장
  • 재난문자 DSSTR_SE_NM kind 매핑 확장
  • 기상청 미소지진(HTML) 엔드포인트 확인 및 응답 파싱 규칙 정리
  • 기상청 미소지진 필드 매핑 합의(title/occurred_at/region_text/level/payload)
  • 기상청 미소지진 폴링 주기 초안 결정
  • 기상청 미소지진 실패 케이스 최소 대응(타임아웃/빈 목록/포맷 변경)
  • 기상청 지진 신속/상세(PEWS) 바이너리 엔드포인트 확인 및 파싱 규칙 정리
  • 기상청 지진 신속/상세 필드 매핑 합의(title/occurred_at/region_text/level/payload)
  • 기상청 지진 신속/상세 폴링 주기 초안 결정
  • 기상청 지진 신속/상세 실패 케이스 최소 대응(타임아웃/빈 데이터/포맷 변경)
  • 기상청 지진 신속/상세 시뮬레이션 옵션 설계 및 추가(환경변수 기반)
  • NFDS 화재 출동 현황 엔드포인트 확인 및 응답 파싱 규칙 정리
  • NFDS 화재 출동 현황 필드 매핑 합의(title/occurred_at/region_text/level/payload)
  • NFDS 화재 출동 현황 폴링 주기 초안 결정
  • NFDS 화재 출동 현황 실패 케이스 최소 대응(타임아웃/빈 데이터/포맷 변경)
  • NFDS 화재 출동 현황 법정동 코드 기반 region_codes 추가
  • NFDS 화재 출동 현황 region 코드 중심 좌표 geo 적용
  • 기상청 기상특보(CSV) 엔드포인트 확인 및 응답 파싱 규칙 정리
  • 기상청 기상특보 필드 매핑 합의(title/occurred_at/region_text/level/payload)
  • 기상청 기상특보 폴링 주기 초안 결정
  • 기상청 기상특보 실패 케이스 최소 대응(타임아웃/빈 데이터/포맷 변경)
  • 기상청 기상특보 그룹화/중복 기준 반영
  • 교통 돌발정보(UTIC) 엔드포인트 확인 및 요청 파라미터 정리
  • 교통 돌발정보 필드 매핑 합의(title/occurred_at/region_text/level/payload)
  • 교통 돌발정보 폴링 주기 초안 결정
  • 교통 돌발정보 실패 케이스 최소 대응(타임아웃/빈 데이터/포맷 변경)
  • 교통 돌발정보 coordX/coordY 기반 geo 설정
  • 소스별 오래된 데이터 스킵 로직 추가(STATE 기준 여유 포함)
  • 에어코리아 미세먼지 주의보/경보(HTML) 엔드포인트 확인 및 파싱 규칙 정리
  • 에어코리아 미세먼지 주의보/경보 필드 매핑 합의(title/occurred_at/region_text/level/payload)
  • 에어코리아 미세먼지 주의보/경보 폴링 주기 초안 결정
  • 에어코리아 미세먼지 주의보/경보 실패 케이스 최소 대응(타임아웃/빈 데이터/포맷 변경)
  • 에어코리아 오존 주의보/경보(HTML) 엔드포인트 확인 및 파싱 규칙 정리
  • 에어코리아 오존 주의보/경보 필드 매핑 합의(title/occurred_at/region_text/level/payload)
  • 에어코리아 오존 주의보/경보 폴링 주기 초안 결정
  • 에어코리아 오존 주의보/경보 실패 케이스 최소 대응(타임아웃/빈 데이터/포맷 변경)
  • 에어코리아 미세먼지 주의보/경보 region 코드 매핑 추가
  • 에어코리아 오존 주의보/경보 region 코드 매핑 추가
  • 에어코리아 미세먼지 주의보/경보 레벨 매핑 하향 조정
  • 에어코리아 오존 주의보/경보 레벨 매핑 하향 조정 및 중대 등급 반영
  • 산림청 산불 발생 정보 엔드포인트 확인 및 요청 파라미터 정리
  • 산림청 산불 발생 정보 필드 매핑 합의(title/occurred_at/region_text/level/payload)
  • 산림청 산불 발생 정보 폴링 주기 초안 결정
  • 산림청 산불 발생 정보 진행 상태/대응 단계/중복 기준 반영
  • 산림청 산불 발생 정보 실패 케이스 최소 대응(타임아웃/빈 데이터/포맷 변경)
  • 산림청 산불경보 현황 엔드포인트/파싱 규칙 정리
  • 산림청 산불경보 현황 폴링 주기 결정
  • 산림청 산불경보 현황 등급 변동 감지 기준 반영
  • 산림청 산불경보 현황 구현
  • 재난문자 기타 유형 LLM 분류 적용
  • 재난문자 region 코드 매핑 추가
  • 사이버위기경보 발령 이력 오래된 데이터 스킵 로직 추가
  • 사이버위기경보 발령 이력 엔드포인트/파싱 규칙 정리
  • 사이버위기경보 발령 이력 폴링 주기 결정
  • 사이버위기경보 발령 이력 실패 케이스 최소 대응
  • 사이버위기경보 발령일 기준 동일일자 시간 보강
  • NCTC 테러경보 발령 이력 엔드포인트/파싱 규칙 정리
  • NCTC 테러경보 발령 이력 폴링 주기 결정
  • NCTC 테러경보 발령 이력 상세 페이지 제목/본문 보강
  • NCTC 테러경보 발령 이력 실패 케이스 최소 대응
  • KPX 전력수급현황 엔드포인트/파싱 규칙 정리
  • KPX 전력수급현황 단계 변동 감지/히스테리시스 반영
  • KPX 전력수급현황 이벤트 매핑 합의(title/level/payload)
  • YNA 뉴스 분류 기준을 제목으로 전환
  • 홍수 특보 현황 엔드포인트/파싱 규칙 정리
  • 홍수 특보 현황 폴링 주기 결정
  • 홍수 특보 현황 실패 케이스 최소 대응(타임아웃/빈 데이터/포맷 변경)
  • 홍수 특보 현황 구현

7. 운영 최소

  • /healthz, /readyz
  • k8s 배포용 빌드에서 node_modules 번들 스킵(tsup-node) 적용
  • k8s 배포 빌드 산출물에 DB migrations 포함
  • Dockerfile 멀티스테이지 빌드로 런타임 이미지 최소화
  • deploy 워크플로우에 테스트 실행 추가
  • graceful shutdown(서버/redis/worker/db)
    • BullMQ worker/queue 종료 훅 추가
    • Redis pubsub 구독 해제 및 클라이언트 종료
    • DB pool 종료(Kysely destroy)
    • shutdown 시퀀스/중복 시그널 처리
  • 로그 정리(잡 실패/파싱 실패 구분)
  • 디버그 로그 보강
  • health 모듈 ping API 단순화 및 health 테이블 제거

8. 문서

  • README 프로젝트 소개 문서 작성

9. 테스트

  • ingest 공통 normalize 유틸 단위 테스트 추가
  • region 코드 해석 로직 단위 테스트 추가
  • 주요 소스 수집 로직 단위 테스트 추가
  • 추가 소스 수집 로직 단위 테스트 보강
  • ingest 공통 유틸(is-too-old/prune/should-emit/fetch) 단위 테스트 추가