kiwoom-rest-trade

πŸ› οΈ kiwoom-rest-trade 개발 ν™˜κ²½ μ„€μ • κ°€μ΄λ“œ (DEVELOPMENT_ENV.md)

λ³Έ λ¬Έμ„œλŠ” kiwoom-rest-trade 라이브러리λ₯Ό κ°œλ°œν•˜κΈ° μœ„ν•΄ μ°¨μ„ΈλŒ€ μ΄ˆκ³ μ† 파이썬 νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €μΈ uvλ₯Ό μ‚¬μš©ν•˜μ—¬ 개발 ν™˜κ²½μ„ κ΅¬μΆ•ν•˜κ³ , 정적 뢄석 및 ν…ŒμŠ€νŠΈ 도ꡬλ₯Ό μ„€μ •ν•˜λŠ” κ°€μ΄λ“œμž…λ‹ˆλ‹€.


1. 개발 도ꡬ 및 기술 μŠ€νƒ


2. ν”„λ‘œμ νŠΈ μ΄ˆκΈ°ν™” 및 κ°€μƒν™˜κ²½ μ„€μ • (uv 기반)

uvλŠ” 파이썬 μ„€μΉ˜λΆ€ν„° κ°€μƒν™˜κ²½ 생성, μ˜μ‘΄μ„± λ™κΈ°ν™”κΉŒμ§€ 번개처럼 λΉ λ₯΄κ²Œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

2.1. uv μ„€μΉ˜ (μ„€μΉ˜λ˜μ–΄ μžˆμ§€ μ•Šμ€ 경우)

# Windows (PowerShell)
irm https://astral.sh/uv/install.ps1 | iex

# Mac / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

2.2. 파이썬 κ°€μƒν™˜κ²½ 생성 및 ν™œμ„±ν™”

uvλ₯Ό μ‚¬μš©ν•˜λ©΄ ν”„λ‘œμ νŠΈ 폴더에 λ°”λ‘œ κ°€μƒν™˜κ²½μ„ μƒμ„±ν•˜κ³ , μžλ™μœΌλ‘œ 파이썬 λ²„μ „κΉŒμ§€ λ‹€μš΄λ‘œλ“œν•˜μ—¬ μ μš©ν•΄ μ€λ‹ˆλ‹€.

# ν”„λ‘œμ νŠΈ 폴더 내뢀에 파이썬 3.10 기반 κ°€μƒν™˜κ²½(.venv) 생성
uv venv --python 3.10

# κ°€μƒν™˜κ²½ ν™œμ„±ν™” (Windows PowerShell)
.venv\Scripts\activate

# κ°€μƒν™˜κ²½ ν™œμ„±ν™” (Mac / Linux)
source .venv/bin/activate

2.3. μ˜μ‘΄μ„± νŒ¨ν‚€μ§€ 동기화 (μ„€μΉ˜)

uv.lockκ³Ό pyproject.toml에 기재된 λͺ¨λ“  개발/λŸ°νƒ€μž„ νŒ¨ν‚€μ§€λ₯Ό μ΄ˆκ³ μ†μœΌλ‘œ μ„€μΉ˜ν•©λ‹ˆλ‹€.

uv sync

3. pyproject.toml ν‘œμ€€ ν…œν”Œλ¦Ώ (PEP 621 μ€€μˆ˜)

uvλŠ” νŠΉμ • 도ꡬ μ „μš© 포맷 λŒ€μ‹ , 파이썬 곡식 ν‘œμ€€ μŠ€νŽ™μΈ PEP 621 기반의 pyproject.toml을 기본으둜 μ‚¬μš©ν•©λ‹ˆλ‹€. λΉŒλ“œ λ°±μ—”λ“œλ‘œλŠ” 가볍고 ν˜„λŒ€μ μΈ hatchling을 ꢌμž₯ν•©λ‹ˆλ‹€.

[project]
name = "kiwoom-rest-trade"
version = "0.1.0"
description = "ν‚€μ›€μ¦κΆŒ μ‹ ν˜• REST/WebSocket API 비동기 파이썬 SDK"
readme = "README.md"
requires-python = ">=3.10"
license = { text = "MIT" }
authors = [
    { name = "Your Name", email = "your.email@example.com" }
]
dependencies = [
    "httpx[http2]>=0.27.0",
    "websockets>=12.0",
    "pydantic>=2.6.0",
]

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

# 개발용 μ˜μ‘΄μ„± μ •μ˜ (uv μ „μš© dependency-groups λ˜λŠ” κΈ°λ³Έ optional-dependencies)
[dependency-groups]
dev = [
    "pytest>=8.0.0",
    "pytest-asyncio>=0.23.0",
    "ruff>=0.2.0",
    "mypy>=1.8.0",
]

# Ruff μ„€μ • (λ¦°ν„° & 포맷터)
[tool.ruff]
target-version = "py310"
line-length = 100

[tool.ruff.lint]
select = [
    "E",   # pycodestyle errors
    "W",   # pycodestyle warnings
    "F",   # pyflakes
    "I",   # isort (μž„ν¬νŠΈ μ •λ ¬)
    "B",   # flake8-bugbear (잠재적 버그)
    "RUF", # Ruff 고유 κ·œμΉ™
]

# Mypy μ„€μ • (νƒ€μž… 체크)
[tool.mypy]
python_version = "3.10"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true  # μ—„κ²©ν•œ νƒ€μž… μ •μ˜ κ°•μ œ
disallow_incomplete_defs = true
ignore_missing_imports = true

# Pytest μ„€μ •
[tool.pytest.ini_options]
asyncio_mode = "auto"
testpaths = ["tests"]

# Hatch λΉŒλ“œ λŒ€μƒ νŒ¨ν‚€μ§€ 경둜 λͺ…μ‹œ
[tool.hatch.build.targets.wheel]
packages = ["kiwoom"]

4. ν’ˆμ§ˆ 관리 및 린트 검사 방법

uvλ₯Ό μ‚¬μš©ν•˜λ©΄ κ°€μƒν™˜κ²½ 내에 μ„€μΉ˜λœ μ‹€ν–‰ 도ꡬ듀을 uv run을 톡해 κ²©λ¦¬λ˜μ–΄ μ•ˆμ „ν•˜κ³  λΉ λ₯΄κ²Œ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4.1. 린트 및 μž„ν¬νŠΈ 정리 (Ruff)

# μ½”λ“œ 검사 및 μžλ™ μˆ˜μ •(Auto-fix)
uv run ruff check . --fix

# μ½”λ“œ ν¬λ§·νŒ…
uv run ruff format .

4.2. 정적 νƒ€μž… 검사 (Mypy)

uv run mypy kiwoom

5. ν…ŒμŠ€νŠΈ ν™˜κ²½ 및 검증 μ „λž΅ (Testing)

5.1. μœ λ‹› ν…ŒμŠ€νŠΈ μ‹€ν–‰

uv run pytest

5.2. 비동기 ν…ŒμŠ€νŠΈ κΈ°λ³Έ μ˜ˆμ‹œ (tests/test_client.py)

import pytest
from kiwoom import AsyncKiwoomClient

@pytest.mark.asyncio
async def test_get_balance(mock_kiwoom_server):
    client = AsyncKiwoomClient(appkey="test_key", secretkey="test_secret")
    balance = await client.domestic.get_balance(acnt_no="1234567890")
    
    assert balance.acnt_no == "1234567890"
    assert balance.tot_evlu_amt > 0

---

## 6. νŒ¨ν‚€μ§€ λΉŒλ“œ 및 배포 방법 (Packaging & Publishing)

λ³Έ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” `uv`와 `hatchling` λΉŒλ“œ λ°±μ—”λ“œλ₯Ό ν‘œμ€€μœΌλ‘œ μ±„νƒν•˜κ³  μžˆμœΌλ―€λ‘œ, λΉŒλ“œ 및 PyPI μ—…λ‘œλ“œ κ³Όμ • λ˜ν•œ λ‹¨μˆœν•˜κ³  μ§κ΄€μ μž…λ‹ˆλ‹€.

### 6.1. 배포 νŒ¨ν‚€μ§€ λΉŒλ“œ (Build)
`pyproject.toml` μŠ€νŽ™μ— 따라 휠(whl)κ³Ό μ†ŒμŠ€ 배포판(tar.gz)을 컴파일 및 μƒμ„±ν•©λ‹ˆλ‹€.
```bash
# dist/ 폴더 ν•˜μœ„μ— λΉŒλ“œ μ•„ν‹°νŒ©νŠΈ 생성
uv build

6.2. PyPI νŒ¨ν‚€μ§€ 릴리즈 및 배포 (Publish)

λΉŒλ“œλœ νŒ¨ν‚€μ§€ νŒŒμΌμ„ PyPI(Python Package Index) 곡식 μ €μž₯μ†Œμ— μ—…λ‘œλ“œ(배포)ν•©λ‹ˆλ‹€.

# 곡식 PyPI 배포 μ‹€ν–‰ (PyPI API Token ν•„μš”)
uv publish

```