DB migration과 테스트를 단순 목록이 아니라 운영 이슈를 고정한 근거로 정리한다.

DB Test 근거 맵
| 그룹 | Migration | 운영상 의미 |
|---|---|---|
| 초기 구조 | 기본 테이블 구성 | 주문/포지션/자산 기본 구조 |
| 설정 관리 | 운영 설정 테이블 | live BUY, provider, scheduler 설정을 DB로 관리 |
| 관심 종목 | Watchlist 저장 구조 | watchlist 기반 분석 대상 관리 |
| AI 분석 로그 | AI 판단 로그 저장 | AI 판단과 근거를 나중에 추적 |
| 주문 사유 | 주문 사유 기록 | 주문이 왜 발생했는지 저장 |
| 분석-주문 연결 | 분석 결과와 주문 연결 | 주문과 AI 분석 결과 연결 |
| 정확도 추적 | 사후 정확도 추적 필드 | AI 판단 결과를 사후 비교할 수 있는 필드 |
| paper/live 분리 | 실전/모의 주문 구분 | 실전 주문과 모의 주문 분리 |
| 채팅 이력 | AI 뱅커 대화 저장 | AI 뱅커 대화 이력 저장 |
| 스냅샷 | 포트폴리오 스냅샷 저장 | 포트폴리오 상태를 시점별로 저장 |
| 세션 메타 | 채팅 세션 상태 추적 | 채팅 세션 단위 상태 추적 |
| 그룹 | 테스트 | 검증 기준 |
|---|---|---|
| 주문 안전 | live BUY lock, entry gate, buy weight cap 검증 | 자동매매 주문 위험 검증 |
| Provider | provider priority, blocked provider, fallback 검증 | AI provider 장애 대응 검증 |
| Dashboard | live portfolio 실패 시 snapshot fallback 검증 | 대시보드 장애 대응 검증 |
| Portfolio | 스냅샷 기반 briefing과 오류 매핑 검증 | 포트폴리오 설명과 오류 매핑 검증 |
| Backtest | 실전 반영 전 정책 검증 | 정책 변경 전 검증 |
| 기준 | 이유 |
|---|---|
| migration은 기능 추가 기록이 아니라 운영 상태의 기록 | 어떤 문제가 생겨서 어떤 상태를 저장하게 됐는지 추적 |
| 테스트는 수익률 보장이 아니라 위험 경계 검증 | 실전 주문, provider 장애, snapshot fallback을 고정 |
| 주문/분석/스냅샷은 분리 저장 | 사후에 어떤 판단과 상태가 있었는지 확인 |
<aside> 💡 이 문서가 설명하는 것: DB Migration과 테스트 근거
</aside>
| 항목 | 내용 |
|---|---|
| 관련 운영 리스크 | 운영 상태를 저장하지 않으면 사후 추적이 불가능 |
| 대표 구현 근거 | system_configs, ai_analysis_logs, is_paper, snapshots |
| 관련 테스트 | executor/provider/dashboard/portfolio/backtest tests |
<aside> 🧪 DB/Test 근거는 내부 경로가 아니라, 운영 판단을 재현할 수 있는 저장 구조와 검증 동작만 남겼다.
</aside>
class SystemConfig(Base):
__tablename__ = "system_configs"
config_key: Mapped[str] = mapped_column(String, unique=True, index=True)
config_value: Mapped[str] = mapped_column(String, nullable=False)
class AIAnalysisLog(Base):
__tablename__ = "ai_analysis_logs"
symbol: Mapped[str]
decision: Mapped[str]
confidence: Mapped[int]
recommended_weight: Mapped[int]
accuracy_label: Mapped[str | None]
class PortfolioSnapshot(Base):
__tablename__ = "portfolio_snapshots"
total_net_worth: Mapped[float]
total_pnl: Mapped[float]
snapshot_data: Mapped[list[dict]] = mapped_column(JSON)