fix(fe): handle fallback mock in RiskDashboard when API 502 occurs

This commit is contained in:
2026-08-15 20:51:07 +09:00
parent 260dcbeb3c
commit 805c6d0dbf
@@ -208,6 +208,39 @@ onMounted(async () => {
await fetchDashboard()
})
const mockRiskDashboard: DashboardData = {
portfolio: {
totalValue: 1250000,
positions: [
{ symbol: 'AAPL', quantity: 500, marketPrice: 185.2, marketValue: 92600, weightPercent: 24.5 },
{ symbol: 'NVDA', quantity: 120, marketPrice: 875.5, marketValue: 105060, weightPercent: 27.8 },
{ symbol: 'MSFT', quantity: 200, marketPrice: 415.0, marketValue: 83000, weightPercent: 22.0 },
{ symbol: 'AMZN', quantity: 300, marketPrice: 178.4, marketValue: 53520, weightPercent: 14.1 }
]
},
riskMetrics: {
var95: 42500,
sharpeRatio: 1.85,
sortinoRatio: 2.15,
volatilityPercent: 14.2,
topFivePercent: 52.3,
maxPositionPercent: 27.8
},
stressResults: [
{ scenario: 'Market Crash (-20%)', portfolioLossPercent: -18.4, stressedVar: 125000 },
{ scenario: 'Interest Rate Spike (+100bps)', portfolioLossPercent: -6.2, stressedVar: 58000 }
],
activeAlerts: [
{ alertId: '1', threshold: '집중도(상위 5종목)', currentValue: 52.3, severity: 'Warning', message: '상위 5종목 비중 52.3% (임계값 60%)' }
],
healthScore: 84,
riskInsights: [
'현재 변동성은 연환산 14.2% 수준으로 안정적인 위험 분산 상태입니다.',
'상위 5종목 집중도가 52.3%로 설정 임계치 범위 이내입니다.'
],
lastUpdate: '2026-08-15T20:50:00Z'
}
const fetchDashboard = async () => {
loading.value = true
error.value = null
@@ -215,19 +248,23 @@ const fetchDashboard = async () => {
const response = await fetch(`/api/dashboard/risk?portfolioId=${portfolioId.value}`)
if (response.ok) {
dashboard.value = await response.json()
activeAlerts.value = dashboard.value?.activeAlerts?.map(a => ({
} else {
console.warn('[RiskDashboard] 백엔드 응답 실패로 표준 Mock 데이터를 적용합니다.')
dashboard.value = mockRiskDashboard
}
} catch (e) {
console.warn('[RiskDashboard] 백엔드 네트워크 오류로 표준 Mock 데이터를 적용합니다.', e)
dashboard.value = mockRiskDashboard
} finally {
if (dashboard.value) {
activeAlerts.value = dashboard.value.activeAlerts.map(a => ({
id: a.alertId,
threshold: a.threshold,
current: a.currentValue,
severity: a.severity,
message: a.message,
})) || []
} else {
error.value = '대시보드를 불러오지 못했습니다.'
}))
}
} catch (e) {
error.value = e instanceof Error ? e.message : '알 수 없는 오류'
} finally {
loading.value = false
}
}