- hono-template 기반으로 프로젝트 시작
- npm 기준 스크립트 정리(dev/start/lint 등)
- docker-compose: postgres, redis
- .env.example 작성(DATABASE_URL, REDIS_URL 등)
- init-sql.db(또는 init SQL 파일) 추가: events 테이블 + 인덱스
- Postgres 연결(Kysely) 세팅
- Redis 연결 세팅
- BullMQ queue/worker 세팅(단일 앱 내에서 같이 구동)
- Redis Pub/Sub publish/subscribe 세팅
- Kysely 마이그레이션 실행기 추가
- 초기 마이그레이션 추가(스키마 빌더)
- 초기 마이그레이션을 Kysely 스키마 빌더로 정리
- regions 테이블 생성 및 regions.json 적재 마이그레이션 추가
- regions 중심 좌표 컬럼 추가(스키마/타입)
- GeoJSON 기반 regions 중심 좌표 적재(마이그레이션/init-db.sql)
- 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 포함)
- 로컬 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 명시 및 인코딩 점검
- "소스 클래스" 인터페이스/형식 정리(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는 재시도하지 않도록 처리
- 사람과 함께 각 소스별로 수집 방식 파악(정적 HTML / 내부 JSON / RSS / 인증/쿠키 필요 여부)
- 폴링 주기/변경 빈도 대략 파악(너무 잦은 요청 방지)
- 파싱에 필요한 최소 필드 합의(title, occurred_at, region_text, payload 후보)
- 실패 케이스 파악(요청 차단, 응답 포맷 변경, 빈 목록 등) 및 최소 대응(로그/타임아웃)
- 재난문자(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 뉴스 분류 기준을 제목으로 전환
- 홍수 특보 현황 엔드포인트/파싱 규칙 정리
- 홍수 특보 현황 폴링 주기 결정
- 홍수 특보 현황 실패 케이스 최소 대응(타임아웃/빈 데이터/포맷 변경)
- 홍수 특보 현황 구현
- /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 테이블 제거
- README 프로젝트 소개 문서 작성
- ingest 공통 normalize 유틸 단위 테스트 추가
- region 코드 해석 로직 단위 테스트 추가
- 주요 소스 수집 로직 단위 테스트 추가
- 추가 소스 수집 로직 단위 테스트 보강
- ingest 공통 유틸(is-too-old/prune/should-emit/fetch) 단위 테스트 추가