[BE-22] 리스크 단계 전환 이력 기록
이 티켓은 BE-25 로 흡수됐습니다 — 스키마는 DB-02, 기록 로직은 BE-25 가 소유합니다. 이 파일은 이력 보존용이며 착수 대상이 아닙니다.
작업 내용 (설계 의도)
변경 사항
PRD FR-38은 “단계 전환 이력을 기록한다”를 요구하는데, 현재 스키마는 auto_trading_policies.tier_changed_at 한 컬럼뿐이라 최종 변경 시각만 남는다(wave 3 리뷰에서 발견). 승급·강등이 반복되면 이전 기록이 덮어써진다.
이력이 필요한 이유는 사다리 자체가 검증 대상이기 때문이다. “T2에서 강등된 뒤 다시 승급했는데 또 강등됐다”는 패턴은 사다리 기준이 잘못됐다는 신호인데, 최종 시각만으로는 그 패턴이 보이지 않는다. 승급 판정이 운영 지표 기반이므로(수익률이 아님) 그 지표가 실제로 좋은 예측자인지 사후에 평가하려면 전환 시점과 그때의 지표가 함께 남아야 한다.
risk_tier_transitions 테이블을 만들고 전환마다 이전 단계·다음 단계·사유·판정 시점 지표를 남긴다.
무중단 배포: 신규 테이블 추가는 기존 코드에 영향이 없다. tier_changed_at은 제거하지 않는다 — 현재 코드가 읽고 있고, 이력 테이블과 중복이지만 제거는 별도 단계다(expand-contract).
롤백: 역방향 DDL로 테이블 제거. 아무도 읽지 않는 시점에 되돌리기가 안전하다.
의존
- BE-12 (단계 평가 도메인 서비스)
다이어그램
처리 흐름
sequenceDiagram participant Tier as RiskTierPromotionDomainService participant Policy as AutoTradingPolicy participant Hist as RiskTierTransitionRepository Tier->>Policy: demoteTier() Tier->>Hist: save(T2 to T1, MAX_DRAWDOWN, 지표)
클래스 의존
flowchart LR Tier[RiskTierPromotionDomainService] --> Repo[RiskTierTransitionRepository] Repo -.->|implements| Impl[RiskTierTransitionRepositoryImpl] Impl --> Table[(risk_tier_transitions)]
테스트 케이스
- 강등 시 이전 단계·다음 단계·사유가 이력에 남는다.
- 승급 확정 시에도 이력이 남는다(판정만 한 시점은 남기지 않는다).
- 판정 시점의 운영 지표가 함께 보존된다.
- 같은 단계로의 전환(T1에서 MDD 경고)은 이력을 만들지 않는다.
- 이력 조회가 시간 역순으로 반환된다.
- 마이그레이션 적용 후
tier_changed_at이 그대로 유지된다(하위 호환, TestContainers MySQL).