DB 스키마 (schema.sql)
-- products: 제품 마스터
CREATE TABLE products (
id TEXT PRIMARY KEY, -- 'cms' | 'banking' | 'infosys' | 'connector'
name_kr TEXT NOT NULL,
name_en TEXT NOT NULL,
sort_order INTEGER NOT NULL DEFAULT 0
);
-- categories: 카테고리 마스터 (제품에 귀속)
CREATE TABLE categories (
id TEXT PRIMARY KEY,
product_id TEXT NOT NULL REFERENCES products(id),
name_kr TEXT NOT NULL,
name_en TEXT NOT NULL,
sort_order INTEGER NOT NULL DEFAULT 0
);
-- customers: 도입 고객 (실제 데이터 or 더미)
CREATE TABLE customers (
id TEXT PRIMARY KEY, -- UUID
product_id TEXT NOT NULL REFERENCES products(id),
category_id TEXT REFERENCES categories(id),
name TEXT NOT NULL,
joined_at TEXT NOT NULL, -- 'YYYY-MM-DD' 형식
created_at TEXT NOT NULL
);
-- 인덱스 (API 쿼리 성능)
CREATE INDEX idx_customers_product ON customers(product_id);
CREATE INDEX idx_customers_category ON customers(category_id);
CREATE INDEX idx_customers_joined ON customers(joined_at);
⚠️ is_new 컬럼 없음. customers 테이블에 is_new 컬럼은 존재하지 않습니다. API(customers.ts)에서 joined_at >= 당월 1일 조건으로 실시간 계산합니다.
로컬 SQLite 파일 위치
.wrangler/state/v3/d1/miniflare-D1DatabaseObject/
├── cc9b6845...cdd.sqlite # Miniflare D1 인스턴스 A
└── 6f7bfe81...d95.sqlite # Miniflare D1 인스턴스 B (동일 내용)
# 두 파일 모두 항상 같은 데이터를 유지해야 함
# add-2026.mjs 등 스크립트는 두 파일 모두 업데이트함
주의: wrangler dev 서버가 실행 중이면 SQLite 파일에 직접 쓰기가 실패(WAL 잠금)할 수 있습니다. 데이터 추가 스크립트 실행 전 서버를 먼저 종료하세요.