DDD ์ํคํ ์ฒ ๊ธฐ๋ฐ ํ๋ก๋์ ๊ธ ์ํธํํ ์๋๋งค๋งค ์์คํ
๐ DDD ๋ฆฌํฉํ ๋ง 90% ์๋ฃ! ๊ฒฌ๊ณ ํ ์ํคํ ์ฒ์ ํ๋์ ๊ฐ๋ฐ ํ๊ฒฝ์ผ๋ก ๋ฌด์ฅํ ์์ ์ ์ธ ์๋๋งค๋งค ์์คํ
๐ WebSocket v5 Enterprise๊ธ ์ฑ๋ฅ ๋ฌ์ฑ! 189๊ฐ ์ ์ฒด KRW ๋ง์ผ ๋์ ์ฒ๋ฆฌ, 82.9 msg/s ์์ ์ ์ฑ๋ฅ ์ ์ฆ
- ๐๏ธ DDD 4๊ณ์ธต ์ํคํ ์ฒ: Domain ์์์ฑ + Infrastructure ๋ถ๋ฆฌ๋ก ํ์ฅ์ฑ ๊ทน๋ํ
- ๐ Enterprise๊ธ WebSocket v5: 189๊ฐ KRW ๋ง์ผ ๋์ ์ค์๊ฐ ์ฒ๋ฆฌ (๐ฅ Excellence ๋ฑ๊ธ)
- ๐ 7๊ท์น ์ ๋ต ์์คํ : RSI, ๋ถํ๊ธฐ, ์ต์ , ํธ๋ ์ผ๋ง ์คํ, ๋ฌผํ๊ธฐ, ๊ธ๋ฝ/๊ธ๋ฑ ๊ฐ์ง
- ๐ฏ ํธ๋ฆฌ๊ฑฐ ๋น๋: ์ง๊ด์ ์ธ GUI๋ก ๋ณต์กํ ๋งค๋งค ์กฐ๊ฑด ๊ตฌ์ฑ
- โก ์ค์๊ฐ ์ฐ๋: Upbit API + WebSocket์ผ๋ก ๋ฐ๋ฆฌ์ด ๋จ์ ๋ฐ์
- ๐ ํ๋ก๋์ ๋ณด์: ์ํธํ๋ API ํค ๊ด๋ฆฌ + Dry-Run ๊ธฐ๋ณธ ๋ชจ๋
# PowerShell (Windows ๊ถ์ฅ) git clone https://github.com/invisible0000/upbit-autotrader-vscode.git cd upbit-autotrader-vscode # ํ๋์ ๊ฐ์ํ๊ฒฝ ์ค์ python -m venv .venv .venv\Scripts\Activate.ps1 # ์์กด์ฑ ์ค์น (์ค์ ํ๊ฒฝ ๊ฒ์ฆ๋จ) pip install -r requirements.txt# GUI ์คํ (์ถ์ฒ) - 7๊ท์น ์ ๋ต ์ฆ์ ํ์ธ ๊ฐ๋ฅ python run_desktop_ui.py- GUI โ ์ค์ โ API ํค ํญ์์ ์์ ํ๊ฒ ์ค์
- ๋๋ ํ๊ฒฝ๋ณ์:
$env:UPBIT_ACCESS_KEY,$env:UPBIT_SECRET_KEY
๐ upbit_auto_trading/ โโโ ๐จ ui/ # Presentation Layer โ โโโ desktop/ # PyQt6 GUI โ โโโ common/ # ๊ณตํต UI ์ปดํฌ๋ํธ โโโ ๐ง application/ # Application Layer โ โโโ services/ # ๋น์ฆ๋์ค ์๋น์ค โ โโโ use_cases/ # ์ ์ค์ผ์ด์ค โโโ ๐ domain/ # Domain Layer (์์) โ โโโ entities/ # ๋๋ฉ์ธ ์ํฐํฐ โ โโโ value_objects/ # ๊ฐ ๊ฐ์ฒด โ โโโ services/ # ๋๋ฉ์ธ ์๋น์ค โโโ ๐ infrastructure/ # Infrastructure Layer โโโ repositories/ # ๋ฐ์ดํฐ ์ ๊ทผ โโโ services/ # ์ธ๋ถ ์๋น์ค โโโ api/ # API ์ฐ๋ ๐ config/ # ์ค์ ๊ด๋ฆฌ ๐ data/ # 3-DB ๋ถ๋ฆฌ ์ค๊ณ โโโ settings.sqlite3 # ์ฑ ์ค์ โโโ strategies.sqlite3 # ์ ๋ต ๋ฐ์ดํฐ โโโ market_data.sqlite3 # ์์ฅ ๋ฐ์ดํฐ | ๊ท์น | ์ค๋ช | ์ํ |
|---|---|---|
| RSI ๊ณผ๋งค๋ ์ง์ | RSI < 30 ์ ๋งค์ ์ง์ | โ |
| ์์ต์ ๋ถํ๊ธฐ | ์์ต๋ฅ 5% ์ ์ถ๊ฐ ๋งค์ | โ |
| ๊ณํ๋ ์ต์ | ๋ชฉํ๊ฐ ๋๋ฌ ์ ์๋ ๋งค๋ | โ |
| ํธ๋ ์ผ๋ง ์คํ | ์ต๊ณ ๊ฐ ๋๋น -3% ์ ๋งค๋ | โ |
| ํ๋ฝ์ ๋ฌผํ๊ธฐ | -10% ํ๋ฝ ์ ํ๋จ๊ฐ ๋ฎ์ถ๊ธฐ | โ |
| ๊ธ๋ฝ ๊ฐ์ง | 5๋ถ๊ฐ -15% ๊ธ๋ฝ ์ ์์ | โ |
| ๊ธ๋ฑ ๊ฐ์ง | 5๋ถ๊ฐ +20% ๊ธ๋ฑ ์ ๋ถ๋ถ๋งค๋ | โ |
- ๐ฅ๏ธ Desktop GUI: PyQt6 ๊ธฐ๋ฐ ๋ค์ดํฐ๋ธ ์ฑ
- ๐ ์ค์๊ฐ ์ฐจํธ: matplotlib + ํ๊ธ ํฐํธ ์ง์
- โ๏ธ ์ค์ ๊ด๋ฆฌ: ์ง๊ด์ ์ธ ํญ ๊ธฐ๋ฐ UI
- ๐ ๋ฐฑํ ์คํ : ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ก ์ ๋ต ๊ฒ์ฆ
- ๐ก๏ธ Dry-Run ๊ธฐ๋ณธ: ์ค๊ฑฐ๋ ์ ๋ฐ๋์ 2๋จ๊ณ ํ์ธ
- ๐ ์ํธํ ์ ์ฅ: API ํค SQLite ์ํธํ ๋ณด๊ด
โ ๏ธ Rate Limit: ์ ๋นํธ API ํธ์ถ ์ ํ ์ค์- ๐ฐ ์๊ธ ๊ด๋ฆฌ: ์ด ์์ฐ ๋๋น ์ต๋ ํฌ์ ๋น์จ ์ ํ
- Python: 3.13+ (ํ์ฌ ํ๊ฒฝ ๊ฒ์ฆ๋จ)
- OS: Windows 10/11 (PowerShell ๊ถ์ฅ)
- ๋ฉ๋ชจ๋ฆฌ: ์ต์ 8GB RAM
- ์ ์ฅ๊ณต๊ฐ: 2GB ์ฌ์ ๊ณต๊ฐ
- ๋คํธ์ํฌ: ์์ ์ ์ธ ์ธํฐ๋ท ์ฐ๊ฒฐ
PyQt6==6.9.1 # GUI ํ๋ ์์ํฌ matplotlib==3.10.5 # ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ pandas==2.3.1 # ๋ฐ์ดํฐ ๋ถ์ numpy==2.3.2 # ์์น ์ฐ์ฐ aiohttp==3.12.15 # ๋น๋๊ธฐ HTTP requests==2.32.4 # HTTP ํด๋ผ์ด์ธํธ SQLAlchemy==2.0.42 # ORM websocket-client==1.6.3 # WebSocket cryptography==45.0.5 # ์ํธํ PyJWT==2.10.1 # JWT ํ ํฐ loguru==0.7.3 # ๋ก๊น
psutil==7.0.0 # ์์คํ
๋ชจ๋ํฐ๋ง # ์ ์ฒด ํ
์คํธ (pytest ๊ธฐ๋ฐ) pytest -q # ์ปค๋ฒ๋ฆฌ์ง ํฌํจ pytest --cov=upbit_auto_trading # ํน์ ๋๋ฉ์ธ ํ
์คํธ pytest tests/domain/ -v# ๊ณ์ธต ์๋ฐ ๊ฒ์ฌ (PowerShell) Get-ChildItem upbit_auto_trading/domain -Recurse -Include *.py | Select-String -Pattern "import sqlite3|import requests|from PyQt6" # ๋ก๊น
ํ๊ฒฝ๋ณ์ ์ค์ $env:UPBIT_CONSOLE_OUTPUT = "true" $env:UPBIT_LOG_SCOPE = "verbose" # DB ์ํ ํ์ธ python tools/super_db_table_viewer.py settings python tools/super_db_table_viewer.py strategies python tools/super_db_table_viewer.py market_dataWebSocket v5 Enterprise๊ธ ์ค์ฆ ์ฑ๊ณผ
- โ 189๊ฐ ์ ์ฒด KRW ๋ง์ผ ๋์ ์ค์๊ฐ ์ฒ๋ฆฌ
- โ 82.9 msg/s ์์ ์ ์ง์ ์ฒ๋ฆฌ ์๋
- โ 2,488๊ฐ ๋ฉ์์ง 30์ด๊ฐ ๋ฌด์ค๋จ ์ฒ๋ฆฌ
- โ 100% ์ฌ๋ณผ ์ปค๋ฒ๋ฆฌ์ง (189/189) ๋ฌ์ฑ
- ๐ ๐ฅ ENTERPRISE EXCELLENCE ๋ฑ๊ธ ์ธ์ฆ
- DDD ์ํคํ ์ฒ ๊ฐ์ด๋: 4๊ณ์ธต ์ค๊ณ ์์น
- ํธ๋ฆฌ๊ฑฐ ๋น๋ ๊ฐ์ด๋: 7๊ท์น ์ ๋ต ๊ตฌ์ฑ๋ฒ
- ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก : TDD + DDD ์ค์ฒ๋ฒ
- ๊ธฐ๋ณธ 7๊ท์น ์ ๋ต: ์ ๋ต๋ณ ์์ธ ์ค๋ช
- DB ์คํค๋ง: 3-DB ๋ถ๋ฆฌ ์ค๊ณ
- UI ๊ฐ์ด๋: PyQt6 ์ปดํฌ๋ํธ ์ฌ์ฉ๋ฒ
1. PyQt6 ์ค์น ์ค๋ฅ
# Windows์์ PyQt6 ์ฌ์ค์น pip uninstall PyQt6 PyQt6-Qt6 PyQt6-sip pip install PyQt6==6.9.1 --no-cache-dir2. aiohttp ๋ชจ๋ ์์
# API ์ฐ๊ฒฐ ํ์ ํจํค์ง pip install aiohttp==3.12.15 requests==2.32.43. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๊ธฐํ ํ์
# 3-DB ์๋ ์์ฑ (์ฑ ์คํ์ ์๋) python run_desktop_ui.py4. API ์ฐ๊ฒฐ ์คํจ
- GUI โ ์ค์ โ API ํค์์ ์ฐ๊ฒฐ ํ ์คํธ
- Upbit API ๊ถํ: ์์ฐ์กฐํ, ์ฃผ๋ฌธ์กฐํ, ์ฃผ๋ฌธํ๊ธฐ ํ์
- Rate Limit: ๋ถ๋น 100ํ ์ ํ ์ค์
# ์ค์๊ฐ ๋ก๊ทธ ๋ชจ๋ํฐ๋ง Get-Content -Path "logs\application.log" -Wait # ์ธ์
๋ณ ๋ก๊ทธ Get-ChildItem logs\ -Name "session_*.log" | Sort-Object -Descending- DDD 4๊ณ์ธต ์ํคํ ์ฒ ์์ฑ
- 7๊ท์น ์ ๋ต ์์คํ ๊ตฌํ
- ํ๋์ .venv ํ๊ฒฝ + VS Code ํตํฉ
- PyQt6 GUI + ์ค์๊ฐ ์ฐจํธ
- 3-DB ๋ถ๋ฆฌ ์ค๊ณ
- ์ํธํ๋ API ํค ๊ด๋ฆฌ
- Domain Services ์์ฑ
- Repository ํจํด ํ์ฅ
- ๋ฐฑํ ์คํ ์์ง ๊ณ ๋ํ
- ์ค์๊ฐ ์๋ฆผ ์์คํ
- ๋ฉํฐ ๊ฑฐ๋์ ์ง์ (๋ฐ์ด๋ธ์ค, ๋น์ธ)
- ๋จธ์ ๋ฌ๋ ๊ธฐ๋ฐ ์์ธก ๋ชจ๋ธ
- ๋ชจ๋ฐ์ผ ์ฑ ์ฐ๋
- ํด๋ผ์ฐ๋ ๋ฐฐํฌ
- Fork ์ด ์ ์ฅ์
- Feature ๋ธ๋์น ์์ฑ:
git checkout -b feature/amazing-feature - DDD ์์น ์ค์ํ์ฌ ๊ฐ๋ฐ
- ํ ์คํธ ์์ฑ ๋ฐ ํต๊ณผ ํ์ธ
- ์ปค๋ฐ:
git commit -m "โจ ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ" - Push:
git push origin feature/amazing-feature - Pull Request ์์ฑ
- Domain Layer: ์ธ๋ถ ์์กด์ฑ ๊ธ์ง
- Infrastructure Layer: ์ธ๋ถ ์๋น์ค ์ฐ๋๋ง
- Test First: TDD ๋ฐฉ์ ๊ฐ๋ฐ
- ํ๊ธ ์ปค๋ฐ: ๋ช ํํ ๋ณ๊ฒฝ์ฌํญ ์ค๋ช
MIT License Copyright (c) 2025 invisible0000 ์ด ์ํํธ์จ์ด๋ MIT ๋ผ์ด์ ์ค ํ์ ๋ฐฐํฌ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ธ์. - ๐ ๋ฒ๊ทธ ๋ฆฌํฌํธ: GitHub Issues
- ๐ฌ ํ ๋ก & ์ง๋ฌธ: GitHub Discussions
- ๐ ์ํค: GitHub Wiki
- ๐ง ์ง์ ๋ฌธ์: ์ด์ ์์ฑ ๋๋ ํ ๋ก ์ฐธ์ฌ
๐ฏ DDD ์ํคํ
์ฒ ๋ฆฌํฉํ ๋ง 90% ์๋ฃ: ๋ ๊ฑฐ์ ์ ๋ฆฌ ๋ฐ ํ๋์ ํ๊ฒฝ ๊ตฌ์ถ โจ ์ฃผ์ ์ฑ๊ณผ: - ๐ ๋ ๊ฑฐ์ ์ฝ๋ ๋์ ๋ฆฌ: business_logic, core, data_layer ๋ชจ๋ legacy๋ก ์ด๋ - ๐๏ธ ๋ฐฑ์
ํญ ์ ๊ฑฐ: ๋งค๋งค์ ๋ต ๊ด๋ฆฌ UI ๋จ์ํ - ๐๏ธ ํ๋์ .venv ํ๊ฒฝ: VS Code ํตํฉ ์๋ฃ - ๐ฆ requirements.txt ์ ๋ฆฌ: ์ค์ ํ๊ฒฝ ๊ธฐ๋ฐ์ผ๋ก ์นดํ
๊ณ ๋ฆฌ๋ณ ์ฌ๊ตฌ์ฑ ๐ง ๊ธฐ์ ์ ๊ฐ์ : - DDD 4๊ณ์ธต ์์์ฑ ํ๋ณด: Domain ์ธ๋ถ ์์กด์ฑ ์์ ์ ๊ฑฐ - Token ํจ์จ์ฑ ํฅ์: ๋ฏธ์ฌ์ฉ ํด๋๋ค์ legacy๋ก ๊ฒฉ๋ฆฌ - API ์ฐ๊ฒฐ ์ฑ๊ณต: ์
๋นํธ ์ค๊ณ์ข ์ฐ๋ ํ์ธ โ
๊ฒ์ฆ ์๋ฃ: - GUI ์์คํ
์ ์ ์๋ (7๊ท์น ์ ๋ต ํธ๋ฆฌ๊ฑฐ ๋น๋ ํฌํจ) - ๋ชจ๋ ํ๋ฉด ์ ํ ๋ฐ ์ค์ ๊ธฐ๋ฅ ์ ์ - DDD/MVP ํจํด ๋ฌด๊ฒฐ์ฑ ์ ์ง โญ ์ด ํ๋ก์ ํธ๊ฐ ๋์์ด ๋์๋ค๋ฉด GitHub Star๋ฅผ ๋๋ฌ์ฃผ์ธ์! โญ
๐ ์์ ์ ์ธ DDD ๊ธฐ๋ฐ ์๋๋งค๋งค ์์คํ ์ผ๋ก ์ํธํํ ํฌ์์ ์๋ก์ด ๊ฒฝํ์ ์์ํ์ธ์! ๐