Supabase๋ PostgreSQL ๊ธฐ๋ฐ์ ์คํ์์ค Backend-as-a-Service(BaaS) ํ๋ซํผ์ผ๋ก, AWS ๋๋ ๊ตฌ๊ธ Firebase์ ํจ๊ป ํ๋์ ์ธ ๋ฐฑ์๋ ์๋ฃจ์ ์ผ๋ก ์ฃผ๋ชฉ๋ฐ๊ณ ์์ต๋๋ค. ํนํ ๋ฌด๋ฃ ํ๋์์ ์ ๊ณตํ๋ ๊ด๋ํ ๋ฆฌ์์ค ๋๋ถ์ ๊ฐ์ธ ํ๋ก์ ํธ, ์คํํธ์ , ํ๋กํ ํ์ ๊ฐ๋ฐ์ ๋๋ฆฌ ํ์ฉ๋๊ณ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ฌด๋ฃ ํ๋ ์ฌ์ฉ์๋ค์ ํ๋์ ์ ์ฝ์ฌํญ์ ๋ง์ฃผํ๊ฒ ๋ฉ๋๋ค. 7์ผ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๋์ด ์์ผ๋ฉด ํ๋ก์ ํธ๊ฐ ์๋์ผ๋ก ์ผ์์ ์ง๋ฉ๋๋ค. ์ด๋ Supabase๊ฐ ์๋ฒ ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ ์ ๋นํ ์ ์ฑ ์ด์ง๋ง, ์ ๊ธฐ์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋ ์ฌ์ด๋ ํ๋ก์ ํธ๋ ํ ์คํธ ํ๊ฒฝ์ ์ด์ํ๋ ๊ฐ๋ฐ์์๊ฒ๋ ๋ถํธํจ์ ์ผ๊ธฐํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ๋๋ฌธ์ ์๋ ํ์ฑํ๋ 7์ผ ๋นํ์ฑํ ์ ์ฑ ์ผ๋ก ์ธํ ํ๋ก์ ํธ ์ค๋จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํ์์ ์ ๋๋ค.. ์ฑ์ฅํด์ ์ฌ์ฉ์๊ฐ ์์ฃผํ๊ธฐ ์ ๊น์ง๋์ ใ ใ .
Supabase ๋ฌด๋ฃ ํ๋์ ์ดํด
์ ํํ ์ด๋ค ์ ์ฝ์ด ์๋์ง
Supabase ๋ฌด๋ฃ ํ๋์ ๊ฐ๋ฐ์๋ค์๊ฒ ์๋นํ ๊ด๋ํ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ํ์ง๋ง ํ๋ก์ ํธ ๊ณํ ์ ๊ณ ๋ คํด์ผ ํ ์ ์ฝ์ฌํญ๋ค์ด ์์ต๋๋ค:
์คํ ๋ฆฌ์ง & ๋ฆฌ์์ค
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: 500MB
- ํ์ผ ์คํ ๋ฆฌ์ง: 1GB
- ๋์ญํญ: 5GB/์
- Edge Functions: 500,000 ํธ์ถ/์
๊ทธ๋ฆฌ๊ณ ์ฃผ๋ชฉํด์ผ ํ ์ ์ฑ :
- 7์ผ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๋์ด ์์ผ๋ฉด ํ๋ก์ ํธ ์๋ ์ผ์์ ์ง
- ์ผ์์ ์ง๋ ํ๋ก์ ํธ๋ ๋์๋ณด๋์์ ์๋์ผ๋ก ์ฌํ์ฑํ ํ์
- 14์ผ ๋์ ์ผ์์ ์ง ์ํ๊ฐ ์ง์๋๋ฉด ํ๋ก์ ํธ ์ญ์ ๊ฐ๋ฅ์ฑ
์ด ์ ์ฑ ์ ์๋ฒ ๋ฆฌ์์ค ๊ด๋ฆฌ ์ฐจ์์์ ํฉ๋ฆฌ์ ์ด์ง๋ง, ๊ฐํ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ฌ์ด๋ ํ๋ก์ ํธ๋ ๋ฐ๋ชจ ํ๊ฒฝ์ ์ด์ํ๋ ๊ฐ๋ฐ์์๊ฒ๋ ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ๋ฉ๋๋ค. ํนํ ์ฌ๋ฌ ํ๋ก์ ํธ๋ฅผ ๋์์ ๊ด๋ฆฌํ ๋ ๊ฐ ํ๋ก์ ํธ์ ํ์ฑ ์ํ๋ฅผ ์ถ์ ํ๋ ๊ฒ์ด ๋ฒ๊ฑฐ๋ก์ธ ์ ์์ต๋๋ค.
์ ์ด๋ฐ ์ ์ฑ ์ด ์กด์ฌํ๋๊ฐ?
Supabase์ 7์ผ ๋นํ์ฑํ ์ ์ฑ ์ ํด๋ผ์ฐ๋ ๋ฆฌ์์ค ํจ์จ์ฑ์ ์ํ ์ ๊ณ ํ์ค ๊ดํ์ ๋๋ค. ์ค์ ๋ก ์ฌ์ฉ๋์ง ์๋ ์๋ง ๊ฐ์ ํ๋ก์ ํธ๊ฐ ์๋ฒ ์์์ ์ ์ ํ๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ, ์ค์ ์ฌ์ฉ์์๊ฒ ๋ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํ ๋ชฉ์ ์ ๋๋ค. ์ด๋ ๋ฌด๋ฃ ํฐ์ด๋ฅผ ์ง์ ๊ฐ๋ฅํ๊ฒ ์ ์งํ๊ธฐ ์ํ ํ์์ ์ธ ์กฐ์น์ด๋ฉฐ, ์ ํ ๋นํฉ๋ฆฌ์ ์ด์ง ์์ต๋๋ค.
๋ค๋ฅธ ๋์๊ณผ ๋น๊ต
| ๊ธฐ๋ฅ | Supabase ๋ฌด๋ฃ | Firebase Spark | AWS Free Tier |
|---|---|---|---|
| ๋ฐ์ดํฐ๋ฒ ์ด์ค | PostgreSQL 500MB | Firestore 1GB | DynamoDB 25GB |
| ๋นํ์ฑํ ์ ์ฑ | 7์ผ ๋ฏธ์ฌ์ฉ์ ์ ์ง | ์์ | 12๊ฐ์ ํ ์ข ๋ฃ |
| Auth | ๋ฌด์ ํ ์ฌ์ฉ์ | ๋ฌด์ ํ | Cognito 50,000 MAU |
| Storage | 1GB | 5GB | S3 5GB (12๊ฐ์) |
| ์ค์๊ฐ ๊ธฐ๋ฅ | โ | โ | โ (์ถ๊ฐ ๋น์ฉ) |
| SQL ์ง์ | โ (PostgreSQL) | โ (NoSQL) | ๋ถ๋ถ์ |
| ์์ฒด ํธ์คํ | โ | โ | โ |
Firebase์ ์ฅ์ :
- ๋นํ์ฑํ ์ ์ฑ ์ด ์์ (์ด๊ฒ ์ ์ผ ํฌ๋ค!)
- Google ์ํ๊ณ์์ ์๋ฒฝํ ํตํฉ
- ๋ ์ฑ์ํ ๋ฌธ์์ ์ปค๋ฎค๋ํฐ
Firebase์ ๋จ์ :
- NoSQL๋ง ์ง์ (๋ณต์กํ ์ฟผ๋ฆฌ๊ฐ ์ด๋ ค์)
- ๋ฐฑ์๋ ๋ก์ง์ด ๋ณต์กํด์ง๋ฉด Cloud Functions ๋น์ฉ ํญํ
- vendor lock-in์ด ์ฌํจ
AWS์ ์ฅ์ :
- ๊ฐ์ฅ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํจ
- ํ๋ก๋์ ๋ ๋ฒจ ์ธํ๋ผ
- ์ธ๋ฐํ ๋น์ฉ ์ ์ด
AWS์ ๋จ์ :
- ๋ฌ๋ ์ปค๋ธ๊ฐ ๊ฐํ๋ฆ (์ค์ ๋ง ํ๋ฃจ ๊ฑธ๋ฆผโฆ)
- ๋ฌด๋ฃ ํฐ์ด๊ฐ 12๊ฐ์ ์ ํ
- ์ค์๋ก ๊ณผ๊ธ๋ ์ํ์ฑ
์ Supabase๋ฅผ ์ ํํ๋์ง
1. ๋น ๋ฅธ ํ๋กํ ํ์ดํ
- API ์๋ ์์ฑ (ํ ์ด๋ธ ๋ง๋ค๋ฉด REST API ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅ)
- ์ค์๊ฐ ๊ธฐ๋ฅ ๋ด์ฅ (์ฑํ , ์๋ฆผ ๊ตฌํ์ด ์ฌ์)
- Row Level Security๋ก ๊ฐ๋จํ ๊ถํ ๊ด๋ฆฌ
2. ์คํ์์ค
- ์ธ์ ๊ฐ ํธ๋ํฝ์ด ํฐ์ง๋ฉด ์ง์ ํธ์คํ ๊ฐ๋ฅ
- vendor lock-in ํํผ
- ์ปค๋ฎค๋ํฐ๊ฐ ํ๋ฐํ๊ณ ํฌ๋ช ํจ
3. ๊ฐ๋ฐ์ ๊ฒฝํ
// ์ด๊ฒ ์ ๋ถ๋ค. ์ง์ง๋ก.
const { data } = await supabase.from("posts").select("*").eq("user_id", userId);
๋ณต์กํ ์ค์ ์์ด ๋ฐ๋ก ์์ํ ์ ์๋ค๋ ๊ฒ ๊ฐ์ฅ ํฐ ๋งค๋ ฅ์ ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก:
- ๋น ๋ฅด๊ฒ ํ๋กํ ํ์ ๋ง๋ค๊ณ ์ถ๋ค โ Supabase
- ๋ณต์กํ ๋ฐ์ดํฐ ๊ด๊ณ๊ฐ ์๋ค โ Supabase
- ๋นํ์ฑํ ์ ์ฑ ์ด ์ซ๋ค โ Firebase (ํ์ง๋ง ์ด์ SupabaseZombi๊ฐ ์์ต๋๋ค!)
- ํ๋ก๋์ ๋ ๋ฒจ ํ์ฅ์ฑ์ด ํ์ํ๋ค โ AWS (๋๋ Supabase Pro)
7์ผ ๋นํ์ฑํ ์ ์ฑ ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ ์๋ํ ์๋ฃจ์ ์ด ํ์ํ๊ณ , ์ด๊ฒ์ด SupabaseZombi ํ๋ก์ ํธ์ ์์์ ์ด ๋์์ต๋๋ค. ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์์ “keep-alive”๋ผ๋ ์ด๋ฆ์ผ๋ก ์กด์ฌํ๋ ์ฌ๋ฌ ํ๋ก์ ํธ๋ค์ ์ฐธ๊ณ ํ์ฌ, ๋์ฑ ๊ฐ์ ๋ ์๋ฃจ์ ์ ๋ง๋ค๊ฒ ๋์์ต๋๋ค.
๊ธฐ์ ์ ํด๊ฒฐ ๋ฐฉ์ ๋ชจ์
๊ธฐ์กด ์คํ์์ค ์๋ฃจ์ ๋ถ์
๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์์๋ ์ด๋ฏธ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ฌ๋ฌ ์คํ์์ค ํ๋ก์ ํธ๊ฐ ์กด์ฌํฉ๋๋ค. GitHub์์ ์ฐพ์ supabase-inactive-fix๋ ์ ๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ๋์ ๋ฐ์์์ผ ํ๋ก์ ํธ๋ฅผ ํ์ฑ ์ํ๋ก ์ ์งํ๋ ํ๋ฅญํ ์ ๊ทผ ๋ฐฉ์์ด์์ต๋๋ค.
ํ์ง๋ง ์ค์ ์ฌ์ฉํ๋ฉด์ ๋ช ๊ฐ์ง ๊ฐ์ ํฌ์ธํธ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค:
- ํจํด์ ๋ค์์ฑ: ๋งค๋ฒ ๋์ผํ ๊ฐ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ ๊ณ ์ ํจํด
- ๋ฐ์ดํฐ ๊ด๋ฆฌ: ์ง์์ ์ผ๋ก ๋์ ๋๋ ๋๋ฏธ ๋ฐ์ดํฐ์ ๊ด๋ฆฌ ๋ฐฉ์ ๋ถ์ฌ
- ๋ฐฐํฌ ๋ณต์ก๋: Docker ์ด๋ฏธ์ง ๋น๋ ๊ณผ์ ์ ๋ณต์ก์ฑ
- ๋ชจ๋ํฐ๋ง: ์คํ ๊ฒฐ๊ณผ์ ์ํ์ ๋ํ ์ค์๊ฐ ํผ๋๋ฐฑ ๋ถ์กฑ
SupabaseZombi ํ๋ก์ ํธ ์๊ฐ
์ด๋ฌํ ๊ฐ์ ์ ์ ๋ฐ์ํ์ฌ SupabaseZombi๋ผ๋ ์คํ์์ค ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ๊ฒ ๋์์ต๋๋ค. ์ด ํ๋ก์ ํธ๋ Supabase์ ์ ์ฑ ์ ์กด์คํ๋ฉด์๋, ๊ฐ๋ฐ์๊ฐ ํ๋ก์ ํธ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ์๋ํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
ํ๋ก์ ํธ๋ช ์ ์๋ฏธ: “Zombie(์ข๋น)”๋ ๊ณ์ํด์ ํ๋ํ๋ ํน์ฑ์ ์์ ์ ์ผ๋ก ํํํ ๊ฒ์ผ๋ก, ํ๋ก์ ํธ๊ฐ ์ง์์ ์ผ๋ก ํ์ฑ ์ํ๋ฅผ ์ ์งํ๋ค๋ ์๋ฏธ๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
ํต์ฌ ๊ธฐ์ ๊ตฌํ
1. ๋์ ๋ฐ์ดํฐ ์์ฑ ์ ๋ต
# 1. ๊ฐ๋ณ์ ๋ฐ์ดํฐ ์ฝ์
(1~10๊ฐ)
insert_count = random.randint(1, 10)
# 2. ์๊ณ๊ฐ ์ด๊ณผ ์ ์๋ ์ ๋ฆฌ (50๊ฐ ์ด๊ณผ โ 30๊ฐ ์ ์ง)
if current_count > 50:
delete_count = current_count - 30
# ์ค๋๋ ๋ฐ์ดํฐ๋ถํฐ ์ญ์
๋๋ค ์ฝ์ ๊ฐ์์ ์ด์ :
- ๊ณ ์ ํจํด ๋๋น ๋์ฑ ์์ฐ์ค๋ฌ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๋ ์๋ฎฌ๋ ์ด์
- ํธ๋ํฝ ํจํด์ด ๋ค์ํ์ฌ ์์คํ ํ ์คํธ์๋ ์ ์ฉ
์๋ ๋ฐ์ดํฐ ์ ๋ฆฌ์ ํ์์ฑ:
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ณต๊ฐ ํจ์จ์ฑ ์ ์ง (๋ฌด๋ฃ ํ๋์ 500MB ์ ํ)
- Keep-Alive ๋ชฉ์ ์ ์์ ๋ฐ์ดํฐ์ด๋ฏ๋ก ์ฅ๊ธฐ ๋ณด๊ด ๋ถํ์
- ์ผ์ ์๋ ์ ์ง๋ก ์ฟผ๋ฆฌ ์ฑ๋ฅ ์ต์ ํ
2. ์ค์ผ์ค๋ง ์์คํ
import schedule
import time
def keep_alive_job():
"""์ ๊ธฐ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๋ ์์ฑ"""
# Supabase์ ๋ฐ์ดํฐ ์ฝ์
insert_random_data()
# ์๊ณ๊ฐ ์ด๊ณผ ์ ์ค๋๋ ๋ฐ์ดํฐ ์ ๋ฆฌ
cleanup_old_data()
# 24์๊ฐ ์ฃผ๊ธฐ ์คํ (7์ผ ์ ์ฑ
๋๋น ์ถฉ๋ถํ ์ฌ์ )
schedule.every(24).hours.do(keep_alive_job)
while True:
schedule.run_pending()
time.sleep(60) # 1๋ถ๋ง๋ค ์ค์ผ์ค ํ์ธ
24์๊ฐ ์ฃผ๊ธฐ๋ 7์ผ ์ ์ฑ ์ ์ค์ํ๋ฉด์๋ ์ถฉ๋ถํ ์์ ๋ง์ง์ ํ๋ณดํ๋ ์ต์ ์ ๊ฐ๊ฒฉ์ ๋๋ค. ๋ ์งง์ ๊ฐ๊ฒฉ์ ๋ถํ์ํ ๋ฆฌ์์ค ์ฌ์ฉ์ ์ด๋ํ๋ฉฐ, Supabase์ ์ ์ฑ ์๋์๋ ๋ถํฉํ์ง ์์ต๋๋ค.
๊ฐ๋ฐ ๊ณผ์ ์์์ ๊ธฐ์ ์ ์์ฌ๊ฒฐ์
1. ๊ตฌ์ฑ ๊ด๋ฆฌ ๋ฐฉ์: ํ๊ฒฝ๋ณ์ vs ์ค์ ํ์ผ
์ด๊ธฐ์๋ ๋ชจ๋ ๊ตฌ์ฑ์ ํ๊ฒฝ๋ณ์๋ก ๊ด๋ฆฌํ๋ ์ ํต์ ์ธ ๋ฐฉ์์ ์ฑํํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋ฌ Supabase ํ๋ก์ ํธ๋ฅผ ๋์์ ๊ด๋ฆฌํด์ผ ํ๋ ์๊ตฌ์ฌํญ์ด ๋ฐ์ํ๋ฉด์ ๊ตฌ์กฐ์ ํ๊ณ์ ์ง๋ฉดํ์ต๋๋ค.
Before:
SUPABASE_URL_1=...
SUPABASE_KEY_1=...
SUPABASE_URL_2=...
SUPABASE_KEY_2=...
๊ฐ์ ๋ JSON ๊ธฐ๋ฐ ๊ตฌ์ฑ:
[
{
"name": "ํ๋ก์ ํธ1",
"supabase_url": "https://xxx.supabase.co",
"supabase_key": "your-key",
"table_name": "keep-alive"
},
{
"name": "ํ๋ก์ ํธ2",
"supabase_url": "https://yyy.supabase.co",
"supabase_key_env": "SUPABASE_KEY_2", // ํ๊ฒฝ๋ณ์ ์ฐธ์กฐ๋ ์ง์
"table_name": "keep-alive"
}
]
JSON ๊ธฐ๋ฐ ๊ตฌ์ฑ์ ์ฅ์ :
- ํ์ฅ์ฑ: ๋ฌด์ ํ ํ๋ก์ ํธ ์ถ๊ฐ ๊ฐ๋ฅ
- ๊ฐ๋ ์ฑ: ๊ตฌ์กฐํ๋ ํ์์ผ๋ก ๊ด๋ฆฌ ์ฉ์ด
- ์ ์ฐ์ฑ: ์ง์ ๊ฐ ์ ๋ ฅ๊ณผ ํ๊ฒฝ๋ณ์ ์ฐธ์กฐ ๋ชจ๋ ์ง์
- ๋ฒ์ ๊ด๋ฆฌ: Git์ผ๋ก ๊ตฌ์ฑ ์ด๋ ฅ ์ถ์ ๊ฐ๋ฅ (๋ฏผ๊ฐ ์ ๋ณด๋ .gitignore ์ฒ๋ฆฌ)
2. Docker ์ปจํ ์ด๋ํ ์ ๋ต ์ต์ ํ
๊ธฐ์กด ๋ฐฉ์์ ๋ฌธ์ ์ :
- Dockerfile ์์ฑ โ ์ด๋ฏธ์ง ๋น๋ โ ์ปจํ ์ด๋ ์คํ์ ๋ค๋จ๊ณ ํ๋ก์ธ์ค
- ์ฝ๋ ์์ ์๋ง๋ค ์ด๋ฏธ์ง ์ฌ๋น๋ ํ์
- ๋น๋ ์๊ฐ๊ณผ ๋์คํฌ ๊ณต๊ฐ ์๋ชจ
์ต์ ํ๋ ์ ๊ทผ ๋ฐฉ์:
# ๊ณต์ Python ์ด๋ฏธ์ง + ๋ณผ๋ฅจ ๋ง์ดํธ ํ์ฉ
docker run -d \
-v $(pwd)/main_standalone.py:/app/main.py:ro \
-v $(pwd)/config.json:/app/config.json:ro \
python:3.11-slim \
sh -c "pip install supabase requests && python /app/main.py"
๊ฐ์ ํจ๊ณผ:
- ๋น๋ ์ ๊ฑฐ: ์ฆ์ ์คํ ๊ฐ๋ฅ, ๊ฐ๋ฐ ์ฃผ๊ธฐ ๋จ์ถ
- ์ ์ฐ์ฑ: ์์ค ์ฝ๋ ์์ ํ ์ปจํ ์ด๋๋ง ์ฌ์์
- ๋จ์์ฑ: Dockerfile ๊ด๋ฆฌ ์ค๋ฒํค๋ ์ ๊ฑฐ
- ํ์คํ: ๊ณต์ Python ์ด๋ฏธ์ง๋ก ์ผ๊ด์ฑ ๋ณด์ฅ
3. ๊ตฌ์กฐํ๋ ๋ก๊น ์์คํ
์ด์ ๊ฐ์์ฑ ํฅ์์ ์ํ ์์ธ ๋ก๊น :
2025-10-30 09:00:00 - INFO - == '2025-10-30 09:00:00' Run start (2 servers)
2025-10-30 09:00:00 - INFO - = Server #1: My Database
2025-10-30 09:00:01 - INFO - โ SUCCESS | #15 data | Inserted: 7 | Deleted: 0
2025-10-30 09:00:01 - INFO - = Server #2: Another Database
2025-10-30 09:00:02 - INFO - โ SUCCESS | #53 data | Inserted: 5 | Deleted: 23
2025-10-30 09:00:02 - INFO - == Next run: '2025-10-31 09:00:02'
๋ก๊น ์์คํ ์ ํต์ฌ ์์:
- ํ์์คํฌํ: ๊ฐ ์์ ์ ์ ํํ ์คํ ์๊ฐ ๊ธฐ๋ก
- ์์ ๊ฒฐ๊ณผ: ์ฑ๊ณต/์คํจ ์ํ ๋ช ํํ ํ์
- ํต๊ณ ์ ๋ณด: ์ฝ์ /์ญ์ ๋ ๋ฐ์ดํฐ ๊ฐ์ ์ถ์
- ๋ค์ ์คํ ์๊ณ : ์ค์ผ์ค ํฌ๋ช ์ฑ ์ ๊ณต
๊ตฌ์กฐํ๋ ๋ก๊ทธ๋ ๋ฌธ์ ๋ฐ์ ์ ์ ์ํ ์ง๋จ๊ณผ ๋๋ฒ๊น ์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ์์คํ ์ ์ ์ ๋์ ์ฌ๋ถ๋ฅผ ์ฝ๊ฒ ๋ชจ๋ํฐ๋งํ ์ ์๊ฒ ํฉ๋๋ค.
4. ์ค์๊ฐ ์๋ฆผ ์์คํ ํตํฉ
ํ ๋ ๊ทธ๋จ ๋ด API๋ฅผ ํ์ฉํ ์๋ฆผ:
์คํ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ ๊ทธ๋จ์ผ๋ก ์ค์๊ฐ ์์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ํตํฉํ์ต๋๋ค. ์ด๋ฅผ ํตํด ์๋ฒ์ ์ง์ ์ ์ํ์ง ์๊ณ ๋ ์์คํ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค.
์๋ฆผ ๋ด์ฉ:
- โ ์ฑ๊ณต ์: ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณ ์ฒ๋ฆฌ ํต๊ณ
- โ ์คํจ ์: ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์๋ฒ ์๋ณ ๋ฐ ์ค๋ฅ ๋ฉ์์ง
- ๐ ์์ฝ ์ ๋ณด: ์ ์ฒด ํ๋ก์ ํธ ์ํ ๊ฐ์
์ด๋ฌํ ์๋ฆผ ์์คํ ์ ๋ฌธ์ ๋ฐ์ ์ ์ฆ๊ฐ์ ์ธ ๋์์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ํนํ ์ฌ๋ฌ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ ๋ ์ ์ฉํฉ๋๋ค.
์ฌ์ฉ๋ฒ
# 1. ์ ์ฅ์ ํด๋ก
git clone https://github.com/shsm0520/supabasezombi.git
cd supabasezombi
# 2. ์ค์ ํ์ผ ์์ฑ
cp config.json.example config.json
# config.json ํธ์ง
# 3. Docker Compose๋ก ์คํ
docker-compose up -d
# 4. ๋ก๊ทธ ํ์ธ
docker-compose logs -f
์ด์ ์๋ํ ์์คํ ์ด ํ๋ก์ ํธ๋ฅผ ํ์ฑ ์ํ๋ก ์ ์งํฉ๋๋ค.
ํ๋ก์ ํธ ์ฑ๊ณผ ๋ฐ ํจ๊ณผ
๋ฌ์ฑํ ๋ชฉํ
1. ์๋ํ๋ ํ๋ก์ ํธ ๊ด๋ฆฌ
- 7์ผ๋ง๋ค ๋์๋ณด๋์ ์ ์ํ์ฌ ์๋์ผ๋ก ์ฌํ์ฑํํ ํ์ ์ ๊ฑฐ
- ๊ฐ๋ฐ์๊ฐ ์ค์ ๊ฐ๋ฐ์ ์ง์คํ ์ ์๋๋ก ๊ด๋ฆฌ ๋ถ๋ด ์ต์ํ
2. ๋ฉํฐ ํ๋ก์ ํธ ์ง์
- ๋จ์ผ ์ปจํ ์ด๋๋ก ์ฌ๋ฌ Supabase ํ๋ก์ ํธ ๋์ ๊ด๋ฆฌ
- ํ๋ก์ ํธ๋ณ ๋ ๋ฆฝ์ ์ธ ์ค์ ๋ฐ ๋ชจ๋ํฐ๋ง
3. ํจ์จ์ ์ธ ๋ฆฌ์์ค ์ฌ์ฉ
- ์๋ ๋ฐ์ดํฐ ์ ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ณต๊ฐ ์ต์ ํ
- ๋ฌด๋ฃ ํ๋์ 500MB ์ ํ ๋ด์์ ์์ ์ ์ด์
4. ์ค์๊ฐ ๋ชจ๋ํฐ๋ง
- ํ ๋ ๊ทธ๋จ ์๋ฆผ์ผ๋ก ์คํ ๊ฒฐ๊ณผ ์ฆ์ ํ์ธ
- ๋ฌธ์ ๋ฐ์ ์ ์ ์ํ ๋์ ๊ฐ๋ฅ
5. ๋ฐฐํฌ ์ฉ์ด์ฑ
- Docker ๊ธฐ๋ฐ์ผ๋ก ํ๋ซํผ ๋ ๋ฆฝ์ ์คํ
- ๋ณต์กํ ์ค์ ์์ด ๋น ๋ฅธ ๊ตฌ์ถ ๊ฐ๋ฅ
ํฅํ ๊ฐ๋ฐ ๋ก๋๋งต
์ปค๋ฎค๋ํฐ ํผ๋๋ฐฑ ๊ธฐ๋ฐ ๊ฐ์ ๊ณํ
ํ๋ก์ ํธ๋ฅผ ์คํ์์ค๋ก ๊ณต๊ฐํ ํ ๋ค์ํ ์ฌ์ฉ์ ํผ๋๋ฐฑ๊ณผ ์ ์์ ๋ฐ์์ต๋๋ค. ์ด๋ฅผ ๋ฐํ์ผ๋ก ํฅํ ๊ฐ๋ฐ ๋ฐฉํฅ์ ๋ค์๊ณผ ๊ฐ์ด ๊ณํํ๊ณ ์์ต๋๋ค.
๋จ๊ธฐ ๋ก๋๋งต (๊ตฌํ ์์ ) โ
1. ์ ์ฐํ ์ค์ผ์ค๋ง ์ต์
{
"schedule": {
"interval_hours": 12, // 12์๊ฐ ๊ฐ๊ฒฉ ์คํ
"run_at": "09:00" // ํน์ ์๊ฐ ์คํ
}
}
์ฌ์ฉ์๋ณ๋ก ์ต์ ์ ์คํ ์ฃผ๊ธฐ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ผ๋ถ ์ฌ์ฉ์๋ ๋ ๋น๋ฒํ ์ฒดํฌ๋ฅผ ์ํ ์ ์๊ณ , ๋ค๋ฅธ ์ฌ์ฉ์๋ ๋ฆฌ์์ค ์ ์ฝ์ ์ํด ์ต์ ๋น๋๋ฅผ ์ ํธํ ์ ์์ต๋๋ค. ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅํ ์ค์ผ์ค๋ง์ผ๋ก ์ด๋ฌํ ๋ค์ํ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ ์์ ์ ๋๋ค.
2. ๋ค์ํ ์๋ฆผ ์ฑ๋ ์ง์
ํ์ฌ๋ ํ ๋ ๊ทธ๋จ๋ง ์ง์ํ์ง๋ง, ๊ธฐ์ ํ๊ฒฝ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ Slack๊ณผ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์์ ์ธ๊ธฐ ์๋ Discord ํตํฉ์ ์ถ๊ฐํ ๊ณํ์ ๋๋ค. ์ด๋ฅผ ํตํด ํ ๋จ์ ํ์ ์๋๋ฆฌ์ค์์๋ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ ์ ์์ต๋๋ค.
์ค์ฅ๊ธฐ ๋ก๋๋งต (๊ฒํ ์ค) ๐ค
3. Web ๊ธฐ๋ฐ ๊ด๋ฆฌ ๋์๋ณด๋
localhost:8080 โ
- ๋ฑ๋ก๋ ํ๋ก์ ํธ ๋ชฉ๋ก ๋ฐ ์ํ
- ์คํ ํ์คํ ๋ฆฌ ๊ทธ๋ํ
- GUI ๊ธฐ๋ฐ ์ค์ ๋ณ๊ฒฝ
- ์๋ ์คํ ํธ๋ฆฌ๊ฑฐ
์น UI๋ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ง๋ง, ํ๋ก์ ํธ์ ๋ณต์ก๋๋ ์ฆ๊ฐ์ํต๋๋ค. ์ปค๋ฎค๋ํฐ ํผ๋๋ฐฑ์ ํตํด ์ค์ ์์๋ฅผ ํ์ ํ ํ ๊ฐ๋ฐ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์์ ์ ๋๋ค.
4. ํฌ์ค์ฒดํฌ API ์๋ํฌ์ธํธ
# GET /health ์๋ต ์์
{
"status": "healthy",
"last_run": "2025-10-31 09:00:00",
"next_run": "2025-11-01 09:00:00",
"databases": {
"total": 3,
"healthy": 3,
"failed": 0
}
}
์ธ๋ถ ๋ชจ๋ํฐ๋ง ์์คํ ํตํฉ์ ์ํ ํฌ์ค์ฒดํฌ ์๋ํฌ์ธํธ์ ๋๋ค. ๋ณด์ ๊ณ ๋ ค์ฌํญ(์ธ์ฆ, ๋ฐฉํ๋ฒฝ ์ค์ ๋ฑ)์ ์ถฉ๋ถํ ๊ฒํ ํ ํ ๊ตฌํํ ์์ ์ ๋๋ค.
5. ์ง๋ฅํ ์ฌ์๋ ๋ฉ์ปค๋์ฆ
๋คํธ์ํฌ ์ผ์์ ์ฅ์ ๋ Supabase ์๋น์ค ์ ๊ฒ ์ ์๋์ผ๋ก ์ฌ์๋ํ๋ ๋ก์ง์ ๋๋ค. Exponential backoff ์ ๋ต์ ์ ์ฉํ์ฌ ํจ์จ์ ์ธ ์ฌ์๋๋ฅผ ๊ณํํ๊ณ ์์ต๋๋ค.
6. ์์ธ ๋ถ์ ๋ฐ ํต๊ณ
- ์คํ ์ด๋ ฅ ๋ฐ ์ฑ๊ณต๋ฅ ์ถ์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณ ์ฑ๋ฅ ๋ฉํธ๋ฆญ
- ํ๊ท ์๋ต ์๊ฐ ๋ถ์
- ๋ฐ์ดํฐ ์ฆ๊ฐ ์ถ์ด ๋ชจ๋ํฐ๋ง
์ฅ๊ธฐ์ ์ผ๋ก๋ Grafana, Prometheus์ ๊ฐ์ ํ์ค ๋ชจ๋ํฐ๋ง ๋๊ตฌ์์ ํตํฉ๋ ๊ณ ๋ คํ๊ณ ์์ต๋๋ค.
์ฅ๊ธฐ ๋น์ (๋ณด๋ฅ ์ค) โธ๏ธ
7. ํฌ๋ก์ค ํ๋ซํผ GUI ํด๋ผ์ด์ธํธ
Electron ๊ธฐ๋ฐ ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋์ฑ ์ง๊ด์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ์ Docker ๊ธฐ๋ฐ ์๋ฃจ์ ๋ ์ถฉ๋ถํ ๊ฐํธํ๋ฏ๋ก, ์ค์ ์์๋ฅผ ํ์ธํ ํ ๊ฒฐ์ ํ ์์ ์ ๋๋ค.
8. ๋ค์ํ Keep-Alive ์ ๋ต
- ๊ฒฝ๋ API ํธ์ถ ๋ฐฉ์ (๋ฐ์ดํฐ ์ฝ์ ์์ด)
- Edge Functions ์ฃผ๊ธฐ์ ํธ๋ฆฌ๊ฑฐ
- Storage ๋ ๋ฒจ ํ๋ ์์ฑ
๊ฐ ์ ๋ต๋ง๋ค ์ฅ๋จ์ ์ด ์์ผ๋ฏ๋ก, ์ฌ์ฉ์๊ฐ ์ ํํ ์ ์๋ ์ต์ ์ผ๋ก ์ ๊ณตํ๋ ๊ฒ์ ๊ฒํ ์ค์ ๋๋ค. ๋ค๋ง ํ๋ก์ ํธ์ ํต์ฌ ๊ฐ์น์ธ “๋จ์์ฑ”์ ํด์น์ง ์๋ ๋ฒ์ ๋ด์์ ์งํํ ์์ ์ ๋๋ค.
9. SaaS ํ๋ซํผ์ผ๋ก ํ์ฅ
“SupabaseZombi.io”์ ๊ฐ์ ํด๋ผ์ฐ๋ ์๋น์ค๋ก ์ ๊ณตํ๋ ๊ฒ์ ๋งค๋ ฅ์ ์ธ ์์ด๋์ด์ ๋๋ค. ์ฌ์ฉ์๋ ํ์๊ฐ์ ํ Supabase ์ ๋ณด๋ง ์ ๋ ฅํ๋ฉด ๋๋ ํธ๋ฆฌํ ์๋น์ค์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์ธํ๋ผ ๋น์ฉ, ๊ฐ์ธ์ ๋ณด ๋ณดํธ, ์ง์ ๊ฐ๋ฅํ ๋น์ฆ๋์ค ๋ชจ๋ธ ๋ฑ ๋ณต์กํ ๊ณ ๋ ค์ฌํญ์ ์๋ฐํ๋ฏ๋ก ์ ์คํ ๊ฒํ ํ ์์ ์ ๋๋ค.
์ปค๋ฎค๋ํฐ ์ฐธ์ฌ ํ์
์คํ์์ค ํ๋ก์ ํธ์ ํต์ฌ์ ์ปค๋ฎค๋ํฐ์ ๋๋ค. ์ด๋ค ๊ธฐ๋ฅ์ด ๊ฐ์ฅ ์ ์ฉํ ์ง, ์ด๋ค ๊ฐ์ ์ด ํ์ํ์ง์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฒฌ์ GitHub Issues๋ฅผ ํตํด ๊ณต์ ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. Pull Request๋ ์ธ์ ๋ ํ์ํ๋ฉฐ, ํจ๊ป ๋ ๋์ ๋๊ตฌ๋ฅผ ๋ง๋ค์ด๊ฐ๊ณ ์ถ์ต๋๋ค.
๋งบ์๋ง
ํ๋ก์ ํธ์ ์์
SupabaseZombi๋ Supabase ๋ฌด๋ฃ ํ๋์ 7์ผ ๋นํ์ฑํ ์ ์ฑ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ ์คํ์์ค ์๋ํ ๋๊ตฌ์ ๋๋ค. ์ด ํ๋ก์ ํธ๋ Supabase์ ์ ์ฑ ์ ์กด์คํ๋ฉด์๋, ๊ฐ๋ฐ์๊ฐ ํ๋ก์ ํธ ๊ด๋ฆฌ์ ์์๋๋ ์๊ฐ์ ์ ์ฝํ๊ณ ์ค์ ๊ฐ๋ฐ์ ์ง์คํ ์ ์๋๋ก ๋์ต๋๋ค.
๊ธฐ์ ์ ๊ฐ์น
- ์๋ํ: ๋ฐ๋ณต์ ์ธ ์๋ ์์ ์ ๊ฑฐ
- ํ์ฅ์ฑ: ๋ค์ค ํ๋ก์ ํธ ๋์ ๊ด๋ฆฌ
- ํจ์จ์ฑ: ๋ฆฌ์์ค ์ต์ ํ ๋ฐ ๋ฐ์ดํฐ ๊ด๋ฆฌ
- ๊ฐ์์ฑ: ์ค์๊ฐ ๋ชจ๋ํฐ๋ง ๋ฐ ์๋ฆผ
- ์ด์์ฑ: Docker ๊ธฐ๋ฐ ํ๋ซํผ ๋ ๋ฆฝ์ ๋ฐฐํฌ
์คํ์์ค ๊ธฐ์ฌ
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค ํ์ ๊ณต๊ฐ๋์ด ์์ผ๋ฉฐ, ๋๊ตฌ๋ ์์ ๋กญ๊ฒ ์ฌ์ฉ, ์์ , ๋ฐฐํฌํ ์ ์์ต๋๋ค. ์ปค๋ฎค๋ํฐ์ ํผ๋๋ฐฑ๊ณผ ๊ธฐ์ฌ๋ฅผ ํตํด ์ง์์ ์ผ๋ก ๋ฐ์ ํ๊ณ ์์ต๋๋ค.
๋น์ทํ ๊ณผ์ ๋ฅผ ์ง๋ฉดํ๊ณ ์๋ ๊ฐ๋ฐ์๋ผ๋ฉด ์ด ์๋ฃจ์ ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค. ๊ถ๊ธํ ์ ์ด๋ ๊ฐ์ ์ ์์ด ์๋ค๋ฉด GitHub Issues์์ ๋ ผ์ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
๐ GitHub ์ ์ฅ์: https://github.com/shsm0520/supabasezombi
๋ฉด์ฑ ์ฌํญ
๋ณธ ํ๋ก์ ํธ๋ Supabase์ ์๋น์ค ์ฝ๊ด์ ์ค์ํ๋ฉฐ, ์ ์์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๋์ ์๋ฎฌ๋ ์ด์ ํ๋ ๊ธฐ์ ์ ์๋ฃจ์ ์ ๋๋ค. ์ฌ์ฉ์๋ ์์ ์ Supabase ํ๋ก์ ํธ์ ๋ํด ์ ์ ์ธ ์ฑ ์์ ์ง๋ฉฐ, ๋ณธ ๋๊ตฌ๋ “์๋ ๊ทธ๋๋ก” ์ ๊ณต๋ฉ๋๋ค.