Skip to Content
KPIS DSR API์šด์˜์ž ๋งค๋‰ด์–ผ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

Supabase(PostgreSQL) ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์•„ํ‚คํ…์ฒ˜, ์ด์ค‘ ์ €์žฅ์†Œ ํŒจํ„ด, ์ฃผ์š” ํ…Œ์ด๋ธ” ์„ค๋ช…, ๋ฐฑ์—…/๋ณต์› ์ ˆ์ฐจ๋ฅผ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์š”

ํ•ญ๋ชฉ์„ค๋ช…
๋ฉ”์ธ DBSupabase ์…€ํ”„ํ˜ธ์ŠคํŒ… PostgreSQL (sb.dvsharp.com)
๋กœ์ปฌ DBSQLite (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)
ํŽธ์ง‘๋ฉ”๋ชจ๋ฆฌ๋งŒ์ฝ”๋“œ๋งคํ•‘, ๊ทœ์น™ ์ ์šฉ, ์ˆ˜๋™ ์ˆ˜์ • โ€” ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋งŒ ์ฒ˜๋ฆฌ
๋™๊ธฐํ™”SupabaseflushCurrentDate() ํ˜ธ์ถœ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ๋ฅผ DB์— ๋ฐ˜์˜ (kpis_flush_gap_rows RPC)
์กฐํšŒSupabaseํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ, ๋‚ ์งœ ์ „ํ™˜ ์‹œ Supabase์—์„œ ๋กœ๋“œ

ํŽธ์ง‘ ์ค‘ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ๋งˆ์ง€๋ง‰ ๋™๊ธฐํ™” ์‹œ์ ์˜ ๋ฐ์ดํ„ฐ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์ˆ˜์ • ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ ๋™๊ธฐํ™”(flush)๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

์ฃผ์š” ํ…Œ์ด๋ธ” ๊ตฌ์กฐ

๊ณต๊ธ‰ ๋ฐ์ดํ„ฐ

kpis_gap_rows (๊ฐ‘์ง€ ํ–‰)

๊ฐ‘์ง€ ์—‘์…€์—์„œ ์—…๋กœ๋“œ๋œ ๊ณต๊ธ‰๋‚ด์—ญ ํ–‰ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. 21์—ด์˜ ๊ฐ‘์ง€ ๋ฐ์ดํ„ฐ์™€ ์ œ์ถœ ์ƒํƒœ๋ฅผ ํ•จ๊ป˜ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ปฌ๋Ÿผํƒ€์ž…์„ค๋ช…
idBIGINT PK์ž๋™ ์ฆ๊ฐ€
tenant_idUUIDํ…Œ๋„ŒํŠธ ์‹๋ณ„์ž (RLS)
report_dateTEXT๋ณด๊ณ  ๋‚ ์งœ (YYYY-MM-DD)
supply_typeTEXT๊ณต๊ธ‰๊ตฌ๋ถ„ (1~5)
seq_noTEXT์—ฐ๋ฒˆ (์„์ง€ ๋งค์นญ ํ‚ค)
standard_codeTEXT13์ž๋ฆฌ ํ‘œ์ค€์ฝ”๋“œ
product_nameTEXT์ œํ’ˆ๋ช…
supply_qtyNUMERIC๊ณต๊ธ‰์ˆ˜๋Ÿ‰
supply_amountNUMERIC๊ณต๊ธ‰๊ธˆ์•ก (์ด์•ก, ๋ถˆ๋ณ€)
supply_priceNUMERIC๊ณต๊ธ‰๋‹จ๊ฐ€
receipt_noTEXTAPI ์ œ์ถœ ํ›„ ๋ถ€์—ฌ๋˜๋Š” ์ ‘์ˆ˜๋ฒˆํ˜ธ
submit_statusTEXT์ œ์ถœ ์ƒํƒœ (submitted/registered/returned)
submit_errorTEXT์ œ์ถœ ์‹คํŒจ ๋ฉ”์‹œ์ง€

์ „์ฒด ์ปฌ๋Ÿผ์€ ์‚ฌ์—…์ž๋ฒˆํ˜ธ, ์˜์—…ํ˜•ํƒœ, ๊ณ„์•ฝ๋ฐฉ๋ฒ•, ๊ณต๊ธ‰ํ˜•ํƒœ, ๊ฑฐ๋ž˜์ฒ˜ ์ •๋ณด, ๋กœํŠธ๋ฒˆํ˜ธ, ์œ ํšจ๊ธฐ๊ฐ„ ๋“ฑ 21๊ฐœ ์ด์ƒ์ž…๋‹ˆ๋‹ค.

kpis_eul_rows (์„์ง€ ํ–‰)

๊ฐ‘์ง€์— ์—ฐ๊ฒฐ๋˜๋Š” ์˜์•ฝํ’ˆ ์ผ๋ จ๋ฒˆํ˜ธ/RFID ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.

์ปฌ๋Ÿผํƒ€์ž…์„ค๋ช…
idBIGINT PK์ž๋™ ์ฆ๊ฐ€
tenant_idUUIDํ…Œ๋„ŒํŠธ ์‹๋ณ„์ž
report_dateTEXT๋ณด๊ณ  ๋‚ ์งœ
seq_noTEXT์—ฐ๋ฒˆ (๊ฐ‘์ง€ A์—ด๊ณผ ๋งค์นญ)
serial_noTEXT16์ž๋ฆฌ ์ผ๋ จ๋ฒˆํ˜ธ
rfidTEXTRFID/๋ฐ”์ฝ”๋“œ

ํ‘œ์ค€์ฝ”๋“œ ๋งˆ์Šคํ„ฐ

kpis_standard_codes

KPIS 13์ž๋ฆฌ ์˜์•ฝํ’ˆ ์‹๋ณ„์ฝ”๋“œ ๋งˆ์Šคํ„ฐ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ๋ฐ”์ฝ”๋“œ ๋ฐ์ดํ„ฐ, ์—‘์…€ ์—…๋กœ๋“œ, API ์กฐํšŒ 3๊ฐ€์ง€ ์†Œ์Šค์—์„œ ์ ์žฌ๋ฉ๋‹ˆ๋‹ค.

์ปฌ๋Ÿผํƒ€์ž…์„ค๋ช…
std_cdTEXT PK13์ž๋ฆฌ ํ‘œ์ค€์ฝ”๋“œ
kor_nameTEXTํ•œ๊ธ€ ์ œํ’ˆ๋ช…
pack_qtyINTEGERํฌ์žฅ๋‹จ์œ„
up_costNUMERIC์ƒํ•œ๊ฐ€
pay_typeINTEGER๊ธ‰์—ฌ๊ตฌ๋ถ„ (0:๊ธ‰์—ฌ, 9:๋น„๊ธ‰์—ฌ)
spc_gnl_cdINTEGER์ „๋ฌธ/์ผ๋ฐ˜ (1:์ผ๋ฐ˜, 2:์ „๋ฌธ, 3:๊ธฐํƒ€)
sourceTEXT๋ฐ์ดํ„ฐ ์ถœ์ฒ˜ (barcode/excel/api)
companyTEXT์ œ์กฐ์‚ฌ
cancel_dateTEXT์ทจ์†Œ์ผ (์ฝ”๋“œ ๋งŒ๋ฃŒ)

kpis_code_mappings (์ฝ”๋“œ๋งคํ•‘ ํ•™์Šต)

์ œํ’ˆ๋ช…๊ณผ ํ‘œ์ค€์ฝ”๋“œ์˜ ๋งคํ•‘ ์ด๋ ฅ์„ ์ €์žฅํ•˜์—ฌ ์ž๋™ ๋งค์นญ์— ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ปฌ๋Ÿผํƒ€์ž…์„ค๋ช…
product_nameTEXT์ œํ’ˆ๋ช…
standard_codeTEXT๋งคํ•‘๋œ ํ‘œ์ค€์ฝ”๋“œ
supply_typeTEXT๊ณต๊ธ‰๊ตฌ๋ถ„ (ํƒญ๋ณ„ ๋…๋ฆฝ ๊ด€๋ฆฌ)
usage_countINTEGER์‚ฌ์šฉ ํšŸ์ˆ˜ (๋†’์„์ˆ˜๋ก ์šฐ์„  ์ ์šฉ)
last_usedTIMESTAMPTZ๋งˆ์ง€๋ง‰ ์‚ฌ์šฉ ์ผ์‹œ

๊ทœ์น™ ๋ฐ ํ•™์Šต

kpis_batch_rules (์ผ๊ด„ ์ˆ˜์ • ๊ทœ์น™)

์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์กฐ๊ฑด-์•ก์…˜ ๊ทœ์น™์ž…๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„ ์ˆœ์„œ๋Œ€๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ปฌ๋Ÿผํƒ€์ž…์„ค๋ช…
idTEXT PK๊ทœ์น™ ๊ณ ์œ  ID
nameTEXT๊ทœ์น™ ์ด๋ฆ„
conditionsJSONB์กฐ๊ฑด ๋ฐฐ์—ด (RuleCondition[])
actionsJSONB์•ก์…˜ ๋ฐฐ์—ด (RuleAction[])
priorityINTEGER์šฐ์„ ์ˆœ์œ„ (๋†’์„์ˆ˜๋ก ๋จผ์ € ์ ์šฉ)
is_activeBOOLEANํ™œ์„ฑ ์—ฌ๋ถ€
supply_typeTEXT์ ์šฉ ๋Œ€์ƒ ๊ณต๊ธ‰๊ตฌ๋ถ„
apply_countINTEGER๋ˆ„์  ์ ์šฉ ํšŸ์ˆ˜

kpis_auto_correction_rules (์ž๋™ ๋ณด์ •)

๊ณผ๊ฑฐ ์ˆ˜์ • ํŒจํ„ด์„ ํ•™์Šตํ•˜์—ฌ ๋™์ผ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์ž๋™ ๋ณด์ •์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์ปฌ๋Ÿผํƒ€์ž…์„ค๋ช…
error_typeTEXT์˜ค๋ฅ˜ ์œ ํ˜•
fieldTEXT๋ณด์ • ๋Œ€์ƒ ํ•„๋“œ
original_patternTEXT์›๋ž˜ ๊ฐ’ ํŒจํ„ด
corrected_valueTEXT๋ณด์ • ๊ฐ’
confidenceNUMERIC์‹ ๋ขฐ๋„ (0.0~1.0)
apply_countINTEGER์ ์šฉ ํšŸ์ˆ˜
success_countINTEGER์„ฑ๊ณต ํšŸ์ˆ˜
fail_countINTEGER์‹คํŒจ ํšŸ์ˆ˜

kpis_edit_history (์ˆ˜์ • ์ด๋ ฅ)

๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ๊ฐ์‚ฌ ์ถ”์ ์šฉ์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ปฌ๋Ÿผํƒ€์ž…์„ค๋ช…
timestampTIMESTAMPTZ์ˆ˜์ • ์‹œ๊ฐ
seq_noTEXT๋Œ€์ƒ ํ–‰ ์—ฐ๋ฒˆ
fieldTEXT๋ณ€๊ฒฝ๋œ ํ•„๋“œ
old_valueTEXT๋ณ€๊ฒฝ ์ „ ๊ฐ’
new_valueTEXT๋ณ€๊ฒฝ ํ›„ ๊ฐ’
edit_typeTEXTmanual/rule/correction/auto_match
rule_nameTEXT์ ์šฉ๋œ ๊ทœ์น™ ์ด๋ฆ„

์ธ์ฆ ๋ฐ ์„ค์ •

kpis_users (์‚ฌ์šฉ์ž)

์ปฌ๋Ÿผํƒ€์ž…์„ค๋ช…
idUUID PKSupabase Auth uid
emailTEXT UNIQUEGoogle ๊ณ„์ • ์ด๋ฉ”์ผ
nameTEXT์‚ฌ์šฉ์ž ์ด๋ฆ„
approvedBOOLEAN์Šน์ธ ์ƒํƒœ
roleTEXT์—ญํ•  (admin/user)

์ตœ์ดˆ ๊ฐ€์ž… ์‚ฌ์šฉ์ž๊ฐ€ ์ž๋™์œผ๋กœ admin ์—ญํ• ์„ ๋ถ€์—ฌ๋ฐ›์Šต๋‹ˆ๋‹ค.

kpis_api_config (API ์„ค์ •, ์‹ฑ๊ธ€ํ†ค)

์ปฌ๋Ÿผํƒ€์ž…์„ค๋ช…
apl_hbinTEXT์‚ฌ์—…์ž๋“ฑ๋ก๋ฒˆํ˜ธ
api_key_encryptedTEXTBASE64 ์•”ํ˜ธํ™”๋œ API KEY

cert_config (์ธ์ฆ์„œ ์„ค์ • โ€” ๋กœ์ปฌ SQLite)

๋กœ์ปฌ SQLite(data/local.db)์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ๋ณด์•ˆ ์ •์ฑ…์ƒ Supabase๊ฐ€ ์•„๋‹Œ ๋กœ์ปฌ์— ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ปฌ๋Ÿผํƒ€์ž…์„ค๋ช…
pfx_encryptedTEXTAES-256-CBC ์•”ํ˜ธํ™”๋œ ์ธ์ฆ์„œ
password_encryptedTEXT์•”ํ˜ธํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ
subject_cnTEXT์ธ์ฆ์„œ ์ฃผ์ฒด
issuer_cnTEXT๋ฐœ๊ธ‰์ž
valid_from / valid_toTEXT์œ ํšจ๊ธฐ๊ฐ„
serial_numberTEXT์‹œ๋ฆฌ์–ผ ๋ฒˆํ˜ธ
uploaded_byINTEGER์—…๋กœ๋“œํ•œ ์‚ฌ์šฉ์ž ID
uploaded_atDATETIME์—…๋กœ๋“œ ์‹œ๊ฐ„

๊ธฐํƒ€ ํ…Œ์ด๋ธ”

ํ…Œ์ด๋ธ”์„ค๋ช…
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_tokensKPIS JWT ํ† ํฐ ์บ์‹ฑ
kpis_price_learn๋‹จ๊ฐ€ ํ•™์Šต ๋ฐ์ดํ„ฐ
kpis_holidays๊ณตํœด์ผ/ํšŒ์‚ฌ ํœด์ผ
kpis_config์‹œ์Šคํ…œ ์„ค์ •
kpis_dashboard_cache๋Œ€์‹œ๋ณด๋“œ ์บ์‹œ
kpis_master_barcode๋ฐ”์ฝ”๋“œ ๋งˆ์Šคํ„ฐ ์†Œ์Šค
kpis_master_excel์—‘์…€ ๋งˆ์Šคํ„ฐ ์†Œ์Šค
kpis_master_atcATC ๋งˆ์Šคํ„ฐ ์†Œ์Šค

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.sqlRLS ์ •์ฑ… (service_role ์ „์ฒด ์ ‘๊ทผ)
003_dashboard_rpcs.sql๋Œ€์‹œ๋ณด๋“œ RPC 10๊ฐœ
004_dashboard_cache.sql๋Œ€์‹œ๋ณด๋“œ ์บ์‹œ ํ…Œ์ด๋ธ”
004_master_sources.sql๋งˆ์Šคํ„ฐ ์†Œ์Šค ํ…Œ์ด๋ธ” 3๊ฐœ
005_grant_rpcs.sqlRPC ๊ถŒํ•œ ์„ค์ •
006_reorder_gap_columns.sqlgap_rows ์ปฌ๋Ÿผ ์ˆœ์„œ ๋ณ€๊ฒฝ
007_atc_drop_unique_add_clear.sqlATC ๋งˆ์Šคํ„ฐ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ
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์ผ
์ €์žฅ ์œ„์น˜๋ณ„๋„ ๋ณผ๋ฅจ ๋˜๋Š” ์™ธ๋ถ€ ์Šคํ† ๋ฆฌ์ง€

๋‹ค์Œ ๋‹จ๊ณ„