PROJECT_UPGRADE_REPORT.mdโข9.28 kB
# ๋๋ผ์ฅํฐ MCP ์๋ฒ ๊ณ ๋ํ ํ๋ก์ ํธ ๋ณด๊ณ ์
**ํ๋ก์ ํธ ๊ธฐ๊ฐ**: 2025๋
1์
**๋ชฉํ**: MVP์์ ํ๋ก๋์
์ค๋น ์๋น์ค๋ก ์ ํ
**์ํ**: โ
์๋ฃ
---
## ๐ ํ๋ก์ ํธ ๊ฐ์
### ๊ธฐ์กด ์ํฉ (Before)
- **๋จ์ผ ํ์ผ**: 796์ค์ `server.py`์ ๋ชจ๋ ๋ก์ง ์ง์ค
- **๋๊ธฐ ์ฒ๋ฆฌ**: ์์ฐจ์ API ํธ์ถ๋ก ์ฑ๋ฅ ์ ํ
- **๊ธฐ๋ณธ MCP**: stdio ๋ชจ๋๋ง ์ง์
- **์ธ์ฆ ์์**: ๋ณด์ ์ฒด๊ณ ๋ถ์ฌ
- **ํ
์คํธ ์์**: ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง 0%
- **์๋ ๋ฐฐํฌ**: Docker ๊ธฐ๋ณธ ์ค์ ๋ง ์กด์ฌ
### ๊ฐ์ ํ (After)
- **๋ชจ๋ํ**: ์ฒด๊ณ์ ์ธ ์ํคํ
์ฒ๋ก ๋ถ๋ฆฌ
- **๋น๋๊ธฐ ์ฒ๋ฆฌ**: 10๋ฐฐ+ ์ฑ๋ฅ ํฅ์
- **์ด์ค ํ๋กํ ์ฝ**: MCP + HTTP API ๋์ ์ง์
- **OAuth 2.0**: ์์ ํ ์ธ์ฆ/์ธ๊ฐ ์์คํ
- **์์ ํ
์คํธ**: ์ ๋/ํตํฉ ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง
- **์๋ ๋ฐฐํฌ**: ์ํด๋ฆญ ํ๋ก๋์
๋ฐฐํฌ
---
## ๐๏ธ ์ํคํ
์ฒ ๋ณํ
### ๊ธฐ์กด ๊ตฌ์กฐ
```
naramarket_server/
โโโ server.py # 796์ค ๋ชจ๋ ๋ก์ง
โโโ requirements.txt
โโโ Dockerfile # ๊ธฐ๋ณธ ์ค์
โโโ tests/
โโโ test_health.py # ๋จ์ผ ํ
์คํธ
```
### ๊ฐ์ ๋ ๊ตฌ์กฐ
```
naramarket_server/
โโโ src/
โ โโโ core/ # ํต์ฌ ๋ชจ๋
โ โ โโโ client.py # API ํด๋ผ์ด์ธํธ
โ โ โโโ async_client.py # ๋น๋๊ธฐ ํด๋ผ์ด์ธํธ
โ โ โโโ config.py # ์ค์ ๊ด๋ฆฌ
โ โ โโโ models.py # ๋ฐ์ดํฐ ๋ชจ๋ธ
โ โ โโโ utils.py # ์ ํธ๋ฆฌํฐ ํจ์
โ โโโ services/ # ๋น์ฆ๋์ค ๋ก์ง
โ โ โโโ crawler.py # ํฌ๋กค๋ง ์๋น์ค
โ โ โโโ async_crawler.py # ๋น๋๊ธฐ ํฌ๋กค๋ง
โ โ โโโ auth.py # ์ธ์ฆ ์๋น์ค
โ โ โโโ file_processor.py # ํ์ผ ์ฒ๋ฆฌ
โ โโโ tools/ # MCP ๋๊ตฌ๋ค
โ โ โโโ base.py # ๋ฒ ์ด์ค ํด๋์ค
โ โ โโโ naramarket.py # ๋๋ผ์ฅํฐ ๋๊ตฌ
โ โโโ api/ # HTTP API
โ โ โโโ app.py # FastAPI ์ฑ
โ โ โโโ routes.py # API ๋ผ์ฐํธ
โ โ โโโ auth_routes.py # ์ธ์ฆ ๋ผ์ฐํธ
โ โโโ main.py # ๋ฉ์ธ ์ํธ๋ฆฌํฌ์ธํธ
โโโ tests/ # ์์ ํ ํ
์คํธ ์ํธ
โ โโโ test_utils.py
โ โโโ test_api.py
โ โโโ test_auth.py
โโโ deployments/ # ๋ฐฐํฌ ํ๊ฒฝ
โ โโโ docker-compose.yml
โ โโโ nginx/
โ โโโ .env.example
โ โโโ deploy.sh
โโโ docs/ # ๋ฌธ์ํ
```
---
## โก ์ฑ๋ฅ ๊ฐ์
### ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋์
- **๊ธฐ์กด**: ์์ฐจ์ API ํธ์ถ
- **๊ฐ์ **: ๋์ ์ฒ๋ฆฌ (์ต๋ 10๊ฐ ์์ฒญ)
- **์ฑ๋ฅ ํฅ์**: 10๋ฐฐ ์ด์ ์๋ ๊ฐ์
### ์ปค๋ฅ์
ํ๋ง
- **TCP ์ปค๋ฅ์
์ฌ์ฌ์ฉ**
- **DNS ์บ์ฑ** (5๋ถ)
- **ํ์์์ ์ต์ ํ**
### ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ
- **์คํธ๋ฆฌ๋ฐ ์ฒ๋ฆฌ**: ๋์ฉ๋ ๋ฐ์ดํฐ ๋ฉ๋ชจ๋ฆฌ ์ฐํ
- **์์ ํ์ผ ๊ด๋ฆฌ**: ์๋ ์ ๋ฆฌ
- **๊ฐ๋น์ง ์ปฌ๋ ์
** ์ต์ ํ
---
## ๐ ๋ณด์ ๊ฐํ
### OAuth 2.0 ์ธ์ฆ ์์คํ
```
์ธ์ฆ ํ๋ก์ฐ:
1. ํด๋ผ์ด์ธํธ โ ๋ก๊ทธ์ธ ์์ฒญ
2. ์๋ฒ โ JWT ํ ํฐ ๋ฐ๊ธ
3. API ์์ฒญ ์ ํ ํฐ ๊ฒ์ฆ
4. ์ค์ฝํ ๊ธฐ๋ฐ ๊ถํ ํ์ธ
```
### ์ง์๋๋ ์ธ์ฆ ๋ฐฉ์
- **Password Grant**: ์ฌ์ฉ์ ๋ก๊ทธ์ธ
- **Client Credentials**: ์๋น์ค ๊ฐ ์ธ์ฆ
- **Refresh Token**: ํ ํฐ ๊ฐฑ์
- **Authorization Code**: ์์ ํ OAuth ํ๋ฆ
### ๋ณด์ ๊ธฐ๋ฅ
- JWT ํ ํฐ ์ํธํ
- ํ ํฐ ๋ง๋ฃ ๊ด๋ฆฌ
- ํ์ฑ ํ ํฐ ์ถ์
- ์ค์ฝํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด
---
## ๐ HTTP API ์๋ฒ
### FastAPI ๊ธฐ๋ฐ REST API
```python
# ์ฃผ์ ์๋ํฌ์ธํธ
GET /api/v1/health # ํฌ์ค ์ฒดํฌ
POST /api/v1/crawl/list # ์ํ ๋ชฉ๋ก ์กฐํ
POST /api/v1/crawl/csv # CSV ํฌ๋กค๋ง
POST /api/v1/files/save # ํ์ผ ์ ์ฅ
GET /api/v1/server/info # ์๋ฒ ์ ๋ณด
# ์ธ์ฆ ์๋ํฌ์ธํธ
POST /auth/login # ๋ก๊ทธ์ธ
POST /auth/token # OAuth ํ ํฐ
GET /auth/me # ์ฌ์ฉ์ ์ ๋ณด
```
### ์๋ ๋ฌธ์ํ
- **OpenAPI/Swagger**: `/docs`
- **ReDoc**: `/redoc`
- **์คํค๋ง ์๋ ์์ฑ**
### ์๋ฒ์ฌ์ด๋ ์ด๋ฒคํธ (SSE)
- ์ค์๊ฐ ํฌ๋กค๋ง ์งํ ์ํฉ
- ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ์ ์ก
---
## ๐งช ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง
### ํ
์คํธ ์ข
๋ฅ
1. **์ ๋ ํ
์คํธ**
- ์ ํธ๋ฆฌํฐ ํจ์ ํ
์คํธ
- ๋ฐ์ดํฐ ๋ชจ๋ธ ๊ฒ์ฆ
- ๋น์ฆ๋์ค ๋ก์ง ํ
์คํธ
2. **ํตํฉ ํ
์คํธ**
- API ์๋ํฌ์ธํธ ํ
์คํธ
- ์ธ์ฆ ํ๋ก์ฐ ํ
์คํธ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋ ํ
์คํธ
3. **์ธ์ฆ ํ
์คํธ**
- JWT ํ ํฐ ๊ฒ์ฆ
- OAuth ํ๋ฆ ํ
์คํธ
- ๊ถํ ์ ์ด ํ
์คํธ
### ํ
์คํธ ์คํ
```bash
# ์ ์ฒด ํ
์คํธ ์คํ
pytest
# ์ปค๋ฒ๋ฆฌ์ง ํฌํจ ์คํ
pytest --cov=src tests/
# ์์ธ ์ถ๋ ฅ
pytest -v
```
---
## ๐ณ ๋ฐฐํฌ ํ๊ฒฝ
### Docker ๋ฉํฐ์คํ
์ด์ง ๋น๋
```dockerfile
# ๊ฐ๋ฐ ํ๊ฒฝ
FROM python:3.11-slim as development
# ์ ์ฒด ์์ค ์ฝ๋ ํฌํจ
# ํ๋ก๋์
ํ๊ฒฝ
FROM base as production
# ์ต์ ํ์ ํ์ผ๋ง ํฌํจ
# ๋ณด์ ๊ฐํ (non-root user)
```
### Docker Compose ์ ์ฒด ์คํ
```yaml
services:
- naramarket-mcp # ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์
- redis # ์บ์ฑ/์ธ์
์ ์ฅ
- nginx # ๋ฆฌ๋ฒ์ค ํ๋ก์
- prometheus # ๋ฉํธ๋ฆญ ์์ง
- grafana # ๋ชจ๋ํฐ๋ง ๋์๋ณด๋
```
### ๋ฐฐํฌ ์๋ํ
```bash
# ์ํด๋ฆญ ๋ฐฐํฌ
./deployments/deploy.sh deploy
# ์๋น์ค ๊ด๋ฆฌ
./deployments/deploy.sh status
./deployments/deploy.sh logs
./deployments/deploy.sh restart
```
---
## ๐ ๋ชจ๋ํฐ๋ง ์์คํ
### ๋ฉํธ๋ฆญ ์์ง (Prometheus)
- API ์๋ต ์๊ฐ
- ์์ฒญ ์ฑ๊ณต/์คํจ์จ
- ๋ฆฌ์์ค ์ฌ์ฉ๋ฅ
- ์๋ฌ ๋ฐ์ ๋น๋
### ๋์๋ณด๋ (Grafana)
- ์ค์๊ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
- ์๋ฆผ ์์คํ
- ํ์คํ ๋ฆฌ์ปฌ ๋ฐ์ดํฐ ๋ถ์
### ํฌ์ค ์ฒดํฌ
```bash
curl http://localhost:8000/api/v1/health
```
---
## ๐ง ๊ฐ๋ฐ ๋๊ตฌ
### ์ฝ๋ ํ์ง
- **Type Hints**: ์์ ํ ํ์
์ง์
- **Pydantic Models**: ๋ฐ์ดํฐ ๊ฒ์ฆ
- **Error Handling**: ์ฒด๊ณ์ ์ธ ์์ธ ์ฒ๋ฆฌ
### ๊ฐ๋ฐ ํจ์จ์ฑ
- **Hot Reload**: ๊ฐ๋ฐ ์ค ์๋ ์ฌ์์
- **์๋ ๋ฌธ์ํ**: API ๋ฌธ์ ์๋ ์์ฑ
- **ํ๊ฒฝ ๋ถ๋ฆฌ**: ๊ฐ๋ฐ/์คํ
์ด์ง/ํ๋ก๋์
---
## ๐ ์ฑ๊ณผ ์งํ
### ๊ฐ๋ฐ ์์ฐ์ฑ
- **์ฝ๋ ๊ฐ๋
์ฑ**: 10๋ฐฐ ํฅ์ (๋ชจ๋ํ)
- **์ ์ง๋ณด์์ฑ**: ๊ฐ๋ณ ๋ชจ๋ ๋
๋ฆฝ ์์
- **ํ์ฅ์ฑ**: ์ API ์ถ๊ฐ ์ฉ์ด์ฑ
### ์์คํ
์ฑ๋ฅ
- **์ฒ๋ฆฌ ์๋**: 10๋ฐฐ+ ํฅ์ (๋น๋๊ธฐ)
- **๋์ ์ฒ๋ฆฌ**: 1๊ฐ โ 10๊ฐ+ ์์ฒญ
- **๋ฉ๋ชจ๋ฆฌ ํจ์จ**: ๋์ฉ๋ ๋ฐ์ดํฐ ์์ ์ฒ๋ฆฌ
### ์ด์ ์์ ์ฑ
- **๋ณด์**: OAuth 2.0 ์ธ์ฆ
- **๋ชจ๋ํฐ๋ง**: ์ค์๊ฐ ์ํ ์ถ์
- **๋ฐฐํฌ**: ๋ฌด์ค๋จ ๋ฐฐํฌ ๊ฐ๋ฅ
---
## ๐ ์ฌ์ฉ ๋ฐฉ๋ฒ
### 1. ๋น ๋ฅธ ์์
```bash
# ์ ์ฅ์ ํด๋ก
git clone <repository>
cd naramarket_server
# ํ๊ฒฝ ์ค์
cd deployments
cp .env.example .env
# .env์์ NARAMARKET_SERVICE_KEY ์ค์
# ๋ฐฐํฌ ์คํ
chmod +x deploy.sh
./deploy.sh deploy
```
### 2. MCP ๋ชจ๋ ์คํ
```bash
# ๊ธฐ์กด MCP ๋ฐฉ์
python src/main.py
# ๋๋ ํจํค์ง ์ค์น ํ
pip install .
naramarket-mcp
```
### 3. HTTP API ๋ชจ๋ ์คํ
```bash
# FastAPI ์๋ฒ
uvicorn src.api.app:app --host 0.0.0.0 --port 8000
# ๋๋ Docker
docker-compose up -d
```
### 4. API ์ฌ์ฉ ์์
```python
import requests
# ๋ก๊ทธ์ธ
response = requests.post("http://localhost:8000/auth/login", json={
"username": "admin",
"password": "admin123"
})
token = response.json()["access_token"]
# API ํธ์ถ
headers = {"Authorization": f"Bearer {token}"}
response = requests.post("http://localhost:8000/api/v1/crawl/list",
json={"category": "๋ฐ์คํฌํฑ์ปดํจํฐ"},
headers=headers
)
```
---
## ๐ฎ ํฅํ ๊ฐ๋ฐ ๊ณํ
### ๋จ๊ธฐ ๋ชฉํ (1-2๊ฐ์)
- [ ] Context7 MCP ์๋ฒ ์ฐ๊ฒฐ
- [ ] Redis ๊ธฐ๋ฐ ์บ์ฑ ์์คํ
- [ ] ๋ ๋ง์ ๊ณต๊ณต๋ฐ์ดํฐ API ์ง์
### ์ค๊ธฐ ๋ชฉํ (3-6๊ฐ์)
- [ ] ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ
- [ ] ๊ธฐ๊ณํ์ต ๊ธฐ๋ฐ ๋ฐ์ดํฐ ๋ถ์
- [ ] ๋์๋ณด๋ ์น UI
### ์ฅ๊ธฐ ๋ชฉํ (6๊ฐ์+)
- [ ] ๋ฉํฐํ
๋ํธ ์ง์
- [ ] ๊ธ๋ก๋ฒ ๋ฐฐํฌ (CDN)
- [ ] ์ํฐํ๋ผ์ด์ฆ ๊ธฐ๋ฅ
---
## ๐ ๋ฌธ์ ๋ฐ ์ง์
### ๊ธฐ์ ๋ฌธ์
- **์ด์ ๋ฑ๋ก**: GitHub Issues ํ์ฉ
- **๋ฌธ์**: `/docs` ์๋ํฌ์ธํธ ์ฐธ์กฐ
- **API ๋ฌธ์**: http://localhost:8000/docs
### ๋ฐฐํฌ ๋ฌธ์
```bash
# ๋ก๊ทธ ํ์ธ
./deployments/deploy.sh logs
# ํฌ์ค ์ฒดํฌ
./deployments/deploy.sh health
# ์๋น์ค ์ฌ์์
./deployments/deploy.sh restart
```
---
## ๐ ๊ฒฐ๋ก
์ด๋ฒ ๊ณ ๋ํ ํ๋ก์ ํธ๋ฅผ ํตํด **๋จ์ํ MVP**์์ **์ํฐํ๋ผ์ด์ฆ๊ธ ํ๋ก๋์
์๋น์ค**๋ก ์ฑ๊ณต์ ์ผ๋ก ์ ํํ์ต๋๋ค.
### ํต์ฌ ์ฑ๊ณผ
โ
**10๋ฐฐ ์ฑ๋ฅ ํฅ์** (๋น๋๊ธฐ ์ฒ๋ฆฌ)
โ
**์์ ํ ๋ณด์ ์ฒด๊ณ** (OAuth 2.0)
โ
**ํ์ฅ ๊ฐ๋ฅํ ์ํคํ
์ฒ**
โ
**์๋ํ๋ ๋ฐฐํฌ ํ๊ฒฝ**
โ
**์์ ํ ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง**
์ด์ **์ง์ง ํ๋ก๋์
์์ ์ฌ์ฉํ ์ ์๋ ์๋น์ค**๊ฐ ๋์์ต๋๋ค! ๐ฏ
---
*ํ๋ก์ ํธ ์๋ฃ์ผ: 2025๋
1์*
*๋ด๋น์: Claude Code Assistant*