commit 12b1305fb23c8903aaf58de3237db6a5e4cbc171 Author: tae2564 Date: Wed Dec 3 22:03:53 2025 +0900 최초 프로젝트 업로드 (Script Auto Commit) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..17a766f --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,113 @@ + + +# Project Rules & AI Persona + +## 1. Role & Persona +- 당신은 Google, Meta 출신의 **Principal Software Engineer**입니다. +- **C++ (C++17/20)** 및 **Python (3.11+)** 분야의 절대적인 전문가입니다. +- 당신의 목표는 단순히 "동작하는 코드"가 아닌, **"확장 가능하고(Scalable), 유지보수 용이하며(Maintainable), 성능이 최적화된(Performant)"** 솔루션을 제공하는 것입니다. +- 불필요한 서론(대화)을 생략하고, **코드와 핵심 기술적 설명**만 출력하십시오. + +## 2. Core Principles (The "Manifesto") +1. **Think Before You Code:** + - 코드를 작성하기 전에, 주석으로 처리 로직을 먼저 설계하십시오. + - **Complexity:** 알고리즘의 시간/공간 복잡도(Big-O)를 고려하고, 불필요한 `O(N^2)` 이상의 로직을 피하십시오. +2. **Clean Code & SOLID:** + - 함수는 단일 책임(SRP)을 가져야 하며, 테스트 용이성(Testability)을 고려해 작성하십시오. + - **Early Return:** 들여쓰기 깊이(Indentation depth)를 최소화하기 위해 가드 절(Guard Clause)을 적극 사용하십시오. +3. **DRY (Don't Repeat Yourself):** 중복 로직은 반드시 유틸리티 함수나 클래스로 분리하십시오. +4. **Defensive Programming:** + - 예외를 삼키지 말고(No Silent Failures), 명확한 로그와 함께 상위 레벨로 전파하거나 적절히 처리하십시오. + - 입력값 검증(Validation)을 철저히 하십시오. +5. **Security First:** API Key, 비밀번호 등 민감 정보는 절대 하드코딩하지 말고 환경 변수(.env)를 사용하십시오. + +## 3. Tech Stack & Style Guidelines + +### 🎨 Common Style Rules (모든 언어 공통) +- **Naming Convention:** 변수명은 의도를 명확히 드러내야 합니다. (`x`, `tmp`, `data`, `foo` 등 무의미한 이름 사용 **절대 금지**) +- **Documentation:** 모든 공개 함수(Public Function)와 클래스에는 명확한 주석(Docstring)을 작성하십시오. +- **Standard:** 각 언어별 표준 스타일 가이드를 엄격히 준수합니다. + +### 🐍 Python (3.11+) +- **Type Hinting:** 모든 함수와 메서드에 `typing` 모듈을 사용한 타입 힌트 필수 적용. +- **Style:** PEP8 준수 (Black Formatter 기준). +- **Docstring:** Google Style Docstring을 따름. +- **Error Handling:** `try-except`를 남용하지 말고, 구체적인 예외(Specific Exception)만 잡으십시오. + +### 🚀 C++ (C++17/20) +- **Modern C++:** Smart Pointers (`std::unique_ptr`, `std::shared_ptr`), Move Semantics, Lambda, `std::optional` 등을 적극 활용하십시오. +- **Memory Safety:** Raw pointer (`new`/`delete`) 사용을 금지합니다. (불가피한 경우 주석으로 사유 명시) +- **Style:** Google C++ Style Guide를 준수하십시오. +- **Error Handling:** `try-catch`보다는 RAII 패턴을 통해 자원을 관리하고, 예외 안정성(Exception Safety)을 고려하십시오. + +## 4. Response Rules +- **File Context:** 파일 경로와 이름을 코드 블록 상단에 항상 주석으로 명시하십시오. (예: `# src/main.py` 또는 `// src/main.cpp`) +- **Full Context:** 코드를 수정할 때는 변경된 부분만 보여주지 말고, **문맥 파악이 가능한 전체 함수 또는 블록**을 보여주십시오. +- **Dependencies:** 새로운 라이브러리가 필요하면 `requirements.txt` (Python) 또는 `CMakeLists.txt`/`vcpkg.json` (C++) 업데이트를 함께 제안하십시오. + +## 5. State Management (Context Persistence) +**[CRITICAL]** 채팅 세션이 끊기더라도 작업의 연속성을 유지하기 위해, 당신은 항상 **`project_state.md`** 파일을 관리해야 합니다. + +1. **Read First:** 작업을 시작하기 전, 항상 `project_state.md`의 내용을 확인하여 현재 진행 상황과 중단된 지점을 파악하십시오. +2. **Write Always:** 답변의 **가장 마지막**에는 반드시 업데이트된 `project_state.md` 내용을 코드 블록으로 출력해야 합니다. +3. **File Structure (`project_state.md`):** + - **Current Goal:** 현재 진행 중인 `implementation_plan.md`의 세부 단계. + - **ToDo List:** 현재 목표를 달성하기 위한 마이크로 태스크 목록 (체크박스 활용). + - **Context Dump:** 다음 세션의 AI가 알아야 할 중요 설계 결정, 변수명, 남은 이슈 등 기술적 메모. + + + +추가 질문이 있는 경우 문의하세요. + + + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..30bc112 --- /dev/null +++ b/.gitignore @@ -0,0 +1,58 @@ +# Environment variables +.env +.env.local +.env.*.local + +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual environments +venv/ +ENV/ +env/ +.venv + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Test data (in tests/ folder) +tests/holdings.json +tests/holdings.json.example +tests/*.txt +tests/*.log + +# Logs (in logs/ folder) +logs/*.log + +# Production data (root level) +trades.json +pending_orders.json +confirmed_tokens.txt + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a28e1ab --- /dev/null +++ b/Dockerfile @@ -0,0 +1,37 @@ +# Synology DSM용 MACD 알림 봇 Dockerfile +FROM python:3.12-slim + +# 필수 패키지 및 로케일 설치 +RUN apt-get update && apt-get install -y \ + build-essential \ + libffi-dev \ + libssl-dev \ + locales \ + && rm -rf /var/lib/apt/lists/* + +# 한글 및 UTF-8 로케일 설정 +RUN sed -i '/ko_KR.UTF-8/s/^# //g' /etc/locale.gen && \ + locale-gen ko_KR.UTF-8 +ENV LANG=ko_KR.UTF-8 +ENV LC_ALL=ko_KR.UTF-8 + +# 타임존 설정 (서울) +ENV TZ=Asia/Seoul + +WORKDIR /app + +# 1. requirements.txt만 먼저 복사 +COPY requirements.txt . + +# 2. 라이브러리를 먼저 설치 (이 단계가 캐시됨) +RUN pip install --no-cache-dir --upgrade pip \ + && pip install --no-cache-dir -r requirements.txt + +# COPY . /app + +RUN mkdir -p logs + +CMD ["python", "main.py"] + +# 필요시 포트 노출 +# EXPOSE 8000 diff --git a/Git_사용법.txt b/Git_사용법.txt new file mode 100644 index 0000000..105ba9a --- /dev/null +++ b/Git_사용법.txt @@ -0,0 +1,113 @@ +Git + +방식 : 내 컴퓨터에도 서버와 똑같은 전체 저장소 사본을 가진다. + +Commit : 내 PC에만 버전 이력 남길 수 있다. +Push : 서버로 전송 +Branch : 따로 가지쳐서(폴더 복사가 아닌 포인터만 이동) 작업 후 나중에 합치기 쉽다. + +Working Directory : 실제 코드를 수정하는 폴더 +Staging Area : 커밋할 파일만 골라서 올려두는 가상의 공간(git add) +Repository : 확정된 버전들이 저장되는 곳(git commit) + +Step 0 : 최초 한번 설정, 누가 코드를 짰는지 이름표를 붙이는 작업 +git config --global user.name "tae2564" +git config --global user.email "tae2564@gmail.com" + +Step 1. 프로젝트 가져오기 (Clone) : Gitea의 저장소를 PC로 가져온다. +git clone https://git.tae2564.synology.me/tae2564/ProjectName.git +cd ProjectName + +Step 2. 코드 수정 및 업로드 +2.1 작업 시작 전 최신 코드 받기 +git pull +2.2. 상태 확인 : 어떤 파일이 수정되었는지 확인한다. +git status +2.3. 수정한 파일 중 커밋할 파일을 Staging Area에 추가한다. +git add main.py # 특정 파일만 담기 +git add . # 수정된 모든 파일 담기 (가장 많이 씀) +2.4. Commit : 버전 확정, 내 PC에 버전을 기록한다. +git commit -m "수정 내용" +2.5. Push : 서버 전송, Gitea 서버로 코드를 업로드한다. +git push origin main # 처음엔 git push -u origin main을 한 번 해줘야한다. +git push # 이 후엔 git push 만 해도된다. +2.6 되돌리기(Reset) +git reset --soft HEAD~1 # 방금 한 커밋을 취소하고 파일은 살려둠 (Staging 상태로) +git reset --hard HEAD~1 # 방금 한 커밋을 취소하고 파일 수정내역까지 싹 날림 (주의!) + +Step 3. Branch 활용 +기존 코드는 그대로 두고 수정한 코드로 테스트해보고 싶을 때 브랜치를 사용한다. +3.1. 브랜치 생성 및 이동 +이제부터 수정하는 코드는 원본 main에 영향을 주지 않는다. +git switch -c BranchName # BranchName라는 이름의 브랜치를 만들고 이동 +3.2. 작업 후 커밋 +git add . +git commit -m "수정 내용" +3.3. 원본(main)에 합치기(Merge) 테스트가 성공적이어서 원본에 반영하고 싶다면 +git switch main # 다시 본진으로 복귀 +git merge BranchName # 작업한 브랜치를 끌어와서 합침 +git push # 서버에 반영 +3.3 다 쓴 브랜치 삭제 +git branch -d BranchName # -d 옵션은 delete의 약자 + +Python 프로젝트 필수 팁 (.gitignore) +Python을 쓸경우 컴파일된 파일(__pycache__)이나 가상환경 폴더(venv)는 Git에 올리면 안된다. 지저분해지고 충돌난다. +프로젝트 최상위 폴더에 .gitignore라는 파일을 만들고 다음 내용을 추가한다. (텍스트 파일) +# .gitignore 파일 내용 +__pycache__/ +*.py[cod] +.venv/ +venv/ +.env +.vscode/ + +VS Code 사용시 왼쪽 메뉴의 소스제어(Source Control) 탭에서 add, commit, push, diff를 GUI로 지원한다. +좌측 확장(Extensions) 메뉴에서 Git Graph 설치 : 커밋 이력을 시각적으로 보여준다. +1. 저장소 가져오기 (Clone) +F1 키를 누르고 Git: Clone 입력 후 엔터. +주소 입력: 아까 Gitea에서 만든 주소 입력 : https://git.tae2564.synology.me/tae2564/Finder.git +폴더 선택: 소스 코드를 저장할 PC 내 폴더 선택. +로그인: 아이디/비번 물어보면 Gitea 계정 입력. +열기: "복제된 리포지토리를 여시겠습니까?" 하면 [열기(Open)] 클릭. +2. 핵심 루틴: 수정 -> 담기 -> 커밋 -> 푸시 +VS Code 좌측의 [소스 제어 (Source Control)] 아이콘이 메인 작업 공간이다. +2.1 수정 (Modify) +파일을 수정하고 저장(Ctrl+S)하면, 소스 제어 탭의 '변경 사항(Changes)' 목록에 파일이 뜹니다. +파일 옆에 M(Modified) 마크가 뜹니다. +파일을 클릭하면 Diff(비교) 화면이 열려 이전 버전과 뭐가 달라졌는지 바로 보여줍니다. +2.2 담기 (Stage) = git add +커밋할 파일을 선택하는 단계입니다. +파일 이름 옆의 + (변경 내용 스테이징) 버튼을 누릅니다. +그러면 파일이 '스테이징된 변경 사항(Staged Changes)' 으로 이동합니다. (장바구니에 담긴 상태) +2.3 커밋 (Commit) = git commit +내 PC에 저장하는 단계입니다. +입력창(메시지)에 "검색 알고리즘 수정"이라고 적습니다. +위쪽의 [커밋(Commit)] 버튼(또는 Ctrl+Enter)을 누릅니다. +파일들이 목록에서 사라집니다. (로컬 저장소에 안전하게 저장됨) +2.4 푸시 (Push) = git push +Gitea 서버(NAS)로 보내는 단계입니다. +커밋을 하고 나면 버튼이 [변경 내용 동기화(Sync Changes)] 로 바뀝니다. (파란색 버튼) +이걸 누르면 내 코드가 NAS로 올라갑니다. +3. 브랜치 활용 (새로운 시도 할 때) +'주식 검색기'의 기본 로직은 놔두고, 실험적인 기능을 넣고 싶을 때 씁니다. +3.1 브랜치 생성: +VS Code 왼쪽 하단 파란색 상태 표시줄을 보면 main (또는 master)이라고 적힌 글씨가 있습니다. +클릭 -> [+ 새 분기 만들기...] 선택 -> 이름 입력 (예: feature/rsi-test). +3.2 작업: +이제 코드를 막 수정해도 원본(main)은 안전합니다. +작업 후 위와 똑같이 커밋(Commit) 합니다. +3.3 브랜치 변경: +왼쪽 하단 브랜치 이름을 클릭해서 언제든지 main과 feature/rsi-test를 왔다 갔다 할 수 있습니다. (파일 내용이 순식간에 바뀝니다.) +4. 시각적 확인 (Git Graph) +아까 설치한 Git Graph를 써봅시다. +좌측 하단 상태 표시줄에 [Git Graph] 라는 글씨를 클릭합니다. (안 보이면 F1 -> Git Graph: View 입력) +아름다운 그래프가 나옵니다. +누가 언제 커밋했는지, 브랜치가 어떻게 갈라졌다 합쳐지는지 한눈에 보입니다. +특정 점(커밋)을 클릭하면 그 당시 파일 상태를 볼 수 있습니다. + + + + + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..2b50ce7 --- /dev/null +++ b/README.md @@ -0,0 +1,71 @@ +# xxx + +xxx + +--- + +## 프로젝트 구조 + +최근 프로젝트가 모듈화되어 다음과 같은 구조를 갖습니다: + +``` +xxx/ +├── xxx # 프로그램의 진입점 +├── src/ # 모듈화된 코드 +│ ├── xxx # xxx +│ ├── xxx # xxx +│ ├── xxx # xxx +│ └── tests/ # 테스트 코드 +│ ├── xxx +│ ├── xxx +│ └── xxx +└── pytest.ini # pytest 설정 +``` + +--- + +## 주요 기능 + +- **xxx**: xxx +- **xxx**: xxx +- **xxx**: xxx + +### xxx + +xxx + +--- + +## 실행 방법 + +1. **의존성 설치**: + + xxx + +2. **환경 변수 설정**: + + xxx + +3. **설정 파일 준비**: + + xxx + +4. **프로그램 실행**: + + xxx + +--- + +## 테스트 실행 + +1. xxx: + + xxx + +2. xxx: + + xxx + +--- + +이 문서는 프로젝트의 최신 구조와 실행 방법을 반영하도록 업데이트되었습니다. diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..50dd146 --- /dev/null +++ b/config/config.json @@ -0,0 +1,54 @@ +{ + "symbols_file": "config/symbols.txt", + "symbol_delay": 1.0, + "candle_count": 200, + "buy_check_interval_minutes": 240, + "stop_loss_check_interval_minutes": 60, + "profit_taking_check_interval_minutes": 240, + "balance_warning_interval_hours": 24, + "min_amount_threshold": 1e-8, + "loop": true, + "dry_run": false, + "max_threads": 3, + "telegram_parse_mode": "HTML", + "macd_fast": 12, + "macd_slow": 26, + "macd_signal": 9, + "adx_length": 14, + "adx_threshold": 25, + "sma_short": 5, + "sma_long": 200, + "trading_mode": "auto_trade", + "auto_trade": { + "enabled": true, + "buy_enabled": true, + "buy_amount_krw": 15000, + "min_order_value_krw": 5000, + "allowed_symbols": [], + "require_env_confirm": false, + "buy_price_slippage_pct": 0.2, + "loss_threshold": -5.0, + "profit_threshold_1": 10.0, + "profit_threshold_2": 30.0, + "drawdown_1": 5.0, + "drawdown_2": 15.0, + "telegram_max_retries": 3, + "order_monitor_max_errors": 5 + }, + "confirm": { + "confirm_via_file": false, + "confirm_timeout": 300 + }, + "monitor": { + "enabled": true, + "timeout": 120, + "poll_interval": 3, + "max_retries": 1 + }, + "notify": { + "order_filled": true, + "order_partial": true, + "order_cancelled": true, + "order_error": true + } +} diff --git a/data/data.json b/data/data.json new file mode 100644 index 0000000..9c36bc4 --- /dev/null +++ b/data/data.json @@ -0,0 +1,8 @@ +{ + "KRW-TRUMP": { + "buy_price": 10640.0, + "amount": 1.40977443, + "max_price": 10700.0, + "buy_timestamp": null + } +} \ No newline at end of file diff --git a/data/data.txt b/data/data.txt new file mode 100644 index 0000000..f5b276d --- /dev/null +++ b/data/data.txt @@ -0,0 +1,105 @@ +# symbols.txt - 한 줄에 하나의 Upbit 심볼 입력 +# 빈 줄과 #으로 시작하는 줄은 무시됨 +# my watchlist +KRW-BTC +KRW-ETH +KRW-XRP +# KRW-BNB +KRW-SOL +KRW-TRX +KRW-DOGE +KRW-ADA +# KRW-HYPE +KRW-LINK +KRW-BCH +KRW-XLM +# KRW-LEO +# KRW-ZEC +# KRW-LTC +KRW-HBAR +KRW-AVAX +KRW-SUI +# KRW-XMR +KRW-SHIB +# KRW-TON +KRW-UNI +KRW-DOT +KRW-CRO +KRW-MNT +# KRW-TAO +KRW-WLFI +KRW-AAVE +KRW-NEAR +# KRW-ICP +# KRW-BGB +KRW-ETC +# KRW-OKB +# KRW-PEPE +# KRW-M +KRW-APT +KRW-ONDO +# KRW-ENA +# KRW-ASTER +# KRW-PI +# KRW-POL +# KRW-WLD +# KRW-VET +KRW-TRUMP +# KRW-KCS +# KRW-XAUT +# KRW-ARB +KRW-ALGO +# KRW-FIL +# KRW-SKY +# KRW-FLR +# KRW-IP +KRW-RENDER +# KRW-PAXG +# KRW-SEI +# KRW-PUMP +# KRW-KAS +# KRW-ATOM +# KRW-CAKE +# KRW-JUP +# KRW-BONK +# KRW-XDC +# KRW-TIA +# KRW-QNT +# KRW-AERO +# KRW-IMX +# KRW-DASH +# KRW-PEN +# KRW-GT +# KRW-VIR +# KRW-PYTH +# KRW-ENS +# KRW-AB +# KRW-SYRUP +# KRW-XPL +# KRW-FLOKI +# KRW-MORPHO +# KRW-INJ +# KRW-GRT +# KRW-LDO +# KRW-OP +# KRW-SAND +# KRW-TWT +# KRW-KAIA +# KRW-2Z +# KRW-ETHFI +# KRW-NEXO +# KRW-CRV +# KRW-DEXE +# KRW-CFX +# KRW-SPX +# KRW-IOTA +# KRW-FET +# KRW-XTZ +# KRW-STX +# KRW-PENDLE +# KRW-H +# KRW-WIF +# KRW-THETA +# KRW-JASMY +KRW-AWE +KRW-ARDR \ No newline at end of file diff --git a/docs/implementation_plan.md b/docs/implementation_plan.md new file mode 100644 index 0000000..a085408 --- /dev/null +++ b/docs/implementation_plan.md @@ -0,0 +1,35 @@ + + +# Implementation Plan + +이 문서는 프로젝트의 개발 진행 상황을 추적합니다. AI는 이 문서를 참조하여 현재 단계(Context)를 파악하고 작업을 수행해야 합니다. + +## Phase 1: 환경 설정 및 기반 구축 (Setup) [ ] +- [ ] 프로젝트 폴더 구조 생성 및 Git 초기화 +- [ ] `copilot-instructions.md` 및 `.env` 환경 변수 템플릿 설정 +- [ ] 언어별 패키지 매니저 설정 (requirements.txt, package.json, go.mod 등) +- [ ] 기본 로깅(Logging) 및 설정(Config) 모듈 구현 + +## Phase 2: 코어 비즈니스 로직 (Core Domain) [ ] +- [ ] `project_requirements.md`의 핵심 기능을 담당하는 도메인 모델 설계 +- [ ] 데이터 처리 및 비즈니스 로직 구현 (순수 함수 위주) +- [ ] 핵심 로직에 대한 단위 테스트(Unit Test) 작성 및 통과 확인 + +## Phase 3: 인터페이스 및 데이터 연동 (Integration) [ ] +- [ ] 외부 API 연동 또는 데이터베이스 연결 모듈 구현 +- [ ] 사용자 인터페이스(UI) 또는 API 엔드포인트 구현 +- [ ] 예외 처리(Exception Handling) 및 에러 응답 표준화 + +## Phase 4: 시스템 통합 및 실행 (System Interface) [ ] +- [ ] 메인 진입점(Entry Point) 구현 (main.py, index.js 등) +- [ ] 전체 프로세스 통합 테스트 (Integration Test) +- [ ] 로컬 환경에서의 End-to-End 실행 검증 + +## Phase 5: 최적화 및 리팩토링 (Refinement) [ ] +- [ ] 성능 병목 구간 분석 및 비동기/캐싱 적용 +- [ ] `review_prompt.md` 기반 자가 점검 및 코드 품질 개선 +- [ ] 최종 문서화 (README.md 작성) +- [ ] 프로그램 사용법 작성 (user_guide.md) diff --git a/docs/project_requirements.md b/docs/project_requirements.md new file mode 100644 index 0000000..84580b0 --- /dev/null +++ b/docs/project_requirements.md @@ -0,0 +1,45 @@ + + +# Product Requirements Document (PRD) + +## 1. Project Overview +- **프로젝트명:** [프로젝트 이름 입력] +- **해결하려는 문제:** [이 프로젝트가 해결하고자 하는 핵심 문제 정의] +- **목표:** [프로젝트의 최종 성공 기준] +- **주요 타겟 유저:** [사용자 페르소나 정의] + +## 2. Core Features (User Stories) +*(우선순위가 높은 순서대로 작성)* +1. **[핵심 기능 1]:** [사용자는 ~할 수 있다. 이를 통해 ~를 얻는다.] +2. **[핵심 기능 2]:** [상세 설명] +3. **[핵심 기능 3]:** [상세 설명] +4. **[부가 기능]:** [상세 설명] + +## 3. Tech Stack & Architecture +- **Frontend:** [예: React, Tailwind CSS] +- **Backend:** [예: Python FastAPI, Node.js] +- **Database:** [예: PostgreSQL, Redis] +- **Infra:** [예: AWS Lambda, Docker] + +## 4. Data Flow & Logic +- **Input:** [데이터 입력 소스] +- **Process:** + 1. [단계 1: 데이터 수집/수신] + 2. [단계 2: 핵심 비즈니스 로직 처리] + 3. [단계 3: 데이터 저장 또는 가공] +- **Output:** [최종 결과물 형태] + +## 5. File Structure Plan (Suggested) +*(AI가 제안하거나 개발자가 미리 지정)* +- `/src/core/` : 핵심 비즈니스 로직 +- `/src/api/` : 외부 인터페이스 및 API 핸들러 +- `/src/utils/` : 공통 유틸리티 +- `/tests/` : 단위 및 통합 테스트 + +## 6. Non-Functional Requirements +- **성능:** [예: 응답 속도 200ms 이내, 동시 접속 1000명 처리] +- **보안:** [예: 모든 데이터 전송은 HTTPS, 민감 정보 암호화] +- **안정성:** [예: 외부 API 실패 시 재시도(Retry) 로직 구현] diff --git a/docs/project_state.md b/docs/project_state.md new file mode 100644 index 0000000..13a6d36 --- /dev/null +++ b/docs/project_state.md @@ -0,0 +1,28 @@ + +# Current Session State + +## 🎯 Current Phase +- **Phase:** xxx +- **Focus:** xxx + +## ✅ Micro Tasks (ToDo) +- [x] xxx +- [x] xxx +- [x] xxx +- [x] xxx + +## 📝 Context Dump (Memo) +### xxx 완료 내역: +- **xxx:** xxx +- **xxx:** xxx +- **xxx:** xxx + +### 검증된 주요 컴포넌트: +1. **xxx:** xxx +1. **xxx:** xxx +1. **xxx:** xxx + +### Next Phase (xxx): +- xxx +- xxx +- xxx diff --git a/docs/review_prompt.md b/docs/review_prompt.md new file mode 100644 index 0000000..0dd82b2 --- /dev/null +++ b/docs/review_prompt.md @@ -0,0 +1,108 @@ + + + + + + + + +# 코드 리뷰 프롬프트 +다음 지침에 따라 코드를 검토하고 코드 리뷰 레포트(code_review_report.md)를 작성해주세요. + +## [1. 분석 컨텍스트] +정확한 분석을 위해 아래 정보를 기반으로 코드를 검토하십시오. +- 언어/프레임워크: (예: Python 3.11, React 18, Spring Boot) +- 코드의 목적: (예: 사용자 인증, 데이터 파싱, 결제 트랜잭션) +- 주요 제약사항: (예: 높은 동시성, 메모리 최적화, 엄격한 보안 기준) + +## [2. 역할 및 원칙] +당신은 '무관용 원칙'을 가진 수석 소프트웨어 아키텍트입니다. +- 목표: 칭찬보다는 결함(Bug), 보안 취약점, 성능 병목, 유지보수 저해 요소를 찾아내는 데 집중하십시오. +- 금지: 코드에 없는 내용을 추측하여 지적하지 마십시오(Zero Hallucination). +- 기준: "작동한다"에 만족하지 말고, "견고하고 안전한가"를 기준으로 판단하십시오. + +## [3. 사전 단계: 의도 파악] +분석 전, 이 코드가 수행하는 핵심 로직을 3줄 이내로 요약하여, 당신이 코드를 올바르게 이해했는지 먼저 보여주십시오. + +## [4. 심층 검토 체크리스트] +다음 항목을 기준으로 코드를 해부하십시오. +### 1. 논리 및 엣지 케이스 (Logic & Edge Cases) +- 가상 실행: 코드를 한 줄씩 추적하며 변수 상태 변화를 검증했는가? +- 경계값: Null, 빈 값, 음수, 최대값 등 극한의 입력에서 로직이 깨지지 않는가? +- 예외 처리: 에러를 단순히 삼키지 않고(Silent Failure), 적절히 처리하거나 전파하는가? +- 모듈성 및 API 설계: 함수/클래스의 공개 인터페이스(Public Interface)가 직관적이고 일관성이 있는가? 테스트 용이성(Testability)을 위해 의존성이 잘 분리되었는가? + +### 2. 보안 및 안정성 (Security & Stability) +- 입력 검증: SQL 인젝션, XSS, 버퍼 오버플로우 취약점이 없는가? +- 정보 노출: 비밀번호, API 키, PII(개인정보)가 하드코딩되거나 로그에 남지 않는가? +- 자원 관리 및 메모리 안정성: + - 일반: 파일, DB 연결, 네트워크 소켓 등 모든 자원은 예외 발생 시에도 확실히 해제되는가? + - 언어별 핵심 원칙 (조건부 검증): + - (C++ 프로젝트인 경우): Raw pointer (`new`/`delete`)가 발견되지 않는가? 동적 자원은 스마트 포인터(RAII)로 관리되며, 함수가 예외 안전성을 제공하는가? + - (Python 프로젝트인 경우): 불필요한 참조 순환이나 메모리 누수 패턴이 없는가? 멀티스레딩 환경에서 동시성(Locking) 처리가 올바른가? + +### 3. 동시성 및 성능 (Concurrency & Performance) +- 동기화: (해당 시) 경쟁 상태(Race Condition), 데드락, 스레드 안전성 문제가 없는가? +- 효율성: 불필요한 중첩 반복문(O(n²))이나 중복 연산이 없는가? +- 시스템 성능: + - I/O 병목: DB 쿼리나 네트워크 호출이 불필요하게 반복(N+1 쿼리)되거나 동기적으로 실행되어 시스템 전체를 막는 부분이 없는가? + - C++ (캐시 효율): 대용량 데이터 구조 설계 시 CPU 캐시 효율성(Cache Locality)이 고려되었는가? + +## [5. 출력 형식: 결함 보고서] +발견된 문제가 없다면 "특이사항 없음"으로 명시하십시오. 문제가 있다면 아래 양식을 엄수해 주세요. + +### 🚨 치명적 문제 (Critical Issues) +(서비스 중단, 데이터 손실/오염, 보안 사고 위험이 있는 경우) + +[C-1] 문제 제목 +├─ 위치: [파일경로:라인] 또는 [코드 스니펫 3~5줄] +├─ 원인: [기술적 원인 설명] +├─ 재현/조건: [문제가 발생하는 상황] +└─ 해결책: [수정된 코드 블록 (Auto-Fix)] + +### ⚠️ 개선 제안 (Warnings & Improvements) +(성능 저하, 유지보수성 부족, 잠재적 버그) + +[W-1] 문제 제목 +├─ 위치: [파일경로:라인] 또는 [코드 스니펫] +├─ 분석: [문제점 설명] +└─ 권장 조치: [리팩토링 제안] + +### ✅ 잘된 점 (Strengths) +(핵심적인 장점 1~2가지만 간결하게) diff --git a/docs/user_guide.md b/docs/user_guide.md new file mode 100644 index 0000000..5b14918 --- /dev/null +++ b/docs/user_guide.md @@ -0,0 +1,104 @@ +# xxx 사용 가이드 + +## 개요 +xxx + +## 1. 사전 준비 (필수) + +### 1.1 xxx +1. xxx +2. xxx +3. xxx + +### 1.2 xxx +- xxx +- xxx +- xxx + +### 1.3 환경변수 설정 (`.env` 파일) +```bash +# xxx +xxx + +# xxx +xxx +``` + +⚠️ `.env` 파일을 `.gitignore`에 추가하여 비밀 정보를 저장소에 커밋하지 마세요. + +## 2. config.json 설정 + +### 2.1 기본 설정 (신중하게) +```json +{ + xxx +} +``` + +### 2.2 각 항목 설명 + +#### xxx +- xxx +- xxx +- xxx + +#### xxx +- xxx +- xxx +- xxx + +## 3. xxx + +### xxx +- [ ] xxx +- [ ] xxx +- [ ] xxx + +### xxx +- [ ] xxx +- [ ] xxx +- [ ] xxx + +## 4. xxx + +### 4.1 xxx +1. xxx +2. xxx +3. xxx + +### 4.2 xxx +1. xxx +2. xxx +3. xxx + +## 5. 운영 (Troubleshooting) + +### xxx +1. xxx +2. xxx +3. xxx + +### xxx +1. xxx +2. xxx +3. xxx + +## 6. 성능/안정성 팁 + +1. xxx: + - xxx + - xxx + - xxx + +2. xxx: + - xxx + - xxx + - xxx + +## 7. FAQ + +**Q: xxx** +A: xxx + +**Q: xxx** +A: xxx diff --git a/docs/workflow.md b/docs/workflow.md new file mode 100644 index 0000000..03b211c --- /dev/null +++ b/docs/workflow.md @@ -0,0 +1,70 @@ + + +# Automated Development Workflow Protocol + +이 문서는 AI가 프로젝트를 **자동으로 진행**하기 위한 행동 수칙을 정의합니다. +사용자가 **"워크플로우로 진행해줘"**라고 명령하면, AI는 아래 **[Execution Loop]**를 따릅니다. + +## 🔄 Execution Loop (반복 실행 규칙) + +AI는 다음 순서를 엄격히 준수해야 합니다. + +1. **Status Check (상태 확인):** + - `implementation_plan.md`를 읽고, **체크되지 않은( `[ ]` ) 가장 첫 번째 Phase**를 식별합니다. +2. **Proposal & Approval (제안 및 승인 요청):** + - 사용자에게 현재 진행해야 할 Phase와 수행할 작업 내용을 요약하여 보고합니다. + - **"Phase X 작업을 시작하시겠습니까?"** 라고 묻고, **사용자의 승인(Yes/Go)을 대기**합니다. (즉시 코드를 작성하지 마십시오.) +3. **Execution (실행):** + - 사용자가 승인하면, 아래 **[Phase Detail Prompts]**에 정의된 해당 단계의 지침에 따라 코드를 작성합니다. + - 이때 반드시 `copilot-instructions.md`의 C++/Python 규칙과 `project_requirements.md`의 요구사항을 준수합니다. +4. **Update Plan (플랜 업데이트):** + - 작업이 완료되면 `implementation_plan.md`의 해당 항목을 체크(`[x]`) 표시하여 업데이트합니다. +5. **Self-Correction (자가 점검):** + - 작성된 코드가 `review_prompt.md`의 기준(성능, 예외 처리 등)을 충족하는지 확인하고, 부족한 점이 있다면 스스로 수정합니다. + +--- + +## 📋 Phase Detail Prompts (단계별 수행 지침) + +AI는 실행 단계(Execution)에서 현재 Phase에 맞는 아래 지침을 수행합니다. + +### Phase 1: 환경 설정 (Setup) +- **목표:** 프로젝트 기반 마련 및 의존성 설정 +- **지침:** + 1. `copilot-instructions.md`의 Tech Stack을 확인하여 폴더 구조 생성. + 2. Python(`requirements.txt`, `.env`) 및 C++(`CMakeLists.txt`) 설정 파일 작성. + 3. `.gitignore` 및 기본 설정 파일 생성. + +### Phase 2: 코어 로직 구현 (Core Domain) +- **목표:** 비즈니스 로직 및 데이터 모델 구현 +- **지침:** + 1. 코딩 전, **알고리즘 설계와 시간 복잡도**를 주석으로 먼저 작성. + 2. `copilot-instructions.md`의 **Core Principles**를 준수하여 순수 함수/클래스 구현. + 3. 반드시 **단위 테스트(Unit Test)** 코드를 함께 작성. + +### Phase 3: 인터페이스 연동 (Integration) +- **목표:** 외부 API, DB, UI 연동 +- **지침:** + 1. 외부 시스템과의 통신 로직 구현. + 2. **Error Handling:** 네트워크 실패, 타임아웃 등을 대비한 방어 코드(`try-except`, `RAII`) 작성. + 3. `project_requirements.md`의 데이터 흐름(Data Flow) 준수 확인. + +### Phase 4: 시스템 통합 (System Interface) +- **목표:** 메인 진입점 및 전체 프로세스 연결 +- **지침:** + 1. `main.py` 또는 `main.cpp` 진입점 구현. + 2. 전체 모듈을 연결하고 통합 테스트(Integration Test) 시나리오 작성. + 3. 실제 실행 가능한 상태인지 검증. + +### Phase 5: 최적화 및 리팩토링 (Refinement) +- **목표:** 품질 향상 및 안정화 +- **지침:** + 1. `review_prompt.md`를 기준으로 전체 코드 리뷰 수행. + 2. 성능 병목(O(N^2) 이상) 및 메모리 누수 점검. + 3. 최종 문서(README.md) 작성. + +--- + +## 🛑 Exception Handling +- 작업 중 에러가 발생하거나 정보가 부족하면 즉시 중단하고 사용자에게 구체적인 질문을 하십시오. +- 사용자가 "중단" 또는 "수정"을 요청하면 즉시 루프를 멈추고 지시를 따르십시오. diff --git a/docs/workflow_manual.md b/docs/workflow_manual.md new file mode 100644 index 0000000..9b4b6de --- /dev/null +++ b/docs/workflow_manual.md @@ -0,0 +1,86 @@ + + +# Manual Usage & Prompt Guide + +이 문서는 **자동 워크플로우(`workflow.md`)를 사용하지 않거나**, 특정 단계만 **수동으로 실행/재실행**해야 할 때 사용하는 프롬프트 모음집입니다. 상황에 맞는 프롬프트를 선택하여 AI에게 복사-붙여넣기 하세요. + +--- + +## 1. 프로젝트 시작 및 초기화 (Initialization) + +**상황:** 새로운 세션을 시작하거나, AI가 프로젝트 문맥을 잊어버렸을 때 사용합니다. + +### 📂 Step 1: 문맥 주입 (Context Loading) +> "첨부된 `copilot-instructions.md`, `project_requirements.md`, `implementation_plan.md`를 모두 읽고, 이 프로젝트의 목표와 내가 구축하려는 시스템의 아키텍처를 요약해주세요. 그리고 `implementation_plan.md`의 단계들이 적절한지 검토해주세요." + +### 🔍 Step 2: 계획 검증 (Plan Validation) +> "`implementation_plan.md`의 내용이 충분히 구체적인가? 만약 부족한 부분이 있다면 Python/C++ 프로젝트 표준에 맞춰서 수정해주세요. (수정이 없다면 이 단계는 생략)" + +--- + +## 2. 단계별 실행 프롬프트 (Phase Execution) + +**상황:** `implementation_plan.md`의 특정 단계를 실행할 때 사용합니다. (원하는 단계만 골라서 사용 가능) + +### 🚀 Phase 1: 환경 설정 (Setup) +> "`implementation_plan.md`의 **[Phase 1]** 작업을 시작한다. +> `copilot-instructions.md`의 **Tech Stack**에 맞춰 폴더 구조를 잡고, 필요한 설정 파일(.env, requirements.txt, CMakeLists.txt 등)을 작성해줘. +> 작성 후에는 `implementation_plan.md`의 해당 항목을 체크(x)해주세요." + +### 🧩 Phase 2: 코어 로직 구현 (Core Domain) +> "`implementation_plan.md`의 **[Phase 2]** 작업을 수행한다. +> `copilot-instructions.md`의 **Core Principles**를 준수하여 비즈니스 로직과 도메인 모델을 구현해주세요. +> **중요:** 코드를 작성하기 전에 **로직 설계와 시간 복잡도**를 먼저 설명하고, 반드시 **단위 테스트(Unit Test)** 코드를 함께 작성해주세요." + +### 🔌 Phase 3: 인터페이스 연동 (Integration) +> "`implementation_plan.md`의 **[Phase 3]** 작업을 수행한다. +> 외부 API 연동, DB 연결, 또는 UI 컴포넌트를 구현해주세요. +> **Error Handling:** 예외 상황(네트워크 실패, DB 연결 끊김 등)에 대한 처리를 `try-except`(Python) 또는 `RAII/Exception Safety`(C++) 규칙에 맞춰 견고하게 작성해주세요." + +### 🖥️ Phase 4: 시스템 통합 (System Interface) +> "`implementation_plan.md`의 **[Phase 4]** 작업을 수행한다. +> 전체 모듈을 하나로 묶는 메인 진입점(Main Entry Point)을 작성하고, 전체 프로세스가 유기적으로 동작하는지 검증하는 **통합 테스트(Integration Test)** 시나리오를 작성해주세요." + +### ⚡ Phase 5: 최적화 및 리팩토링 (Refinement) +> "`implementation_plan.md`의 **[Phase 5]** 작업을 수행한다. +> 현재 코드에서 **성능 병목(O(N^2) 이상)**이 발생할 수 있는 구간이나 **메모리 누수** 가능성을 분석해주세요. +> 그 후, `review_prompt.md`의 기준에 따라 스스로 코드를 리뷰하고 개선안을 적용해주세요." + +--- + +## 3. 자동 진행 및 복구 (Auto-Pilot & Recovery) + +**상황:** 다음 할 일을 AI가 스스로 찾게 하거나, 꼬인 상황을 풀 때 사용합니다. + +### 🤖 Auto-Pilot (알아서 다음 단계 진행) +> "`implementation_plan.md`를 확인해서 **아직 완료되지 않은(체크되지 않은) 가장 첫 번째 작업**을 수행해주세요. +> `copilot-instructions.md`의 규칙을 철저히 지켜서 코드를 작성하고, 작업이 끝나면 플랜 파일을 업데이트해주세요." + +### 🚑 Troubleshooting (품질/방향성 교정) + +**Q. AI가 엉뚱하거나 질 낮은 코드를 작성할 때** +> "방금 작성한 코드를 멈추고, `review_prompt.md`를 기준으로 다시 리뷰해주세요. 치명적인 결함이나 개선할 점을 찾아서 보고하고 코드를 수정해주세요." + +**Q. 진행 상황(체크박스)이 실제와 다를 때** +*(사용자가 파일을 직접 수정한 뒤 명령)* +> "`implementation_plan.md` 파일을 다시 읽어봐. 내가 현재 진행 상황을 업데이트했으니, 체크되지 않은 항목부터 다시 작업을 이어가주세요." + + + + + +copilot-instructions.md 지침을 따라서 작업해주세요. +project_requirements.md 파일에 작성된 템플릿에 맞춰 프로그램 요구사항을 작성한 후 +implementation_plan.md 파일에 작성된 템플릿에 맞춰 작업계획을 작성해주세요. +프로그램 요구사항과 작업계획을 작성하기전에 필요한 데이터가 부족하면 나한테 물어보고 데이터 준비가 완료되면 작성해주세요. +프로그램에 요구되는 기능은 다음과 같습니다. + +xxx + +더 필요한 내용이 있다면 물어봐주세요. + +workflow.md 지침에 따라 작업을 진행해주세요. + +review_prompt.md 지침에 따라 코드를 검토해주세요. + +이 프로그램을 사용하는 방법을 user_guide.md 파일에 작성해줘. diff --git a/git_init.bat.bat b/git_init.bat.bat new file mode 100644 index 0000000..1d412e1 --- /dev/null +++ b/git_init.bat.bat @@ -0,0 +1,91 @@ +@echo off +chcp 65001 > nul +cls +echo ======================================================== +echo Git 초기 설정 마법사 V2 (for Gitea) +echo ======================================================== +echo. +echo [!] 이 파일은 프로젝트 폴더의 최상위에 위치해야 합니다. +echo [!] Gitea에서 저장소를 생성한 후, HTTPS 주소를 준비해주세요. +echo. + +:: 1. 원격 저장소 URL 입력받기 +set /p REMOTE_URL="[입력] Gitea 저장소 주소 (HTTPS)를 붙여넣으세요: " + +if "%REMOTE_URL%"=="" ( + echo [오류] 주소가 입력되지 않았습니다. 창을 닫고 다시 실행해주세요. + pause + exit +) + +echo. +echo -------------------------------------------------------- +echo [Step 0] Git 사용자 정보 확인... +:: 사용자 이름이 설정되어 있는지 확인합니다. +git config user.name >nul 2>&1 +if %ERRORLEVEL% NEQ 0 ( + echo - 사용자 정보가 없습니다. 설정을 시작합니다. + echo. + set /p GIT_USER="[입력] 사용자 이름 (예: tae2564): " + set /p GIT_EMAIL="[입력] 이메일 주소 (예: tae2564@gmail.com): " + + :: 입력받은 정보를 이 프로젝트에만 적용(local) 할지, PC 전체(global)에 할지 선택 + :: 여기서는 편의상 Global로 설정합니다. + git config --global user.name "%GIT_USER%" + git config --global user.email "%GIT_EMAIL%" + echo - 사용자 정보 등록 완료! +) else ( + echo - 기존 사용자 정보가 감지되었습니다. 건너뜁니다. +) + +echo. +echo [Step 1] 저장소 초기화 중... +git init + +echo. +echo [Step 2] .gitignore 파일 생성 중 (Python용)... +if not exist .gitignore ( + ( + echo __pycache__/ + echo *.py[cod] + echo .venv/ + echo venv/ + echo .env + echo .vscode/ + echo .idea/ + echo *.log + ) > .gitignore + echo - .gitignore 파일이 생성되었습니다. +) else ( + echo - .gitignore 파일이 이미 존재하여 건너뜁니다. +) + +echo. +echo [Step 3] 파일 담기 및 첫 커밋... +git add . +git commit -m "최초 프로젝트 업로드 (Script Auto Commit)" + +echo. +echo [Step 4] 브랜치 이름 변경 (master - main)... +git branch -M main + +echo. +echo [Step 5] 원격 저장소 연결... +git remote remove origin 2>nul +git remote add origin %REMOTE_URL% + +echo. +echo [Step 6] 서버로 업로드 (Push)... +echo - 로그인 창이 뜨면 아이디와 비밀번호를 입력하세요. +git push -u origin main + +echo. +echo ======================================================== +if %ERRORLEVEL% == 0 ( + echo [성공] 모든 설정이 완료되었습니다! + echo 이제부터는 git_upload.bat 파일을 사용해 수정사항을 올리세요. +) else ( + echo [실패] 오류가 발생했습니다. 위 메시지를 확인해주세요. +) +echo ======================================================== +pause \ No newline at end of file diff --git a/git_upload.bat b/git_upload.bat new file mode 100644 index 0000000..3770300 --- /dev/null +++ b/git_upload.bat @@ -0,0 +1,26 @@ +@echo off +chcp 65001 +echo ============================================== +echo Git Auto Uploader (Gitea) +echo ============================================== + +:: 1. 변경된 모든 파일 담기 +echo [Step 1] Adding files... +git add . + +:: 2. 커밋 메시지 입력받기 (입력 안 하면 날짜로 자동 입력) +set /p msg="Commit message (Enter for auto-date): " +if "%msg%"=="" set msg=Auto Update: %date% %time% + +:: 3. 로컬 저장소에 커밋 +echo [Step 2] Committing with message: "%msg%" +git commit -m "%msg%" + +:: 4. 서버로 푸시 (업로드) +echo [Step 3] Pushing to Gitea Server... +git push origin main + +echo ============================================== +echo Upload Complete! +echo ============================================== +pause \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..e69de29 diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..d930cd5 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +testpaths = src/tests diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c4dc796 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +pyupbit +pandas +pandas_ta +requests +python-dotenv +pytest +chardet