๋ฐ์ดํฐ๋ฒ ์ด์ค
Supabase(PostgreSQL) ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์ํคํ ์ฒ, ์ด์ค ์ ์ฅ์ ํจํด, ์ฃผ์ ํ ์ด๋ธ ์ค๋ช , ๋ฐฑ์ /๋ณต์ ์ ์ฐจ๋ฅผ ์๋ดํฉ๋๋ค.
๊ฐ์
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
| ๋ฉ์ธ DB | Supabase ์
ํํธ์คํ
PostgreSQL (sb.dvsharp.com) |
| ๋ก์ปฌ DB | SQLite (better-sqlite3) โ ๊ณต๋์ธ์ฆ์(cert_config) ์ ์ฉ |
| ๋ง์ด๊ทธ๋ ์ด์ | supabase/migrations/ SQL ํ์ผ ์์ ์ ์ฉ |
| ์ ๊ทผ ๋ฐฉ์ | ํ๋ก ํธ์๋: anon key + RLS / ์๋ฒ: service_role key |
v0.43.0์์ SQLite โ Supabase ๋ง์ด๊ทธ๋ ์ด์ ์๋ฃ. ์ธ์ฆ์ ๋ฐ์ด๋๋ฆฌ๋ง ๋ก์ปฌ SQLite์ ์ ์งํฉ๋๋ค.
์ด์ค ์ ์ฅ์ ์ํคํ ์ฒ
์์คํ ์ ๋ฉ๋ชจ๋ฆฌ์ Supabase ๋ ๊ณณ์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ํธ์งํ๋ ๋์์๋ ๋ฉ๋ชจ๋ฆฌ์์ ์์ ํ๊ณ , ๋ช ์์ ์ผ๋ก DB์ ๋๊ธฐํํ๋ ๊ตฌ์กฐ์ ๋๋ค.
์์
์
๋ก๋ โ [ํ์ฑ] โ ๋ฉ๋ชจ๋ฆฌ(Zustand Store) + Supabase(kpis_gap_rows/kpis_eul_rows)
โ
์ฌ์ฉ์ ํธ์ง (๋ฉ๋ชจ๋ฆฌ๋ง ๋ณ๊ฒฝ)
โ
flushCurrentDate()
โ
Supabase์ ์ต์ข
์ํ ์ ์ฅ (RPC)๋์ ๋ฐฉ์
| ๋จ๊ณ | ์ ์ฅ ์์น | ์ค๋ช |
|---|---|---|
| ์ ๋ก๋ | ๋ฉ๋ชจ๋ฆฌ + Supabase | ํ์ฑ ๊ฒฐ๊ณผ๋ฅผ ์์ชฝ์ ๋์ ์ ์ฅ (kpis_upload_gap_eul RPC) |
| ํธ์ง | ๋ฉ๋ชจ๋ฆฌ๋ง | ์ฝ๋๋งคํ, ๊ท์น ์ ์ฉ, ์๋ ์์ โ ๋ฉ๋ชจ๋ฆฌ์์๋ง ์ฒ๋ฆฌ |
| ๋๊ธฐํ | Supabase | flushCurrentDate() ํธ์ถ ์ ๋ฉ๋ชจ๋ฆฌ ์ํ๋ฅผ DB์ ๋ฐ์ (kpis_flush_gap_rows RPC) |
| ์กฐํ | Supabase | ํ์ด์ง ์๋ก๊ณ ์นจ, ๋ ์ง ์ ํ ์ Supabase์์ ๋ก๋ |
ํธ์ง ์ค ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด ๋ง์ง๋ง ๋๊ธฐํ ์์ ์ ๋ฐ์ดํฐ๋ก ๋์๊ฐ๋๋ค. ์ค์ํ ์์ ํ์๋ ๋ฐ๋์ ๋๊ธฐํ(flush)๋ฅผ ์ํํ์ธ์.
์ฃผ์ ํ ์ด๋ธ ๊ตฌ์กฐ
๊ณต๊ธ ๋ฐ์ดํฐ
kpis_gap_rows (๊ฐ์ง ํ)
๊ฐ์ง ์์ ์์ ์ ๋ก๋๋ ๊ณต๊ธ๋ด์ญ ํ ๋ฐ์ดํฐ์ ๋๋ค. 21์ด์ ๊ฐ์ง ๋ฐ์ดํฐ์ ์ ์ถ ์ํ๋ฅผ ํจ๊ป ์ ์ฅํฉ๋๋ค.
| ์ปฌ๋ผ | ํ์ | ์ค๋ช |
|---|---|---|
| id | BIGINT PK | ์๋ ์ฆ๊ฐ |
| tenant_id | UUID | ํ ๋ํธ ์๋ณ์ (RLS) |
| report_date | TEXT | ๋ณด๊ณ ๋ ์ง (YYYY-MM-DD) |
| supply_type | TEXT | ๊ณต๊ธ๊ตฌ๋ถ (1~5) |
| seq_no | TEXT | ์ฐ๋ฒ (์์ง ๋งค์นญ ํค) |
| standard_code | TEXT | 13์๋ฆฌ ํ์ค์ฝ๋ |
| product_name | TEXT | ์ ํ๋ช |
| supply_qty | NUMERIC | ๊ณต๊ธ์๋ |
| supply_amount | NUMERIC | ๊ณต๊ธ๊ธ์ก (์ด์ก, ๋ถ๋ณ) |
| supply_price | NUMERIC | ๊ณต๊ธ๋จ๊ฐ |
| receipt_no | TEXT | API ์ ์ถ ํ ๋ถ์ฌ๋๋ ์ ์๋ฒํธ |
| submit_status | TEXT | ์ ์ถ ์ํ (submitted/registered/returned) |
| submit_error | TEXT | ์ ์ถ ์คํจ ๋ฉ์์ง |
์ ์ฒด ์ปฌ๋ผ์ ์ฌ์ ์๋ฒํธ, ์์ ํํ, ๊ณ์ฝ๋ฐฉ๋ฒ, ๊ณต๊ธํํ, ๊ฑฐ๋์ฒ ์ ๋ณด, ๋กํธ๋ฒํธ, ์ ํจ๊ธฐ๊ฐ ๋ฑ 21๊ฐ ์ด์์ ๋๋ค.
kpis_eul_rows (์์ง ํ)
๊ฐ์ง์ ์ฐ๊ฒฐ๋๋ ์์ฝํ ์ผ๋ จ๋ฒํธ/RFID ๋ฐ์ดํฐ์ ๋๋ค.
| ์ปฌ๋ผ | ํ์ | ์ค๋ช |
|---|---|---|
| id | BIGINT PK | ์๋ ์ฆ๊ฐ |
| tenant_id | UUID | ํ ๋ํธ ์๋ณ์ |
| report_date | TEXT | ๋ณด๊ณ ๋ ์ง |
| seq_no | TEXT | ์ฐ๋ฒ (๊ฐ์ง A์ด๊ณผ ๋งค์นญ) |
| serial_no | TEXT | 16์๋ฆฌ ์ผ๋ จ๋ฒํธ |
| rfid | TEXT | RFID/๋ฐ์ฝ๋ |
ํ์ค์ฝ๋ ๋ง์คํฐ
kpis_standard_codes
KPIS 13์๋ฆฌ ์์ฝํ ์๋ณ์ฝ๋ ๋ง์คํฐ ํ ์ด๋ธ์ ๋๋ค. ๋ฐ์ฝ๋ ๋ฐ์ดํฐ, ์์ ์ ๋ก๋, API ์กฐํ 3๊ฐ์ง ์์ค์์ ์ ์ฌ๋ฉ๋๋ค.
| ์ปฌ๋ผ | ํ์ | ์ค๋ช |
|---|---|---|
| std_cd | TEXT PK | 13์๋ฆฌ ํ์ค์ฝ๋ |
| kor_name | TEXT | ํ๊ธ ์ ํ๋ช |
| pack_qty | INTEGER | ํฌ์ฅ๋จ์ |
| up_cost | NUMERIC | ์ํ๊ฐ |
| pay_type | INTEGER | ๊ธ์ฌ๊ตฌ๋ถ (0:๊ธ์ฌ, 9:๋น๊ธ์ฌ) |
| spc_gnl_cd | INTEGER | ์ ๋ฌธ/์ผ๋ฐ (1:์ผ๋ฐ, 2:์ ๋ฌธ, 3:๊ธฐํ) |
| source | TEXT | ๋ฐ์ดํฐ ์ถ์ฒ (barcode/excel/api) |
| company | TEXT | ์ ์กฐ์ฌ |
| cancel_date | TEXT | ์ทจ์์ผ (์ฝ๋ ๋ง๋ฃ) |
kpis_code_mappings (์ฝ๋๋งคํ ํ์ต)
์ ํ๋ช ๊ณผ ํ์ค์ฝ๋์ ๋งคํ ์ด๋ ฅ์ ์ ์ฅํ์ฌ ์๋ ๋งค์นญ์ ํ์ฉํฉ๋๋ค.
| ์ปฌ๋ผ | ํ์ | ์ค๋ช |
|---|---|---|
| product_name | TEXT | ์ ํ๋ช |
| standard_code | TEXT | ๋งคํ๋ ํ์ค์ฝ๋ |
| supply_type | TEXT | ๊ณต๊ธ๊ตฌ๋ถ (ํญ๋ณ ๋ ๋ฆฝ ๊ด๋ฆฌ) |
| usage_count | INTEGER | ์ฌ์ฉ ํ์ (๋์์๋ก ์ฐ์ ์ ์ฉ) |
| last_used | TIMESTAMPTZ | ๋ง์ง๋ง ์ฌ์ฉ ์ผ์ |
๊ท์น ๋ฐ ํ์ต
kpis_batch_rules (์ผ๊ด ์์ ๊ท์น)
์ฌ์ฉ์๊ฐ ์ ์ํ ์กฐ๊ฑด-์ก์ ๊ท์น์ ๋๋ค. ์ฐ์ ์์ ์์๋๋ก ์ ์ฉ๋ฉ๋๋ค.
| ์ปฌ๋ผ | ํ์ | ์ค๋ช |
|---|---|---|
| id | TEXT PK | ๊ท์น ๊ณ ์ ID |
| name | TEXT | ๊ท์น ์ด๋ฆ |
| conditions | JSONB | ์กฐ๊ฑด ๋ฐฐ์ด (RuleCondition[]) |
| actions | JSONB | ์ก์
๋ฐฐ์ด (RuleAction[]) |
| priority | INTEGER | ์ฐ์ ์์ (๋์์๋ก ๋จผ์ ์ ์ฉ) |
| is_active | BOOLEAN | ํ์ฑ ์ฌ๋ถ |
| supply_type | TEXT | ์ ์ฉ ๋์ ๊ณต๊ธ๊ตฌ๋ถ |
| apply_count | INTEGER | ๋์ ์ ์ฉ ํ์ |
kpis_auto_correction_rules (์๋ ๋ณด์ )
๊ณผ๊ฑฐ ์์ ํจํด์ ํ์ตํ์ฌ ๋์ผ ์ค๋ฅ ๋ฐ์ ์ ์๋ ๋ณด์ ์ ์ ์ํฉ๋๋ค.
| ์ปฌ๋ผ | ํ์ | ์ค๋ช |
|---|---|---|
| error_type | TEXT | ์ค๋ฅ ์ ํ |
| field | TEXT | ๋ณด์ ๋์ ํ๋ |
| original_pattern | TEXT | ์๋ ๊ฐ ํจํด |
| corrected_value | TEXT | ๋ณด์ ๊ฐ |
| confidence | NUMERIC | ์ ๋ขฐ๋ (0.0~1.0) |
| apply_count | INTEGER | ์ ์ฉ ํ์ |
| success_count | INTEGER | ์ฑ๊ณต ํ์ |
| fail_count | INTEGER | ์คํจ ํ์ |
kpis_edit_history (์์ ์ด๋ ฅ)
๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ด๋ ฅ์ ๊ฐ์ฌ ์ถ์ ์ฉ์ผ๋ก ์ ์ฅํฉ๋๋ค.
| ์ปฌ๋ผ | ํ์ | ์ค๋ช |
|---|---|---|
| timestamp | TIMESTAMPTZ | ์์ ์๊ฐ |
| seq_no | TEXT | ๋์ ํ ์ฐ๋ฒ |
| field | TEXT | ๋ณ๊ฒฝ๋ ํ๋ |
| old_value | TEXT | ๋ณ๊ฒฝ ์ ๊ฐ |
| new_value | TEXT | ๋ณ๊ฒฝ ํ ๊ฐ |
| edit_type | TEXT | manual/rule/correction/auto_match |
| rule_name | TEXT | ์ ์ฉ๋ ๊ท์น ์ด๋ฆ |
์ธ์ฆ ๋ฐ ์ค์
kpis_users (์ฌ์ฉ์)
| ์ปฌ๋ผ | ํ์ | ์ค๋ช |
|---|---|---|
| id | UUID PK | Supabase Auth uid |
| TEXT UNIQUE | Google ๊ณ์ ์ด๋ฉ์ผ | |
| name | TEXT | ์ฌ์ฉ์ ์ด๋ฆ |
| approved | BOOLEAN | ์น์ธ ์ํ |
| role | TEXT | ์ญํ (admin/user) |
์ต์ด ๊ฐ์ ์ฌ์ฉ์๊ฐ ์๋์ผ๋ก
admin์ญํ ์ ๋ถ์ฌ๋ฐ์ต๋๋ค.
kpis_api_config (API ์ค์ , ์ฑ๊ธํค)
| ์ปฌ๋ผ | ํ์ | ์ค๋ช |
|---|---|---|
| apl_hbin | TEXT | ์ฌ์ ์๋ฑ๋ก๋ฒํธ |
| api_key_encrypted | TEXT | BASE64 ์ํธํ๋ API KEY |
cert_config (์ธ์ฆ์ ์ค์ โ ๋ก์ปฌ SQLite)
๋ก์ปฌ SQLite(data/local.db)์ ์ ์ฅ๋ฉ๋๋ค. ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ๋ณด์ ์ ์ฑ
์ Supabase๊ฐ ์๋ ๋ก์ปฌ์ ์ ์งํฉ๋๋ค.
| ์ปฌ๋ผ | ํ์ | ์ค๋ช |
|---|---|---|
| pfx_encrypted | TEXT | AES-256-CBC ์ํธํ๋ ์ธ์ฆ์ |
| password_encrypted | TEXT | ์ํธํ๋ ๋น๋ฐ๋ฒํธ |
| subject_cn | TEXT | ์ธ์ฆ์ ์ฃผ์ฒด |
| issuer_cn | TEXT | ๋ฐ๊ธ์ |
| valid_from / valid_to | TEXT | ์ ํจ๊ธฐ๊ฐ |
| serial_number | TEXT | ์๋ฆฌ์ผ ๋ฒํธ |
| uploaded_by | INTEGER | ์ ๋ก๋ํ ์ฌ์ฉ์ ID |
| uploaded_at | DATETIME | ์ ๋ก๋ ์๊ฐ |
๊ธฐํ ํ ์ด๋ธ
| ํ ์ด๋ธ | ์ค๋ช |
|---|---|
| kpis_file_groups | ๋ ์ง๋ณ ๊ฐ์ง/์์ง ํ์ผ ๊ทธ๋ฃน |
| kpis_unit_conversion_history | ๋จ์ ๋ณํ ์ด๋ ฅ |
| kpis_split_submissions | ๋ถํ ์ ์ก ์ด๋ ฅ |
| kpis_statistics | ๋ ์ง+๊ณต๊ธ๊ตฌ๋ถ๋ณ ํต๊ณ (UNIQUE) |
| kpis_report_ignore | ๋ฏธ๋ณด๊ณ ๋ฌด์ ๋ ์ง ๊ด๋ฆฌ |
| kpis_report_records | ๋ณด๊ณ ๊ธฐ๋ก |
| kpis_error_history | ์ค๋ฅ ๋ฐ์ ์ด๋ ฅ |
| kpis_error_solutions | ์ค๋ฅ ํด๊ฒฐ ํจํด ํ์ต |
| kpis_notification_history | ์๋ฆผ ์ด๋ ฅ |
| kpis_app_settings | ์ฑ ์ค์ (KEY-VALUE) |
| kpis_jwt_tokens | KPIS JWT ํ ํฐ ์บ์ฑ |
| kpis_price_learn | ๋จ๊ฐ ํ์ต ๋ฐ์ดํฐ |
| kpis_holidays | ๊ณตํด์ผ/ํ์ฌ ํด์ผ |
| kpis_config | ์์คํ ์ค์ |
| kpis_dashboard_cache | ๋์๋ณด๋ ์บ์ |
| kpis_master_barcode | ๋ฐ์ฝ๋ ๋ง์คํฐ ์์ค |
| kpis_master_excel | ์์ ๋ง์คํฐ ์์ค |
| kpis_master_atc | ATC ๋ง์คํฐ ์์ค |
RPC ํจ์
Supabase RPC๋ฅผ ํตํด ๋ณตํฉ ๋ฐ์ดํฐ ์กฐ์์ ์ํํฉ๋๋ค.
๋ฐ์ดํฐ ์กฐ์
| RPC | ์ฉ๋ |
|---|---|
kpis_upload_gap_eul | ๊ฐ์ง/์์ง ์ ๋ก๋ (ํธ๋์ญ์ ) |
kpis_flush_gap_rows | ๋ฉ๋ชจ๋ฆฌโDB ๋๊ธฐํ |
kpis_delete_date_data | ๋ ์ง๋ณ ๋ฐ์ดํฐ ์ญ์ |
kpis_reset_report_status | ๋ณด๊ณ ์ํ ์ด๊ธฐํ |
kpis_submit_reports | ์ ์ถ ๊ฒฐ๊ณผ ๊ธฐ๋ก |
๋์๋ณด๋
| RPC | ์ฉ๋ |
|---|---|
kpis_dashboard_overview | ์ ์ฒด ํํฉ ์์ฝ |
kpis_dashboard_by_date | ๋ ์ง๋ณ ์ง๊ณ |
kpis_dashboard_by_supply_type | ๊ณต๊ธ๊ตฌ๋ถ๋ณ ์ง๊ณ |
kpis_dashboard_monthly_amounts | ์๋ณ ๊ธ์ก ์ถ์ด |
kpis_dashboard_top_products | ์์ ์ ํ |
kpis_dashboard_top_receivers | ์์ ๊ฑฐ๋์ฒ |
kpis_get_date_summary | ๋ ์ง ์์ฝ |
kpis_get_calendar_agg | ๋ฌ๋ ฅ ์ง๊ณ |
kpis_refresh_dashboard_cache | ์บ์ ๊ฐฑ์ |
๋ง์ด๊ทธ๋ ์ด์
supabase/migrations/ ๋๋ ํ ๋ฆฌ์ ์์๋๋ก SQL ํ์ผ์ ๊ด๋ฆฌํฉ๋๋ค.
| ํ์ผ | ๋ด์ฉ |
|---|---|
| 001_kpis_schema.sql | ์ ์ฒด ํ ์ด๋ธ + ์ ๋ก๋ RPC |
| 002_rls_auth.sql | RLS ์ ์ฑ (service_role ์ ์ฒด ์ ๊ทผ) |
| 003_dashboard_rpcs.sql | ๋์๋ณด๋ RPC 10๊ฐ |
| 004_dashboard_cache.sql | ๋์๋ณด๋ ์บ์ ํ ์ด๋ธ |
| 004_master_sources.sql | ๋ง์คํฐ ์์ค ํ ์ด๋ธ 3๊ฐ |
| 005_grant_rpcs.sql | RPC ๊ถํ ์ค์ |
| 006_reorder_gap_columns.sql | gap_rows ์ปฌ๋ผ ์์ ๋ณ๊ฒฝ |
| 007_atc_drop_unique_add_clear.sql | ATC ๋ง์คํฐ ์คํค๋ง ๋ณ๊ฒฝ |
| 008_master_clear_and_sync.sql | ๋ง์คํฐ ๋๊ธฐํ |
| 009_create_kpis_holidays.sql | ๊ณตํด์ผ ํ ์ด๋ธ |
| 010_create_kpis_config.sql | ์์คํ ์ค์ ํ ์ด๋ธ |
๋ฐ์ดํฐ ๋ฐฑ์ ๋ฐ ๋ณต์
Supabase (๋ฉ์ธ DB)
Supabase ์ ํํธ์คํ ํ๊ฒฝ์์ PostgreSQL ํ์ค ๋ฐฑ์ ์ ์ฌ์ฉํฉ๋๋ค.
# Supabase PostgreSQL ๋ฐฑ์
(pg_dump)
pg_dump -h sb.dvsharp.com -U postgres -d postgres \
--schema=public -F c -f backup_$(date +%Y%m%d).dump
# ๋ณต์
pg_restore -h sb.dvsharp.com -U postgres -d postgres \
--clean --if-exists backup_20260315.dump๋ก์ปฌ SQLite (cert_config)
์ธ์ฆ์ ๋ฐ์ดํฐ๋ ๋ก์ปฌ SQLite ๋จ์ผ ํ์ผ์ ๋๋ค.
# ๋ฐฑ์
cp data/local.db data/local_backup_$(date +%Y%m%d).db
# ๋ณต์
pm2 stop kpis-dsr-api
cp /backup/local_backup.db data/local.db
pm2 restart kpis-dsr-api๋ณต์ ์ ๋ฐ๋์ ์๋ฒ๋ฅผ ์ค์งํ ํ ์งํํฉ๋๋ค.
์ ๊ธฐ ๋ฐฑ์ ๊ถ์ฅ
| ํญ๋ชฉ | ๊ถ์ฅ๊ฐ |
|---|---|
| Supabase ๋ฐฑ์ ์ฃผ๊ธฐ | ๋งค์ผ 1ํ (cron) |
| ๋ก์ปฌ DB ๋ฐฑ์ ์ฃผ๊ธฐ | ์ธ์ฆ์ ์ ๋ก๋ ์๋ง๋ค |
| ๋ณด๊ด ๊ธฐ๊ฐ | ์ต๊ทผ 30์ผ |
| ์ ์ฅ ์์น | ๋ณ๋ ๋ณผ๋ฅจ ๋๋ ์ธ๋ถ ์คํ ๋ฆฌ์ง |
๋ค์ ๋จ๊ณ
- API ๋ ํผ๋ฐ์ค โ ๋ด๋ถ/์ธ๋ถ API ์๋ํฌ์ธํธ
- ๋ฌธ์ ํด๊ฒฐ โ DB ๊ด๋ จ ์ฅ์ ๋์