# ๐Ÿ—„๏ธ SolarPower Database History & Security Requirements ์ด ๋ฌธ์„œ๋Š” ๊ณผ๊ฑฐ์˜ ํŒŒํŽธํ™”๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—…๋ฐ์ดํŠธ ๋‚ด์—ญ๊ณผ ๋ณด์•ˆ(RLS) ์ ๊ฒ€ ๋ณด๊ณ ์„œ๋ฅผ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•œ ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค. **Supabase ๊ด€๋ฆฌ ์‹œ ์ด ๋ฌธ์„œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ณด์•ˆ ์ •์ฑ…๊ณผ ๊ณผ๊ฑฐ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.** ## 1. ๐Ÿ“‹ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ํ•ต์‹ฌ ๋ณ€๊ฒฝ ์ด๋ ฅ | ์ผ์ž | ๋‚ด์šฉ | ๋น„๊ณ  | |---|---|---| | **2026-01-23** | `daily_stats` (์ผ๋ณ„ ํ†ต๊ณ„ ์š”์•ฝ ํ…Œ์ด๋ธ”) ์‹ ์„ค ๋ฐ ์ธ๋ฑ์Šค ์ถ”๊ฐ€ | `plant_id`, `date` ๋ณตํ•ฉ ์ธ๋ฑ์Šค ๋ฐ Unique ์ œ์•ฝ์กฐ๊ฑด ์ ์šฉ | | **2026-01-23** | `plants` ํ…Œ์ด๋ธ” `initial_cumulative_kwh` ์ปฌ๋Ÿผ ์ถ”๊ฐ€ | ์‹œ์Šคํ…œ ๋„์ž… ์ด์ „์˜ ๋ˆ„์  ๋ฐœ์ „๋Ÿ‰(์ž์‚ฐ) ์ถ”์  ๋ชฉ์  | | **2026-01-30** | RLS ๋ณด์•ˆ ์ •์ฑ… ๋Œ€๊ทœ๋ชจ ์ ์šฉ | `plants`, `solar_logs`, `daily_stats`, `monthly_stats` ํ…Œ์ด๋ธ” ์ „์ฒด | | **2026-04-14** | `plants` ํ…Œ์ด๋ธ” `alerts_enabled` ์ปฌ๋Ÿผ ์ถ”๊ฐ€ (์ง„ํ–‰) | ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์•ฑ ์•Œ๋ฆผ์„ ํ† ๊ธ€๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ถˆ๋ฆฌ์–ธ ์ œ์–ด ์ปฌ๋Ÿผ ์ถ”๊ฐ€ | --- ## 2. ๐Ÿ›ก๏ธ ๋ณด์•ˆ ํ†ต์ œ ์ •์ฑ… (Row Level Security) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฃผ์š” 4๊ฐœ ํ…Œ์ด๋ธ”(`plants`, `solar_logs`, `daily_stats`, `monthly_stats`)์—๋Š” ์น˜๋ช…์ ์ธ ๋ฌด๋‹จ ์กฐ์ž‘์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์—„๊ฒฉํ•œ **RLS(Row Level Security)** ๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ### ์‚ฌ์šฉ์ž ๋“ฑ๊ธ‰๋ณ„ ๊ถŒํ•œ - **API ์„œ๋ฒ„ ๋ฐ ํฌ๋กค๋Ÿฌ (service_role)**: ๋ชจ๋“  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ž์œ ๋กœ์šด ์ฝ๊ธฐ/์“ฐ๊ธฐ(INSERT, UPDATE) ๊ถŒํ•œ ๋ณด์œ (`.env` ํŒŒ์ผ ๋‚ด `SUPABASE_KEY`๊ฐ€ `service_role` ํ† ํฐ์ด์–ด์•ผ ํ•จ). - **์ผ๋ฐ˜ ์ต๋ช… ์‚ฌ์šฉ์ž (anon ๊ถŒํ•œ - App/Dashboard)**: ์กฐํšŒ(SELECT)๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ ์ˆ˜์ •์ด๋‚˜ ์‹๋ณ„ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ์กฐ์ž‘์€ ์›์ฒœ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ```sql -- RLS ํ™œ์„ฑํ™” ์˜ˆ์‹œ ALTER TABLE plants ENABLE ROW LEVEL SECURITY; -- ์ต๋ช… ์‚ฌ์šฉ์ž๋Š” ์กฐํšŒ๋งŒ ๊ฐ€๋Šฅ CREATE POLICY "Allow anonymous read access" ON plants FOR SELECT TO anon USING (true); -- ์„œ๋น„์Šค ๋กœ์ง์€ ๋ชจ๋“  ๊ถŒํ•œ ํ—ˆ์šฉ CREATE POLICY "Allow service_role full access" ON plants FOR ALL TO service_role USING (true) WITH CHECK (true); ``` --- ## 3. ๐Ÿšจ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์šด์˜ ํ™˜๊ฒฝ ๊ถŒ์žฅ ์‚ฌํ•ญ 1. **API ํ‚ค ๊ด€๋ฆฌ ์ฃผ์˜์ **: - ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋ฐ”์ผ ์•ฑ/๋Œ€์‹œ๋ณด๋“œ ์†Œ์Šค์ฝ”๋“œ์— ์‚ฝ์ž…๋˜๋Š” Supabase Key๋Š” ๋ฐ˜๋“œ์‹œ `anon` (์ฝ๊ธฐ ์ „์šฉ ํผ๋ธ”๋ฆญ) ํ‚ค์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. - ํฌ๋กค๋Ÿฌ(`.env`)์™€ ๋ฐฑ์—”๋“œ API ์„œ๋ฒ„(`.env`)๋Š” `service_role` (๋งˆ์Šคํ„ฐ) ํ‚ค๋ฅผ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค. ์ด ํ‚ค๊ฐ€ ์™ธ๋ถ€ ์ €์žฅ์†Œ๋‚˜ ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ๊ฐ๋ณ„ํžˆ ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 2. **IP ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ฒ€ํ† **: - ์˜ค๋ผํด ํด๋ผ์šฐ๋“œ(API ์„œ๋ฒ„) ๋ฐ NAS ํฌ๋กค๋Ÿฌ ์„œ๋ฒ„์—์„œ๋งŒ Supabase DB์— ์ง์ ‘ Write ํ•  ์ˆ˜ ์žˆ๋„๋ก DB Network Restrictions ์„ค์ •์—์„œ IP ๊ธฐ๋ฐ˜ ์ œํ•œ์„ ๊ฑธ์–ด๋‘๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.