(Ranking · Portfolio)"]
end
%% =========================
%% Application Layer
%% =========================
subgraph L2["Application Layer"]
API["FastAPI Backend
ETF API Service"]
Cache["Redis
(Read Cache Only)"]
end
%% =========================
%% Data Processing Layer
%% =========================
subgraph L3["Data Processing Layer"]
Scheduler["Batch Scheduler
(Automated Job)"]
MSFetcher["Morningstar API Fetcher
(Auto Collection)"]
Processor["ETF Data Processor
(Validate · Extract · Load)"]
Metric["Metrics Engine
(Return · Risk · Portfolio)"]
end
%% =========================
%% Data Layer
%% =========================
subgraph L4["Data Layer"]
DB[("MySQL / Aurora
ETF Mas">
(Ranking · Portfolio)"]
end
%% =========================
%% Application Layer
%% =========================
subgraph L2["Application Layer"]
API["FastAPI Backend
ETF API Service"]
Cache["Redis
(Read Cache Only)"]
end
%% =========================
%% Data Processing Layer
%% =========================
subgraph L3["Data Processing Layer"]
Scheduler["Batch Scheduler
(Automated Job)"]
MSFetcher["Morningstar API Fetcher
(Auto Collection)"]
Processor["ETF Data Processor
(Validate · Extract · Load)"]
Metric["Metrics Engine
(Return · Risk · Portfolio)"]
end
%% =========================
%% Data Layer
%% =========================
subgraph L4["Data Layer"]
DB[("MySQL / Aurora
ETF Mas">
(Ranking · Portfolio)"]
end
%% =========================
%% Application Layer
%% =========================
subgraph L2["Application Layer"]
API["FastAPI Backend
ETF API Service"]
Cache["Redis
(Read Cache Only)"]
end
%% =========================
%% Data Processing Layer
%% =========================
subgraph L3["Data Processing Layer"]
Scheduler["Batch Scheduler
(Automated Job)"]
MSFetcher["Morningstar API Fetcher
(Auto Collection)"]
Processor["ETF Data Processor
(Validate · Extract · Load)"]
Metric["Metrics Engine
(Return · Risk · Portfolio)"]
end
%% =========================
%% Data Layer
%% =========================
subgraph L4["Data Layer"]
DB[("MySQL / Aurora
ETF Mas">
flowchart TB
%% =========================
%% Presentation Layer
%% =========================
subgraph L1["Presentation Layer"]
FE["Web / Dashboard<br/>(Ranking · Portfolio)"]
end
%% =========================
%% Application Layer
%% =========================
subgraph L2["Application Layer"]
API["FastAPI Backend<br/>ETF API Service"]
Cache["Redis<br/>(Read Cache Only)"]
end
%% =========================
%% Data Processing Layer
%% =========================
subgraph L3["Data Processing Layer"]
Scheduler["Batch Scheduler<br/>(Automated Job)"]
MSFetcher["Morningstar API Fetcher<br/>(Auto Collection)"]
Processor["ETF Data Processor<br/>(Validate · Extract · Load)"]
Metric["Metrics Engine<br/>(Return · Risk · Portfolio)"]
end
%% =========================
%% Data Layer
%% =========================
subgraph L4["Data Layer"]
DB[("MySQL / Aurora<br/>ETF Master · Price · Returns · Metrics")]
end
%% =========================
%% External Source
%% =========================
subgraph EXT["External Data Source"]
MS["Morningstar API"]
end
%% =========================
%% Flows
%% =========================
FE -->|REST API| API
API -->|Read Cache| Cache
API -->|Cache Miss / Read| DB
Scheduler --> MSFetcher
MSFetcher -->|Raw ETF Data| Processor
Processor -->|Validated & Extracted Data| DB
Metric -->|Calculated Metrics| DB
MS --> MSFetcher