[DB-01] alerts 테이블 생성 (V42)

작업 내용 (설계 의도)

변경 사항

알림 이력(FR-9)을 저장하는 alerts 테이블을 신규 생성한다. 근거 TDD: ../TDD.md §ERD·§Detail Design. senior-dba가 컬럼·인덱스를 확정하고 mysql-implementer가 V42__create_alerts.sql을 작성한다. (②가 V38~V40, ③이 V41을 점유 → ⑥은 V42. 머지 순서에 따라 origin/dev 최신 번호로 재배정 가능.)

  • 컬럼: id(PK), signal_key(endpoint+source+severity 조합 문자열), endpoint, source(VARCHAR, latency/oversell/deployment/self_check), severity(VARCHAR, info/warn/critical), env(VARCHAR, local/dev/prod), status(VARCHAR), analysis(TEXT, JsonStringType IncidentAnalysis), analysis_included(TINYINT(1)), raised_at(DATETIME(6)), delivered_at(DATETIME(6) NULL), version(BIGINT), 감사 컬럼(created_at/updated_at).
  • 컨벤션: FK·ENUM·JSON·BOOLEAN 금지(VARCHAR/TINYINT/TEXT), 모든 컬럼 COMMENT, DATETIME(6).
  • notifications.channelVARCHAR(20) CHECK 없음 → DISCORD 저장에 DDL 변경 불필요(마이그레이션 대상 아님).
  • 인덱스: 조회 패턴(사후 분석: env+source+raised_at 범위)에 근거해 senior-dba가 결정. 근거 없는 인덱스 금지.
  • 롤백: 실패 시 역방향 DDL DROP TABLE alerts.

의존

  • 없음 (wave 1)

다이어그램

클래스 의존

flowchart LR
    MIG["V42__create_alerts.sql"] --> TBL["alerts 테이블"]
    RepoImpl["AlertRepositoryImpl (BE-03)"] --> TBL

테스트 케이스

  • 로컬 MySQL 8.0에서 기존 마이그레이션 → V42 순서로 오류 없이 적용된다.
  • analysis TEXT 컬럼에 JSON 문자열을 저장·조회해도 손실이 없다.
  • raised_at이 마이크로초 정밀도(DATETIME(6))로 저장된다.
  • 역방향 DDL(DROP TABLE alerts) 실행 시 다른 테이블에 영향이 없다.