FireWatch — bkit PDCA로 계획 세우고 하루 만에 백엔드+웹 완성
무엇을 만들었나
매일 아침 8시, 국내·미국 증시 요약과 호재/악재 뉴스, 금/은 시세, 환율을 자동으로 수집·분석해서 웹 대시보드와 모바일 푸시로 전달하는 시스템. 이름은 FireWatch.
계획부터 세우고 시작
bkit PDCA로 Plan → Design → Do 순서를 지켰다. Plan에서는 계정 없는 1인 사용자 모델, MVP는 backend+web 우선(모바일은 Phase 2로 분리), 백엔드는 Oracle Cloud Always Free Tier로 확정했다. Design에서는 아키텍처 3안 중 Option C(Pragmatic Balance)를 선택했다 — FR 도메인별 3계층 구조에 AuditLogAspect를 Service 공개 메서드 전체에 AOP로 일괄 적용해서 감사로그 누락을 구조적으로 막는 방식. 계정이 없어도 설정 변경·수동 트리거 같은 쓰기 API는 정적 X-API-Key로 최소 보호하기로 했다(ADR 0004).
하루 만에 Phase 1
Kotlin + Spring Boot 4.1(명세서의 "3.2+" 요구를 충족하되, Initializr가 3.x를 안 줘서 4.1로 시작 — ADR 0005)로 백엔드를 세우고, AuditLogAspect가 service 패키지 전체를 가로채 SUCCESS/WARNING/FALLBACK/FAILURE 4개 상태를 자동 판정하도록 했다. 어느 서비스 코드에도 로깅을 직접 흩뿌리지 않는 게 핵심이었다.
금융 데이터는 한국수출입은행 환율 API와 Yahoo Finance 비공식 API로 수집했는데, 실측하면서 두 가지 함정을 발견했다 — 수출입은행 위안화 코드가 "CNY"가 아니라 "CNH"였고, Yahoo는 User-Agent 헤더가 없으면 429를 뱉었다. FCM 발송 로직을 붙이는 중에는 AuditLogAspect가 성공 시 response_summary를 항상 "OK"로만 남기던 설계 결함도 발견해 고쳤다 — 이제 반환값이 그대로 감사로그에 남아 발송 성공/실패 통계가 자동 기록된다.
웹은 Vite + React 18 + antd v5로 대시보드·감사로그·설정 3화면을 붙였다. 브라우저로 직접 확인하는 과정에서 Design 문서가 CORS를 아예 빠뜨린 걸 발견해 그 자리에서 추가했다.
결과
| 구간 | 소요 |
|---|---|
| Plan + Design | 약 1시간 |
| 백엔드 (스캐폴딩~REST API 6종) | 약 3시간 |
| 웹 3화면 | 약 3시간 |
./gradlew build, npm run build, npm run lint 전부 통과를 확인하고 하루를 마쳤다. 남은 건 배포뿐이었다.