# 디지털트윈 아키텍처 v4

## 변경사항 (v3 → v4)

| 구분 | v3 | v4 |
| :--- | :--- | :--- |
| OTA 업데이트 | 개념만 존재 | Fleet Manager + MQTT 구현 |
| 디바이스 관리 | 없음 | Device Registry 추가 |
| 상태 모니터링 | 없음 | Heartbeat + Metrics 추가 |
| 원격 제어 | 없음 | MQTT 기반 명령 추가 |
| Agent | 없음 | Fleet Agent 추가 |

---

## Mermaid 다이어그램

```mermaid
---
config:
  layout: dagre
---
flowchart BT
 subgraph Global_Platform["☁️ Vexplor 글로벌 플랫폼"]
    direction TB
        AAS_Dashboard["<b>💻 AAS 통합 대시보드</b><br>(React/Next.js)<br>• 중앙 모니터링<br>• Fleet 관리 UI"]
        Global_API["<b>🌐 글로벌 API 게이트웨이</b><br>• 사용자 인증 (Auth)<br>• 고객사 라우팅<br>• Fleet API"]
        
        subgraph Fleet_System["🎛️ Fleet Management"]
            Fleet_Manager["<b>📊 Fleet Manager</b><br>• Device Registry<br>• 배포 오케스트레이션<br>• 상태 모니터링"]
            MQTT_Broker["<b>📡 MQTT Broker</b><br>(Mosquitto/EMQX)<br>• 실시간 통신<br>• 10,000+ 연결"]
            Monitoring["<b>📈 Monitoring</b><br>(Prometheus/Grafana)<br>• 메트릭 수집<br>• 알림"]
        end
        
        Update_Server["<b>🚀 배포/업데이트 매니저</b><br>• Docker 이미지 레지스트리 (Harbor)<br>• 버전 관리<br>• Canary 배포"]
  end

 subgraph Local_Server["스피폭스 사내 서버 (Local Server)"]
        Fleet_Agent_A["<b>🤖 Fleet Agent</b><br>• MQTT 연결<br>• Heartbeat (30초)<br>• 원격 명령 실행<br>• Docker 관리"]
        VEX_Engine["<b>VEX Flow 엔진</b><br>데이터 수집/처리"]
        Customer_DB[("<b>사내 통합 DB</b><br>(모든 데이터 보유)")]
        Watchtower_A["<b>🐋 Watchtower</b><br>이미지 자동 업데이트"]
  end

 subgraph Edge_Internals["🖥️ 엣지 디바이스 (Store & Forward)"]
        Edge_Collector["<b>수집/가공</b><br>(Python)"]
        Edge_Buffer[("<b>💾 로컬 버퍼</b><br>(TimescaleDB)<br>단절 시 임시 저장")]
        Edge_Sender["<b>📤 전송 매니저</b><br>(Priority Queue)"]
        Edge_Retry_Queue[("<b>🕒 재전송 큐</b><br>(SQLite/File)")]
  end

 subgraph Factory_A["🏭 스피폭스 공장 현장 (Factory Floor)"]
        Edge_Internals
        PLC_A["PLC / 센서"]
  end

 subgraph Customer_A["🏢 고객사 A: 스피폭스 (사내망)"]
        Local_Server
        Factory_A
  end

 subgraph Local_Server_B["고객사 B 사내 서버"]
        Fleet_Agent_B["<b>🤖 Fleet Agent</b>"]
        Watchtower_B["<b>🐋 Watchtower</b>"]
  end

 subgraph Customer_B["🏭 고객사 B (확장 예정)"]
        Local_Server_B
  end

 subgraph Local_Server_N["고객사 N 사내 서버"]
        Fleet_Agent_N["<b>🤖 Fleet Agent</b>"]
  end

 subgraph Customer_N["🏭 고객사 N (10,000개)"]
        Local_Server_N
  end

    %% 대시보드 연결
    AAS_Dashboard <--> Global_API
    AAS_Dashboard <--> Fleet_Manager
    
    %% Fleet System 내부 연결
    Fleet_Manager <--> MQTT_Broker
    Fleet_Manager <--> Monitoring
    Fleet_Manager <--> Update_Server
    
    %% 공장 내부 연결
    PLC_A <--> Edge_Collector
    Edge_Collector --> Edge_Buffer
    Edge_Buffer --> Edge_Sender
    Edge_Sender -- ① 정상 전송 --> VEX_Engine
    Edge_Sender -- ② 전송 실패 시 --> Edge_Retry_Queue
    Edge_Retry_Queue -. ③ 네트워크 복구 시 재전송 .-> Edge_Sender
    VEX_Engine <--> Customer_DB
    
    %% Fleet Agent 연결 (MQTT - Outbound Only)
    Fleet_Agent_A == 📡 MQTT (Heartbeat/명령) ==> MQTT_Broker
    Fleet_Agent_B == 📡 MQTT ==> MQTT_Broker
    Fleet_Agent_N == 📡 MQTT ==> MQTT_Broker
    
    %% Agent ↔ 로컬 컴포넌트
    Fleet_Agent_A <--> VEX_Engine
    Fleet_Agent_A <--> Watchtower_A
    Fleet_Agent_A <--> Customer_DB
    
    %% OTA 업데이트 (Pull 방식)
    Update_Server -. 이미지 배포 .-> Watchtower_A
    Update_Server -. 이미지 배포 .-> Watchtower_B
    Watchtower_A -. 컨테이너 업데이트 .-> VEX_Engine
    
    %% 엣지 업데이트
    VEX_Engine -. 엣지 업데이트 .-> Edge_Collector

    %% 스타일
    AAS_Dashboard:::user
    Global_API:::global
    Update_Server:::global
    Fleet_Manager:::fleet
    MQTT_Broker:::fleet
    Monitoring:::fleet
    VEX_Engine:::localServer
    Customer_DB:::localServer
    Fleet_Agent_A:::agent
    Fleet_Agent_B:::agent
    Fleet_Agent_N:::agent
    Watchtower_A:::agent
    Watchtower_B:::agent
    Edge_Collector:::edge
    Edge_Buffer:::edgedb
    Edge_Sender:::edge
    Edge_Retry_Queue:::fail
    PLC_A:::factory

    classDef factory fill:#e1f5fe,stroke:#01579b,stroke-width:2px
    classDef edge fill:#fff9c4,stroke:#fbc02d,stroke-width:2px
    classDef edgedb fill:#fff9c4,stroke:#fbc02d,stroke-width:2px,stroke-dasharray: 5 5
    classDef localServer fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
    classDef global fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
    classDef user fill:#ffebee,stroke:#c62828,stroke-width:2px
    classDef fleet fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
    classDef agent fill:#fff3e0,stroke:#ef6c00,stroke-width:2px
    classDef fail fill:#ffebee,stroke:#c62828,stroke-width:2px,stroke-dasharray: 5 5

    linkStyle 8 stroke:#2e7d32,stroke-width:2px,fill:none
    linkStyle 9 stroke:#c62828,stroke-width:2px,fill:none
    linkStyle 10 stroke:#fbc02d,stroke-width:2px,stroke-dasharray: 5 5,fill:none
```

---

## 추가된 컴포넌트 설명

### 1. Fleet Management (신규)

| 컴포넌트 | 역할 |
| :--- | :--- |
| **Fleet Manager** | 10,000개 디바이스 등록/관리, 배포 오케스트레이션 |
| **MQTT Broker** | 실시간 양방향 통신 (Outbound Only 유지) |
| **Monitoring** | Prometheus + Grafana, 메트릭 수집 & 알림 |

### 2. Fleet Agent (각 공장 서버에 설치)

| 기능 | 설명 |
| :--- | :--- |
| **MQTT 연결** | 글로벌 플랫폼과 상시 연결 (Outbound) |
| **Heartbeat** | 30초마다 상태 보고 |
| **원격 명령** | 업데이트, 재시작, 설정 변경 수신 |
| **Docker 관리** | 컨테이너 상태 모니터링 & 제어 |

### 3. Watchtower (기존 유지)

- Harbor에서 새 이미지 자동 Pull
- Fleet Agent의 명령으로 즉시 업데이트 가능

---

## 통신 흐름 비교

### v3 (기존)
```
보안 커넥터 ←→ 글로벌 API (양방향 터널)
```

### v4 (신규)
```
Fleet Agent ──→ MQTT Broker (Outbound Only)
              ←── 명령 수신 (Subscribe)
              ──→ 상태 보고 (Publish)

Watchtower ──→ Harbor (Pull Only)
```

**장점:**
- 방화벽 Inbound 규칙 불필요
- 10,000개 동시 연결 가능
- 실시간 명령 전달

---

## 데이터 흐름

```
[공장 → 글로벌]
PLC → 엣지 → VEX Flow → Fleet Agent → MQTT → Fleet Manager → Dashboard

[글로벌 → 공장]
Dashboard → Fleet Manager → MQTT → Fleet Agent → Docker/VEX Flow
```

