# ๐๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ - WorkflowMCP Dashboard API
## ๐ฏ ์ค๊ณ ์์น
1. **๊ธฐ์กด ์คํค๋ง ๋ณด์กด**: ํ์ฌ SQLite ์คํค๋ง ์์ ์์ด ํ์ฅ๋ง
2. **API ๋ฉํ๋ฐ์ดํฐ ์ง์**: Help, Schema, Example ๋ฐ์ดํฐ ์ ์ฅ
3. **์ฑ๋ฅ ์ต์ ํ**: API ์๋ต ์๋ ํฅ์์ ์ํ ์ธ๋ฑ์ค ์ถ๊ฐ
4. **ํ์ฅ์ฑ**: ํฅํ ๊ธฐ๋ฅ ์ถ๊ฐ๋ฅผ ์ํ ์ ์ฐํ ๊ตฌ์กฐ
## ๐ ๊ธฐ์กด ์คํค๋ง ๋ถ์
### ํ์ฌ ํต์ฌ ํ
์ด๋ธ (์ ์ง)
```sql
-- ๊ธฐ์กด ํ
์ด๋ธ๋ค (์์ ์์)
prds (id, title, description, requirements, acceptance_criteria, priority, status, project_id, created_at, updated_at)
tasks (id, title, description, status, priority, assignee, due_date, estimated_hours, actual_hours, tags, project_id, created_at, updated_at)
documents (id, title, content, doc_type, category, summary, tags, status, project_id, created_at, updated_at)
document_links (id, document_id, entity_type, entity_id, link_type, created_at)
task_dependencies (id, task_id, depends_on_task_id, dependency_type, created_at)
-- FTS ํ
์ด๋ธ (์ ์ง)
documents_fts (document_id, title, content, category, tags)
```
### ๊ธฐ์กด ์ธ๋ฑ์ค (์ ์ง)
```sql
-- ์ฑ๋ฅ ์ธ๋ฑ์ค๋ค (๊ธฐ์กด)
CREATE INDEX idx_prds_status ON prds(status);
CREATE INDEX idx_prds_project_id ON prds(project_id);
CREATE INDEX idx_tasks_status ON tasks(status);
CREATE INDEX idx_tasks_assignee ON tasks(assignee);
CREATE INDEX idx_documents_type ON documents(doc_type);
CREATE INDEX idx_documents_category ON documents(category);
```
## ๐ API ํ์ฅ ํ
์ด๋ธ
### 1. API ๋ฉํ๋ฐ์ดํฐ ํ
์ด๋ธ
#### api_schemas - API ์คํค๋ง ์ ๋ณด
```sql
CREATE TABLE api_schemas (
id INTEGER PRIMARY KEY AUTOINCREMENT,
endpoint VARCHAR(255) NOT NULL UNIQUE, -- '/api/prds', '/api/tasks' ๋ฑ
method VARCHAR(10) NOT NULL, -- 'GET', 'POST', 'PUT', 'DELETE'
category VARCHAR(100) NOT NULL, -- 'prds', 'tasks', 'documents' ๋ฑ
input_schema TEXT, -- JSON Schema for request body
output_schema TEXT, -- JSON Schema for response
description TEXT, -- API ์๋ํฌ์ธํธ ์ค๋ช
deprecated BOOLEAN DEFAULT FALSE, -- ํ๊ธฐ ์์ ์ฌ๋ถ
version VARCHAR(20) DEFAULT 'v1', -- API ๋ฒ์
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- ์ธ๋ฑ์ค
CREATE INDEX idx_api_schemas_endpoint ON api_schemas(endpoint);
CREATE INDEX idx_api_schemas_category ON api_schemas(category);
CREATE INDEX idx_api_schemas_method ON api_schemas(method);
```
#### api_examples - API ์ฌ์ฉ ์์
```sql
CREATE TABLE api_examples (
id INTEGER PRIMARY KEY AUTOINCREMENT,
schema_id INTEGER NOT NULL, -- api_schemas.id ์ฐธ์กฐ
name VARCHAR(255) NOT NULL, -- ์์ ์ด๋ฆ
description TEXT, -- ์์ ์ค๋ช
request_example TEXT, -- ์์ฒญ ์์ (JSON)
response_example TEXT, -- ์๋ต ์์ (JSON)
curl_example TEXT, -- cURL ๋ช
๋ น์ด ์์
scenario VARCHAR(100), -- 'basic', 'advanced', 'error' ๋ฑ
order_index INTEGER DEFAULT 0, -- ํ์ ์์
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (schema_id) REFERENCES api_schemas(id) ON DELETE CASCADE
);
-- ์ธ๋ฑ์ค
CREATE INDEX idx_api_examples_schema_id ON api_examples(schema_id);
CREATE INDEX idx_api_examples_scenario ON api_examples(scenario);
```
#### api_help_content - Help ์ปจํ
์ธ
```sql
CREATE TABLE api_help_content (
id INTEGER PRIMARY KEY AUTOINCREMENT,
path VARCHAR(255) NOT NULL UNIQUE, -- '/help/prds/overview' ๋ฑ
title VARCHAR(255) NOT NULL, -- ๋์๋ง ์ ๋ชฉ
content TEXT NOT NULL, -- ๋์๋ง ๋ด์ฉ (Markdown)
category VARCHAR(100) NOT NULL, -- 'prds', 'tasks', 'getting-started' ๋ฑ
subcategory VARCHAR(100), -- 'overview', 'examples', 'troubleshooting' ๋ฑ
tags TEXT, -- ๊ฒ์์ฉ ํ๊ทธ (JSON array)
order_index INTEGER DEFAULT 0, -- ํ์ ์์
parent_path VARCHAR(255), -- ์์ ๋์๋ง ๊ฒฝ๋ก
version VARCHAR(20) DEFAULT 'v1', -- ๋์๋ง ๋ฒ์
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- ์ธ๋ฑ์ค
CREATE INDEX idx_api_help_path ON api_help_content(path);
CREATE INDEX idx_api_help_category ON api_help_content(category);
CREATE INDEX idx_api_help_parent ON api_help_content(parent_path);
-- FTS for help content search
CREATE VIRTUAL TABLE api_help_fts USING fts5(
help_id UNINDEXED,
title,
content,
category,
tags,
content='api_help_content',
content_rowid='id'
);
-- FTS ํธ๋ฆฌ๊ฑฐ
CREATE TRIGGER api_help_fts_insert AFTER INSERT ON api_help_content BEGIN
INSERT INTO api_help_fts(help_id, title, content, category, tags)
VALUES (new.id, new.title, new.content, new.category, new.tags);
END;
CREATE TRIGGER api_help_fts_update AFTER UPDATE ON api_help_content BEGIN
UPDATE api_help_fts SET title = new.title, content = new.content,
category = new.category, tags = new.tags
WHERE help_id = new.id;
END;
CREATE TRIGGER api_help_fts_delete AFTER DELETE ON api_help_content BEGIN
DELETE FROM api_help_fts WHERE help_id = old.id;
END;
```
### 2. API ์ฌ์ฉ ํต๊ณ ํ
์ด๋ธ
#### api_usage_stats - API ์ฌ์ฉ ํต๊ณ
```sql
CREATE TABLE api_usage_stats (
id INTEGER PRIMARY KEY AUTOINCREMENT,
endpoint VARCHAR(255) NOT NULL, -- API ์๋ํฌ์ธํธ
method VARCHAR(10) NOT NULL, -- HTTP ๋ฉ์๋
status_code INTEGER NOT NULL, -- HTTP ์ํ ์ฝ๋
response_time_ms INTEGER, -- ์๋ต ์๊ฐ (๋ฐ๋ฆฌ์ด)
request_size INTEGER, -- ์์ฒญ ํฌ๊ธฐ (bytes)
response_size INTEGER, -- ์๋ต ํฌ๊ธฐ (bytes)
user_agent TEXT, -- User-Agent
session_id VARCHAR(100), -- ์ธ์
ID
error_message TEXT, -- ์๋ฌ ๋ฉ์์ง (์คํจ ์)
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- ์ธ๋ฑ์ค (์ฑ๋ฅ ๋ถ์์ฉ)
CREATE INDEX idx_api_usage_endpoint ON api_usage_stats(endpoint);
CREATE INDEX idx_api_usage_status ON api_usage_stats(status_code);
CREATE INDEX idx_api_usage_created ON api_usage_stats(created_at);
CREATE INDEX idx_api_usage_session ON api_usage_stats(session_id);
```
#### api_rate_limits - Rate Limiting
```sql
CREATE TABLE api_rate_limits (
id INTEGER PRIMARY KEY AUTOINCREMENT,
identifier VARCHAR(255) NOT NULL, -- IP ์ฃผ์ ๋๋ API ํค
endpoint VARCHAR(255), -- ํน์ ์๋ํฌ์ธํธ (NULL์ด๋ฉด ์ ์ฒด)
request_count INTEGER DEFAULT 0, -- ํ์ฌ ์์ฒญ ์
window_start DATETIME NOT NULL, -- ์๋์ฐ ์์ ์๊ฐ
window_duration INTEGER DEFAULT 900, -- ์๋์ฐ ์ง์์๊ฐ (์ด, ๊ธฐ๋ณธ 15๋ถ)
max_requests INTEGER DEFAULT 1000, -- ์ต๋ ์์ฒญ ์
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE(identifier, endpoint, window_start)
);
-- ์ธ๋ฑ์ค
CREATE INDEX idx_rate_limits_identifier ON api_rate_limits(identifier);
CREATE INDEX idx_rate_limits_window ON api_rate_limits(window_start);
```
### 3. ์ค์๊ฐ ํต์ ํ
์ด๋ธ
#### sse_connections - SSE ์ฐ๊ฒฐ ๊ด๋ฆฌ
```sql
CREATE TABLE sse_connections (
id INTEGER PRIMARY KEY AUTOINCREMENT,
session_id VARCHAR(100) NOT NULL UNIQUE, -- ์ธ์
ID
connection_id VARCHAR(100) NOT NULL, -- ์ฐ๊ฒฐ ID
filters TEXT, -- ์ด๋ฒคํธ ํํฐ (JSON)
connected_at DATETIME DEFAULT CURRENT_TIMESTAMP,
last_ping DATETIME DEFAULT CURRENT_TIMESTAMP,
is_active BOOLEAN DEFAULT TRUE
);
-- ์ธ๋ฑ์ค
CREATE INDEX idx_sse_session ON sse_connections(session_id);
CREATE INDEX idx_sse_active ON sse_connections(is_active);
```
#### sse_events - SSE ์ด๋ฒคํธ ํ
```sql
CREATE TABLE sse_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
event_type VARCHAR(100) NOT NULL, -- 'prd:created', 'task:updated' ๋ฑ
entity_type VARCHAR(50) NOT NULL, -- 'prd', 'task', 'document'
entity_id VARCHAR(100) NOT NULL, -- ์ํฐํฐ ID
event_data TEXT, -- ์ด๋ฒคํธ ๋ฐ์ดํฐ (JSON)
session_filters TEXT, -- ๋์ ์ธ์
ํํฐ (JSON array)
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
processed_at DATETIME, -- ์ฒ๋ฆฌ ์๋ฃ ์๊ฐ
is_processed BOOLEAN DEFAULT FALSE
);
-- ์ธ๋ฑ์ค
CREATE INDEX idx_sse_events_type ON sse_events(event_type);
CREATE INDEX idx_sse_events_processed ON sse_events(is_processed);
CREATE INDEX idx_sse_events_created ON sse_events(created_at);
```
### 4. API ์บ์ ํ
์ด๋ธ
#### api_cache - API ์๋ต ์บ์
```sql
CREATE TABLE api_cache (
id INTEGER PRIMARY KEY AUTOINCREMENT,
cache_key VARCHAR(255) NOT NULL UNIQUE, -- ์บ์ ํค (endpoint + params hash)
endpoint VARCHAR(255) NOT NULL, -- API ์๋ํฌ์ธํธ
params_hash VARCHAR(64), -- ํ๋ผ๋ฏธํฐ ํด์๊ฐ
response_data TEXT NOT NULL, -- ์บ์๋ ์๋ต (JSON)
content_type VARCHAR(100) DEFAULT 'application/json',
expires_at DATETIME NOT NULL, -- ๋ง๋ฃ ์๊ฐ
hit_count INTEGER DEFAULT 0, -- ํํธ ํ์
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
last_accessed DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- ์ธ๋ฑ์ค
CREATE INDEX idx_api_cache_key ON api_cache(cache_key);
CREATE INDEX idx_api_cache_expires ON api_cache(expires_at);
CREATE INDEX idx_api_cache_endpoint ON api_cache(endpoint);
```
## ๐ง ์ฑ๋ฅ ์ต์ ํ ์ธ๋ฑ์ค
### 1. API ์กฐํ ์ฑ๋ฅ ํฅ์ ์ธ๋ฑ์ค
```sql
-- PRD API ์ฑ๋ฅ ์ธ๋ฑ์ค
CREATE INDEX idx_prds_status_project ON prds(status, project_id);
CREATE INDEX idx_prds_created_desc ON prds(created_at DESC);
CREATE INDEX idx_prds_updated_desc ON prds(updated_at DESC);
-- Task API ์ฑ๋ฅ ์ธ๋ฑ์ค
CREATE INDEX idx_tasks_status_priority ON tasks(status, priority);
CREATE INDEX idx_tasks_assignee_status ON tasks(assignee, status);
CREATE INDEX idx_tasks_due_date ON tasks(due_date);
CREATE INDEX idx_tasks_project_status ON tasks(project_id, status);
-- Document API ์ฑ๋ฅ ์ธ๋ฑ์ค
CREATE INDEX idx_documents_type_status ON documents(doc_type, status);
CREATE INDEX idx_documents_category_type ON documents(category, doc_type);
CREATE INDEX idx_documents_project_type ON documents(project_id, doc_type);
-- ์ฐ๊ฒฐ ๊ด๊ณ ์ฑ๋ฅ ์ธ๋ฑ์ค
CREATE INDEX idx_document_links_entity ON document_links(entity_type, entity_id);
CREATE INDEX idx_document_links_document ON document_links(document_id, link_type);
CREATE INDEX idx_task_deps_task ON task_dependencies(task_id);
CREATE INDEX idx_task_deps_depends ON task_dependencies(depends_on_task_id);
```
### 2. ๋ณตํฉ ์ฟผ๋ฆฌ ์ต์ ํ ์ธ๋ฑ์ค
```sql
-- ๋์๋ณด๋ ์ฟผ๋ฆฌ ์ต์ ํ
CREATE INDEX idx_prds_project_status_created ON prds(project_id, status, created_at DESC);
CREATE INDEX idx_tasks_project_status_created ON tasks(project_id, status, created_at DESC);
CREATE INDEX idx_documents_project_type_created ON documents(project_id, doc_type, created_at DESC);
-- ํต๊ณ ์ฟผ๋ฆฌ ์ต์ ํ
CREATE INDEX idx_usage_stats_endpoint_date ON api_usage_stats(endpoint, DATE(created_at));
CREATE INDEX idx_usage_stats_status_date ON api_usage_stats(status_code, DATE(created_at));
```
## ๐ ๋ฐ์ดํฐ ๋ง์ด๊ทธ๋ ์ด์
์ ๋ต
### 1. ๊ธฐ์กด ๋ฐ์ดํฐ ํธํ์ฑ ๋ณด์ฅ
```sql
-- ๊ธฐ์กด ๋ฐ์ดํฐ ๊ฒ์ฆ ์ฟผ๋ฆฌ
SELECT
'prds' as table_name,
COUNT(*) as record_count,
MIN(created_at) as oldest_record,
MAX(updated_at) as latest_update
FROM prds
UNION ALL
SELECT 'tasks', COUNT(*), MIN(created_at), MAX(updated_at) FROM tasks
UNION ALL
SELECT 'documents', COUNT(*), MIN(created_at), MAX(updated_at) FROM documents;
```
### 2. API ๋ฉํ๋ฐ์ดํฐ ์ด๊ธฐ ๋ฐ์ดํฐ
```sql
-- API ์คํค๋ง ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ฝ์
INSERT INTO api_schemas (endpoint, method, category, description, input_schema, output_schema) VALUES
-- PRD API ์คํค๋ง
('/api/prds', 'GET', 'prds', 'List all PRDs with optional filtering',
'{"type": "object", "properties": {"status": {"type": "string"}, "project_id": {"type": "string"}}}',
'{"type": "object", "properties": {"success": {"type": "boolean"}, "data": {"type": "array"}}}'),
('/api/prds', 'POST', 'prds', 'Create a new PRD',
'{"type": "object", "required": ["title", "description"], "properties": {"title": {"type": "string"}, "description": {"type": "string"}}}',
'{"type": "object", "properties": {"success": {"type": "boolean"}, "data": {"type": "object"}}}'),
-- Task API ์คํค๋ง
('/api/tasks', 'GET', 'tasks', 'List all tasks with optional filtering',
'{"type": "object", "properties": {"status": {"type": "string"}, "assignee": {"type": "string"}}}',
'{"type": "object", "properties": {"success": {"type": "boolean"}, "data": {"type": "array"}}}'),
('/api/tasks', 'POST', 'tasks', 'Create a new task',
'{"type": "object", "required": ["title", "description"], "properties": {"title": {"type": "string"}, "description": {"type": "string"}}}',
'{"type": "object", "properties": {"success": {"type": "boolean"}, "data": {"type": "object"}}}');
```
### 3. Help ์ปจํ
์ธ ์ด๊ธฐ ๋ฐ์ดํฐ
```sql
-- ๊ธฐ๋ณธ Help ์ปจํ
์ธ ์ฝ์
INSERT INTO api_help_content (path, title, content, category, subcategory, order_index) VALUES
('/help/getting-started', 'WorkflowMCP API ์์ํ๊ธฐ',
'# API ์์ ๊ฐ์ด๋\n\n1. GET /api - ์ ์ฒด API ๊ตฌ์กฐ ํ์
\n2. GET /api/help/getting-started - ์ด ๊ฐ์ด๋ ์ฝ๊ธฐ\n3. ์ํ๋ ์นดํ
๊ณ ๋ฆฌ ์ ํ\n4. ์์ ํ์ธ ํ ์ฌ์ฉ',
'getting-started', 'overview', 1),
('/help/prds/overview', 'PRD ๊ด๋ฆฌ API ๊ฐ์',
'# PRD Management API\n\nProduct Requirements Document๋ฅผ ๊ด๋ฆฌํ๋ ์์ ํ API์
๋๋ค.\n\n## ๊ธฐ๋ณธ ์์
\n- GET /api/prds - PRD ๋ชฉ๋ก\n- POST /api/prds - PRD ์์ฑ\n- GET /api/prds/{id} - PRD ์กฐํ',
'prds', 'overview', 1),
('/help/tasks/overview', 'Task ๊ด๋ฆฌ API ๊ฐ์',
'# Task Management API\n\n์์
์ ์์ฑ, ๊ด๋ฆฌ, ์ถ์ ํ๋ API์
๋๋ค.\n\n## ๊ธฐ๋ณธ ์์
\n- GET /api/tasks - ์์
๋ชฉ๋ก\n- POST /api/tasks - ์์
์์ฑ\n- PUT /api/tasks/{id} - ์์
์์ ',
'tasks', 'overview', 1);
```
## ๐ ์๋ ์ ์ง๋ณด์ ํ๋ก์์
### 1. ์บ์ ์ ๋ฆฌ ํ๋ก์์
```sql
-- ๋ง๋ฃ๋ ์บ์ ์ ๋ฆฌ (cron job์ผ๋ก ์คํ)
CREATE TRIGGER cleanup_expired_cache
AFTER INSERT ON api_cache
BEGIN
DELETE FROM api_cache
WHERE expires_at < datetime('now', '-1 hour');
END;
```
### 2. ์ฌ์ฉ ํต๊ณ ์ง๊ณ ํ๋ก์์
```sql
-- ์ผ์ผ ์ฌ์ฉ ํต๊ณ ์ง๊ณ (๋งค์ผ ์คํ)
CREATE VIEW daily_api_stats AS
SELECT
DATE(created_at) as date,
endpoint,
method,
COUNT(*) as total_requests,
COUNT(CASE WHEN status_code < 400 THEN 1 END) as successful_requests,
COUNT(CASE WHEN status_code >= 400 THEN 1 END) as failed_requests,
AVG(response_time_ms) as avg_response_time,
MAX(response_time_ms) as max_response_time
FROM api_usage_stats
GROUP BY DATE(created_at), endpoint, method;
```
### 3. ์ค์๊ฐ ์ด๋ฒคํธ ์ ๋ฆฌ
```sql
-- ์ฒ๋ฆฌ๋ ์ด๋ฒคํธ ์ ๋ฆฌ (1์ผ ํ)
CREATE TRIGGER cleanup_processed_events
AFTER UPDATE ON sse_events
WHEN NEW.is_processed = TRUE
BEGIN
DELETE FROM sse_events
WHERE is_processed = TRUE
AND processed_at < datetime('now', '-1 day');
END;
```
## ๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ํฐ๋ง
### 1. ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋ทฐ
```sql
-- API ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
CREATE VIEW api_performance_monitor AS
SELECT
endpoint,
method,
COUNT(*) as requests_last_hour,
AVG(response_time_ms) as avg_response_time,
MAX(response_time_ms) as max_response_time,
COUNT(CASE WHEN status_code >= 400 THEN 1 END) as error_count,
ROUND(100.0 * COUNT(CASE WHEN status_code < 400 THEN 1 END) / COUNT(*), 2) as success_rate
FROM api_usage_stats
WHERE created_at > datetime('now', '-1 hour')
GROUP BY endpoint, method;
```
### 2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฑด๊ฐ์ฑ ์ฒดํฌ
```sql
-- ํ
์ด๋ธ ํฌ๊ธฐ ๋ฐ ์ฑ์ฅ๋ฅ ๋ชจ๋ํฐ๋ง
CREATE VIEW db_health_check AS
SELECT
name as table_name,
COUNT(*) as row_count,
AVG(LENGTH(title || description || content)) as avg_content_size
FROM sqlite_master m
JOIN (
SELECT 'prds' as name, COUNT(*) as cnt FROM prds
UNION ALL
SELECT 'tasks' as name, COUNT(*) as cnt FROM tasks
UNION ALL
SELECT 'documents' as name, COUNT(*) as cnt FROM documents
UNION ALL
SELECT 'api_schemas' as name, COUNT(*) as cnt FROM api_schemas
UNION ALL
SELECT 'api_help_content' as name, COUNT(*) as cnt FROM api_help_content
) t ON m.name = t.name
WHERE m.type = 'table';
```
## ๐ฏ ํ์ฅ์ฑ ๊ณ ๋ ค์ฌํญ
### 1. ํฅํ ํ
์ด๋ธ ํ์ฅ ์ค๋น
```sql
-- ํ๋ฌ๊ทธ์ธ ์์คํ
์ ์ํ ํ์ฅ ํ
์ด๋ธ (ํฅํ)
CREATE TABLE IF NOT EXISTS api_plugins (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(100) NOT NULL UNIQUE,
version VARCHAR(20) NOT NULL,
category VARCHAR(100) NOT NULL,
endpoints TEXT, -- JSON array of endpoints
schema_definitions TEXT, -- JSON object of schemas
help_content TEXT, -- JSON object of help content
is_enabled BOOLEAN DEFAULT TRUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
```
### 2. ๋ฉํฐํ
๋์ ์ค๋น (ํฅํ)
```sql
-- ๋ฉํฐํ
๋์ ์ง์์ ์ํ ํ
๋ํธ ํ
์ด๋ธ (ํฅํ)
CREATE TABLE IF NOT EXISTS tenants (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tenant_id VARCHAR(100) NOT NULL UNIQUE,
name VARCHAR(255) NOT NULL,
api_quota INTEGER DEFAULT 10000, -- ์๊ฐ API ํธ์ถ ํ๋
storage_quota INTEGER DEFAULT 1000, -- MB ๋จ์ ์ ์ฅ์ ํ๋
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
```
---
**์์ฑ์ผ**: 2025-09-11
**์์ฑ์**: ์์คํ
์ค๊ณ์ (Claude Code)
**๊ฒํ ์**: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ์, ๋ฐฑ์๋ ๊ฐ๋ฐ์
**๋ฒ์ **: 1.0
**์ํ**: API ์์ธ ์ค๊ณ ๋๊ธฐ