Navigation
Software Design Specification - System Architecture
2. System Architectureβ
2.1 High-Level Architectureβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Client Layer β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β Web Browser β β Mobile β β External β β
β β (React) β β App β β API β β
β β β β (Phase 3+) β β Clients β β
β ββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββ¬ββββββββ β
βββββββββββΌβββββββββββββββββββΌβββββββββββββββββββΌββββββββββββββββββββ
β HTTPS β HTTPS β HTTPS
βΌ βΌ βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Load Balancer Layer β
β (NGINX / Cloud LB) β
βββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββ΄ββββββββββββββββββββ
βΌ βΌ
βββββββββββββββββββββββββββ βββββββββββββββββββββββββββ
β Frontend Service β β Backend API Service β
β (Static Files) β β (FastAPI) β
β β β β
β - React App Bundle β β - REST API Endpoints β
β - Static Assets β β - Business Logic β
β - Service Worker β β - Authentication β
βββββββββββββββββββββββββββ βββββββββ¬ββββββββββββββββββ
β
ββββββββββββββββββββββββββΌβββββββββββββββββββββββββ
βΌ βΌ βΌ
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β Cache Layer β β Database β β Task Queue β
β (Redis) β β (PostgreSQL β β (Celery) β
β β β TimescaleDB) β β β
β - Session β β β β - Background β
β - Query Cache β β - Stocks β β Jobs β
β - Rate Limits β β - Prices β β - Alerts β
βββββββββββββββββββ β - Users β β - Reports β
β - Portfolios β βββββββββββββββββββ
βββββββββββββββββββ
β²
β Updates
β
ββββββββββββββββββββββ΄βββββββββββββββββββββ
βΌ βΌ
βββββββββββββββββββ βββββββββββββββββββ
β Data Pipeline β β External β
β (Airflow) βββββββββββββββββββββββΊβ Data APIs β
β β β β
β - Price β β - KRX API β
β Ingestion β β - F&Guide API β
β - Indicator β β - OAuth β
β Calculation β β Providers β
βββββββββββββββββββ βββββββββββββββββββ
2.2 Architectural Patternsβ
2.2.1 Layered Architectureβ
Presentation Layer (Frontend)
- React components
- State management (Zustand)
- API client services
- UI/UX interactions
Application Layer (Backend API)
- REST API endpoints
- Request validation
- Business logic orchestration
- Response formatting
Domain Layer
- Core business entities (Stock, Portfolio, Alert)
- Business rules and validation
- Domain services
Data Access Layer
- Database repositories
- Query builders
- ORM (SQLAlchemy)
- Cache abstraction
Infrastructure Layer
- External API integrations
- Email notifications
- File storage
- Monitoring/logging
2.2.2 Microservices-Ready Monolithβ
Current implementation uses a modular monolith architecture that can be split into microservices if needed:
Module Boundaries:
βββ Stock Service (read-only public data)
βββ User Service (authentication, profiles)
βββ Portfolio Service (user-specific data)
βββ Alert Service (notifications)
βββ Screening Service (complex queries)
βββ Admin Service (internal operations)
Each module has:
- Independent database tables
- Clear API boundaries
- Minimal cross-module dependencies
2.3 Component Interactionβ
2.3.1 Stock Screening Flowβ
βββββββββββ
β Browser β
ββββββ¬βββββ
β 1. POST /v1/screen (filters)
βΌ
βββββββββββββββ
β NGINX β
β (Rate Limit)β
ββββββ¬βββββββββ
β 2. Forward request
βΌ
βββββββββββββββββββ
β FastAPI Backend β
β β
β 3. Check cache ββΌββββββββΊ βββββββββββ
β (Redis) β β Redis β
ββββββ¬βββββββββββββ βββββββββββ
β 4. Cache miss
β
β 5. Build query
βΌ
ββββββββββββββββββββ
β PostgreSQL β
β β
β 6. Execute query β
β on screening_ β
β view (indexed)β
ββββββ¬ββββββββββββββ
β 7. Results
βΌ
βββββββββββββββββββ
β FastAPI Backend β
β β
β 8. Cache resultsββββββββββΊ Redis (TTL: 5min)
β 9. Format JSON β
ββββββ¬βββββββββββββ
β 10. Response
βΌ
βββββββββββ
β Browser β
βββββββββββ
2.3.2 Data Pipeline Flowβ
18:00 KST (Market Close)
β
βΌ
βββββββββββββββββββββββββββββββββ
β Airflow Scheduler β
β Triggers: daily_price_ β
β ingestion DAG β
βββββββββββββ¬ββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββ
β Task 1: Fetch KRX Prices β
β - HTTP GET to KRX API β
β - Receive JSON/XML data β
βββββββββββββ¬ββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββ
β Task 2: Validate Data β
β - Check price relationships β
β - Verify completeness β
β - Flag invalid records β
βββββββββββββ¬ββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββ
β Task 3: Load to Database β
β - UPSERT to daily_prices β
β - Batch commit (1000 rows) β
βββββββββββββ¬ββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββ
β Task 4: Check Completeness β
β - Verify 95%+ stocks updated β
β - Alert if threshold missed β
βββββββββββββ¬ββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββ
β Task 5: Trigger Indicator β
β Calculation DAG β
βββββββββββββ¬ββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββ
β Indicator Calculation DAG β
β - Calculate 200+ indicators β
β - Update screening views β
β - Duration: ~20 minutes β
βββββββββββββββββββββββββββββββββ
2.4 Data Flow Diagramsβ
2.4.1 User Authentication Flowβ
βββββββββ βββββββββββ ββββββββββββ
β User β β Backend β β Database β
βββββ¬ββββ ββββββ¬βββββ ββββββ¬ββββββ
β β β
β POST /auth/login β β
β {email, password} β β
ββββββββββββββββββββββββββββββΊβ β
β β β
β β SELECT * FROM users β
β β WHERE email = ? β
β βββββββββββββββββββββββββββββββΊβ
β β β
β β Return user row β
β ββββββββββββββββββββββββββββββββ€
β β β
β β bcrypt.verify(password, β
β β user.password_hash) β
β β β
β β Generate JWT tokens: β
β β - access_token (15min) β
β β - refresh_token (30 days) β
β β β
β β INSERT INTO refresh_tokens β
β βββββββββββββββββββββββββββββββΊβ
β β β
β 200 OK β β
β {access_token, β β
β refresh_token, user} β β
βββββββββββββββββββββββββββββββ€ β
β β β
β Subsequent requests: β β
β Authorization: Bearer β β
β <access_token> β β
ββββββββββββββββββββββββββββββΊβ β
β β β
β β Verify JWT signature β
β β Check expiry β
β β β
β 200 OK {data} β β
βββββββββββββββββββββββββββββββ€ β
β β β