대시보드 사이트 모니터링 설정 누락 수정과 재발 방지
목차
대시보드에서 활성 사이트를 추적하기 위해 SITE_EXPECTED_INTERVAL 사전에 누락된 항목을 추가했다. 겉보기엔 작은 수정이지만, 이런 configuration 누락이 가지는 영향과 팀 단계에서 이를 방지하는 방법을 함께 정리해본다.
버그의 발생 맥락
대시보드 통계 모듈은 여러 사이트/채널의 상태를 일괄 추적한다. 각 사이트가 정상 작동하는지 판단하려면 기댓값(expected interval)을 먼저 정의해야 한다. 예를 들어 어떤 사이트는 1분마다 신호를 보내야 하고, 또 다른 사이트는 5분 단위여야 한다는 식이다. 이 매핑을 SITE_EXPECTED_INTERVAL 사전에 담아 두고, 실제 신호 간격과 비교해서 지연/장애를 감지한다.
그런데 이번에 새로운 활성 사이트를 추가하거나 기존 사이트의 모니터링을 확대할 때, 그 사이트를 사전에 등록하지 않은 채로 배포되어 버린 것 같다. 결과적으로 대시보드는 그 사이트의 상태를 제대로 추적하지 못했다. 단순 데이터 누락처럼 보이지만, 실제로는:
- 운영자가 보는 대시보드에서 그 사이트가 "상태 불명" 또는 "예상 외 패턴"으로 표시될 수 있다
- 모니터링 로직이 혼란스러워져 오탐(false alert)을 유발할 수 있다
- 나중에 다른 팀이 이 코드를 손볼 때 "왜 이 사이트는 설정이 없지?" 라는 의문이 생긴다
수정 내용 및 영향
src/lib/dashboard-stats.ts 파일에서 해당 사이트를 SITE_EXPECTED_INTERVAL 사전에 추가했다:
| 상황 | 설명 |
|---|---|
| 수정 전 | 활성 사이트가 사전에 없어 기댓값 비교 실패 |
| 수정 후 | 모든 활성 사이트가 사전에 등록되어 일관된 모니터링 |
| 영향 범위 | 대시보드 통계 계산, 지연 감지 로직 |
이런 설정 누락은 보통 다음과 같은 흐름에서 발생한다:
// Bad: 사이트 추가 시 두 곳을 동시에 수정해야 함
const ACTIVE_SITES = ['siteA', 'siteB', 'siteC']; // ← 새 사이트 추가
const SITE_EXPECTED_INTERVAL = {
siteA: 60,
siteB: 300,
// ← 사이트C를 깜빡함!
};
// Better: 사전을 먼저 정의하고, ACTIVE_SITES는 그로부터 파생
const SITE_EXPECTED_INTERVAL = {
siteA: 60,
siteB: 300,
siteC: 120,
};
const ACTIVE_SITES = Object.keys(SITE_EXPECTED_INTERVAL);
이런 식으로 관리하면 둘이 항상 동기화되고, 누락을 방지할 수 있다.
팀 관점: 설정값 누락 방지하기
이 문제를 겪으면서 몇 가지 배운 점이 있다:
- 코드 리뷰 시 체크리스트: "이 파일이 상수/설정 파일과 함께 수정되었는가?" 같은 질문을 습관처럼 던질 필요가 있다. Pull Request에서
dashboard-stats.ts외에 설정 파일이 빠져 있으면 일단 의심한다. - 테스트 커버리지: 활성 사이트 목록을 iteration할 때, 사전에 없는 키에 접근하면
undefined반환이나 에러가 나는 게 낫다. 그래야 실제로 감지한다. - 타입스크립트 활용: 사전을 엄격히 정의하면(예:
Record<SiteKey, Interval>) 새 사이트 추가 시 컴파일 단계에서 경고를 받을 수 있다.
// 타입으로 강제하기
type SiteKey = 'siteA' | 'siteB' | 'siteC';
const SITE_EXPECTED_INTERVAL: Record<SiteKey, number> = {
siteA: 60,
siteB: 300,
siteC: 120,
};
정리
큰 기능 추가가 아닌 "빠진 설정값 하나" 같은 작은 수정도 실제로는 데이터 정합성에 영향을 미친다. 팀이 커질수록 이런 누락은 자동화와 가드(타입, 테스트, 리뷰 체크리스트)로 방지하는 게 훨씬 효율적이다. 앞으로도 비슷한 패턴의 설정 관리는 먼저 "어떤 자료구조가 single source of truth인가"를 명확히 한 후 진행하려 한다.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.