TypeScript κΈ°λ° λ¬΄μΈ μνκΈ° μ₯μΉ λ±λ‘ λ° κ΄λ¦¬ μμ€ν μ λλ€. 3κ°μ§ λ€λ₯Έ μν€ν μ² κ΅¬ν체μ μμ ν UI/UXλ₯Ό μ 곡ν©λλ€.
μ κ΅ κ°μ§μ λ¬΄μΈ μνκΈ° μ₯μΉλ€μ΄ μ€μ μλ²μ μλμΌλ‘ λ±λ‘λκ³ , κ΄λ¦¬μκ° μ΄λ₯Ό μΉμΈνκ±°λ κ±°λΆν μ μλ μμ€ν μ λλ€.
- π μ₯μΉ μλ λ±λ‘: νλμ¨μ΄ μ 보 κΈ°λ° μλ λ±λ‘
- π¨βπΌ κ΄λ¦¬μ μΉμΈ/κ±°λΆ: JWT κΈ°λ° μΈμ¦μΌλ‘ 보μ κ΄λ¦¬
- π μ€μκ° λμ보λ: μ₯μΉ μν λͺ¨λν°λ§ λ° ν΅κ³
- π μν ν΄λ§: 5λΆ κ°κ²© μΉμΈ μν νμΈ
- π μκ°ν: λ±λ‘ μΆμ΄ λ° μνλ³ λΆν¬ μ°¨νΈ
- Backend: TypeScript, NestJS/Express.js
- Database: AWS DynamoDB
- Message Queue: AWS SQS
- Frontend: HTML5, Tailwind CSS, Chart.js
- Authentication: JWT
| ꡬν체 | νλ μμν¬ | νΉμ§ | μ μ |
|---|---|---|---|
| gachaClaudeV2 | Express.js | μν°νλΌμ΄μ¦κΈ μν€ν μ², μλ²½ν κ²μ¦ | βββββ (45.29μ ) |
| gachaGptV2 | NestJS | λͺ¨λ νλ μμν¬, λ°μ½λ μ΄ν° ν¨ν΄ | βββ (34.10μ ) |
| gachaGeminiV2 | λ¨μΌνμΌ | κ΅μ‘μ©, λ°μ΄λ λ¬Έμν | βββ (35.58μ ) |
π¦ gacha-vending-machine-system
βββ π¨ UI/UX
β βββ dashboard.html # κ΄λ¦¬μ λμ보λ
β βββ device-registration.html # μ₯μΉ λ±λ‘ νλ©΄
β βββ sample-data-ui.json # UIμ© μν λ°μ΄ν°
β βββ README-UI.md # UI μ€ν κ°μ΄λ
βββ ποΈ Backend Implementations
β βββ gachaClaudeV2/ # Express.js ꡬν체 (μ΅μ°μ)
β βββ gachaGptV2/ # NestJS ꡬν체
β βββ gachaGeminiV2.ts # λ¨μΌνμΌ κ΅¬ν체
βββ π§ͺ Testing
β βββ test-gachaClaudeV2.ts # Express ν
μ€νΈ
β βββ test-gachaGptV2.ts # NestJS ν
μ€νΈ
β βββ test-gachaGeminiV2.js # λ¨μΌνμΌ ν
μ€νΈ
β βββ run-all-tests.js # ν΅ν© ν
μ€νΈ μ€νκΈ°
β βββ sample-data.json # API ν
μ€νΈμ© λ°μ΄ν°
βββ π Documentation
βββ README.md # νλ‘μ νΈ λ©μΈ λ¬Έμ
βββ README-UI.md # UI μ μ© κ°μ΄λ
# λ‘컬 μλ² μ€ν
python -m http.server 8000
# λλ
npx http-server
# λΈλΌμ°μ μμ μ μ
http://localhost:8000/dashboard.html
http://localhost:8000/device-registration.html# Node.js ν
μ€νΈ
node test-gachaGeminiV2.js
# TypeScript ν
μ€νΈ (ts-node νμ)
npx ts-node test-gachaGptV2.ts
npx ts-node test-gachaClaudeV2.ts
# μ 체 ν
μ€νΈ μ 보
node run-all-tests.jscd gachaClaudeV2
npm install
npm run dev- μ€μκ° ν΅κ³: μ 체/λκΈ°/μΉμΈ/κ±°λΆ μ₯μΉ μ
- μΉμΈ κ΄λ¦¬: μ°μ μμλ³ μ₯μΉ λͺ©λ‘ λ° μμΈ μ 보
- μμ€ν λͺ¨λν°λ§: API, DB, ν μν νμΈ
- νλ λ‘κ·Έ: λ±λ‘, μΉμΈ, κ±°λΆ μ΄λ ₯
- μ°¨νΈ: λ±λ‘ μΆμ΄ λ° μνλ³ λΆν¬
- 3λ¨κ³ λ±λ‘: κΈ°λ³Έμ 보 β μμ€ν μ 보 β νμΈ
- μ€μκ° κ²μ¦: IP μ£Όμ, UUID νμ λ±
- μν λ°μ΄ν°: μλ μ λ ₯ κΈ°λ₯
- μ§ν νμ: λ¨κ³λ³ μ§ν μν©
| λ©μλ | κ²½λ‘ | μ€λͺ | μΈμ¦ |
|---|---|---|---|
POST |
/api/devices/register |
μ₯μΉ λ±λ‘ μμ² | β |
GET |
/api/devices/status/:hardwareId |
μΉμΈ μν νμΈ | β |
GET |
/api/devices/pending |
λκΈ° μ€μΈ μ₯μΉ λͺ©λ‘ | β |
PUT |
/api/devices/:deviceId/approve |
μ₯μΉ μΉμΈ | β |
PUT |
/api/devices/:deviceId/reject |
μ₯μΉ κ±°λΆ | β |
{
"hardwareId": "VM001SEOUL2024",
"tenantId": "550e8400-e29b-41d4-a716-446655440001",
"ipAddress": "192.168.1.101",
"systemInfo": {
"os": "Ubuntu",
"version": "22.04.3 LTS",
"architecture": "x86_64",
"memory": "8GB",
"storage": "256GB SSD"
}
}{
"status": "success",
"message": "λ±λ‘ μμ² μλ£",
"data": {
"deviceId": "dev-550e8400-e29b-41d4-a716-446655440101",
"sqsQueueUrl": "https://sqs.ap-northeast-2.amazonaws.com/..."
}
}- μ λ ₯ κ²μ¦ (1.5) - νμκ°, νμ, λ²μ κ²μ¦
- μλ¬ μ²λ¦¬ (1.4) - ꡬ체μ μμΈ, HTTP μν μ½λ
- 보μ μμ (1.4) - μΈμ¦/μΈκ°, μ κ·Ό μ ν
- λ‘μ§ λν μΌ (1.3) - μꡬμ¬ν ꡬν, κ°λ μ±
- λ‘μ§ λΆλ¦¬ (1.2) - κ³μΈ΅ λΆλ¦¬, μμ‘΄μ± μ£Όμ
- API μ€κ³ (1.1) - RESTful, HTTP λ©μλ
- μλ΅ κ΅¬μ‘° (1.0) - μΌκ΄μ±, νλ λͺ λͺ
- νμ₯μ± (0.8) - λ―Έλ λμ, μ€μ λΆλ¦¬
- π₯ gachaClaudeV2: 45.29μ - μν°νλΌμ΄μ¦κΈ μμ±λ
- π₯ gachaGeminiV2: 35.58μ - κ΅μ‘μ© μ΅μ ν
- π₯ gachaGptV2: 34.10μ - λͺ¨λ νλ μμν¬
- Node.js 18+
- TypeScript 4.5+
- Python 3.7+ (λ‘컬 μλ²μ©)
- AWS CLI (μ€μ DynamoDB/SQS μ°λ μ)
- Docker (컨ν μ΄λ μ€ν μ)
- Postman (API ν μ€νΈμ©)
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€ νμ λ°°ν¬λ©λλ€. μμΈν λ΄μ©μ LICENSE νμΌμ μ°Έμ‘°νμΈμ.
- μμ€ν μν€ν μ²: 3κ°μ§ ꡬν체 λΉκ΅ λΆμ
- UI/UX λμμΈ: λ°μν μΉ λμ보λ
- ν μ€νΈ μλ리μ€: ν¬κ΄μ ν μ€νΈ μΌμ΄μ€
β μ΄ νλ‘μ νΈκ° λμμ΄ λμλ€λ©΄ Starλ₯Ό λλ¬μ£ΌμΈμ! β