(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

개요


Layers

(1) Presentation Layer


(2) Application Layer

FastAPI Backend

Redis (Cache Only)