Post

[Backend] ๐Ÿš€ Supabase๋ž€? FirebaseยทAppwrite์™€ ์ฐจ์ด์  ์™„๋ฒฝ ๋น„๊ต

Supabase๋Š” PostgreSQL ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ์†Œ์Šค BaaS ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. Firebase, Appwrite์™€์˜ ์ฐจ์ด์ , ํ•ต์‹ฌ ๊ธฐ๋Šฅ(AuthยทRealtimeยทpgvector), ์š”๊ธˆ์ œ๋ฅผ ์‹ค๋ฌด ๊ด€์ ์—์„œ ๋น„๊ต ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

[Backend] ๐Ÿš€ Supabase๋ž€? FirebaseยทAppwrite์™€ ์ฐจ์ด์  ์™„๋ฒฝ ๋น„๊ต

Supabase๋Š” PostgreSQL ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ์†Œ์Šค BaaS(Backend as a Service) ํ”Œ๋žซํผ์œผ๋กœ, Firebase์˜ ๋Œ€์•ˆ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ธ์ฆ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ, ํŒŒ์ผ ์Šคํ† ๋ฆฌ์ง€, ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€๋กœ ์ œ๊ณตํ•˜์—ฌ ๋ฐฑ์—”๋“œ ์ธํ”„๋ผ ๊ตฌ์ถ• ์‹œ๊ฐ„์„ ๋Œ€ํญ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” Supabase์˜ ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ Firebase, Appwrite์™€์˜ ์ฐจ์ด์ ์„ ์‹ค๋ฌด ๊ด€์ ์—์„œ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.


๐Ÿงฉ Supabase๋ž€?

Supabase๋Š” Google Firebase์˜ ์˜คํ”ˆ์†Œ์Šค ๋Œ€์•ˆ์œผ๋กœ 2020๋…„ ๋“ฑ์žฅํ•œ BaaS(Backend as a Service) ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. PostgreSQL์„ ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ธ์ฆยท์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌยทํŒŒ์ผ ์Šคํ† ๋ฆฌ์ง€ยท์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ฉ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Firebase๊ฐ€ NoSQL(Firestore) ๊ธฐ๋ฐ˜์ธ ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, Supabase๋Š” ํ‘œ์ค€ SQL๊ณผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ๊ฐ€์žฅ ํฐ ์ฐจ๋ณ„์ ์ž…๋‹ˆ๋‹ค. ์˜คํ”ˆ์†Œ์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์šฐ๋“œ ํ˜ธ์ŠคํŒ…๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ž์ฒด ์„œ๋ฒ„์—์„œ ์…€ํ”„ ํ˜ธ์ŠคํŒ…๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ” BaaS(Backend as a Service)๋ž€?

BaaS๋Š” โ€œ์ธ์ฆ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํŒŒ์ผ ์Šคํ† ๋ฆฌ์ง€ ๋“ฑ ๊ณตํ†ต ๋ฐฑ์—”๋“œ ๊ธฐ๋Šฅ์„ ์„œ๋น„์Šค๋กœ ์ œ๊ณตํ•˜๋Š” ํ”Œ๋žซํผโ€์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๊ฑฐ๋‚˜ API๋ฅผ ๊ฐœ๋ฐœํ•  ํ•„์š” ์—†์ด, ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๋งŒ์œผ๋กœ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

Tip: BaaS๋Š” ์Šคํƒ€ํŠธ์—…์ด๋‚˜ ์†Œ๊ทœ๋ชจ ํŒ€์ด ๋น ๋ฅธ ์‹œ์žฅ ์ง„์ž…(MVP)์ด ํ•„์š”ํ•  ๋•Œ ํŠนํžˆ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ BaaS ํ”Œ๋žซํผ์œผ๋กœ๋Š” Firebase, Supabase, Appwrite๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ ์„ค๊ณ„ ์ฒ ํ•™์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.


โšก Firebase vs Supabase vs Appwrite ๋น„๊ต

ํ•ญ๋ชฉFirebaseSupabaseAppwrite
์„ค๊ณ„ ๋ฐฉํ–ฅ์™„์ œํ’ˆ ์ง€ํ–ฅํ†ตํ•ฉ ๋ฐ์ดํ„ฐ ํ๋ฆ„์…€ํ”„ ํ˜ธ์ŠคํŒ… ์ž์œ ๋„
๋ฐ์ดํ„ฐ๋ฒ ์ด์ŠคNoSQL (Firestore)SQL (PostgreSQL)SQL/NoSQL ์„ ํƒ
์ œ๊ณต ๋ฐฉ์‹์™„์ „ ๊ด€๋ฆฌํ˜•๊ด€๋ฆฌํ˜• + ๋กœ์ปฌ ๊ฐœ๋ฐœ์ง์ ‘ ์šด์˜
์˜คํ”ˆ์†Œ์ŠคโŒโœ…โœ…
๋ฒค๋” ๋ฝ์ธ๋†’์Œ (Google)๋‚ฎ์Œ์—†์Œ
๊ถŒํ•œ ๊ตฌ์กฐ๊ธฐ๋Šฅ๋ณ„ ๋ถ„๋ฆฌRLS ๊ธฐ๋ฐ˜ ํ†ตํ•ฉ์ง์ ‘ ๊ตฌ์„ฑ
AI/๋ฒกํ„ฐ ์ง€์›๋ณ„๋„ ์†”๋ฃจ์…˜ ํ•„์š”pgvector ๊ธฐ๋ณธ ์ง€์›๋ณ„๋„ ์„ค์ • ํ•„์š”
์ ํ•ฉ ํŒ€MVP/๋ชจ๋ฐ”์ผ ํŒ€ํ”„๋ก ํŠธ ์ค‘์‹ฌ ์†Œ๊ทœ๋ชจ ํŒ€์ธํ”„๋ผ ์šด์˜ ๊ฐ€๋Šฅ ํŒ€

Firebase๊ฐ€ ์ ํ•ฉํ•œ ๊ฒฝ์šฐ

Firebase๋Š” โ€œ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ๊ณผ ์ดˆ๊ณ ์† MVP ๊ตฌํ˜„โ€์— ์ตœ์ ํ™”๋œ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. Google ์ƒํƒœ๊ณ„์™€์˜ ๊ธด๋ฐ€ํ•œ ํ†ตํ•ฉ, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”, Firebase Analytics ๋“ฑ ๋ชจ๋ฐ”์ผ์— ํŠนํ™”๋œ ์„œ๋น„์Šค๊ฐ€ ๊ฐ•์ ์ž…๋‹ˆ๋‹ค.

  • ๋ชจ๋ฐ”์ผ(iOS/Android) ์•ฑ ๊ฐœ๋ฐœ ์ค‘์‹ฌ
  • Google ์ƒํƒœ๊ณ„ ์ „๋ฐ˜ ํ™œ์šฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
  • NoSQL ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์ต์ˆ™ํ•œ ํŒ€

Supabase๊ฐ€ ์ ํ•ฉํ•œ ๊ฒฝ์šฐ

Supabase๋Š” โ€œSQL์— ์ต์ˆ™ํ•œ ํŒ€์ด ๋น ๋ฅธ ๊ฐœ๋ฐœ๊ณผ ํ†ต์ œ๊ถŒ์„ ๋™์‹œ์— ์›ํ•  ๋•Œโ€ ์ตœ์ ์ž…๋‹ˆ๋‹ค. ์žฅ๊ธฐ ์šด์˜์„ ๊ณ ๋ คํ•˜๋ฉด์„œ๋„ ๋น ๋ฅด๊ฒŒ ์ œํ’ˆ์„ ์ถœ์‹œํ•ด์•ผ ํ•˜๋Š” ํŒ€์— ์–ด์šธ๋ฆฝ๋‹ˆ๋‹ค.

  • SQL ๋ฐ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ต์ˆ™ํ•œ ํŒ€
  • AI/ML ๊ธฐ๋Šฅ์„ ์•ฑ์— ํ†ตํ•ฉํ•  ๊ณ„ํš์ด ์žˆ๋Š” ๊ฒฝ์šฐ
  • Firebase์˜ ๋ฒค๋” ๋ฝ์ธ์„ ํ”ผํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

Appwrite๊ฐ€ ์ ํ•ฉํ•œ ๊ฒฝ์šฐ

Appwrite๋Š” โ€œ์ธํ”„๋ผ๋ฅผ ์ง์ ‘ ์šด์˜ํ•  ์ˆ˜ ์žˆ๋Š” ํŒ€์ด ์™„์ „ํ•œ ๋ฐ์ดํ„ฐ ์ฃผ๊ถŒ์„ ์›ํ•  ๋•Œโ€ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์…€ํ”„ ํ˜ธ์ŠคํŒ…์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์™„์ „ํžˆ ํ†ต์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ž์ฒด ์„œ๋ฒ„์—์„œ ์™„์ „ํžˆ ํ†ต์ œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ์ธํ”„๋ผ ์šด์˜ ์—ญ๋Ÿ‰์ด ์žˆ๋Š” ํŒ€
  • ์˜คํ”ˆ์†Œ์Šค ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

๐Ÿ› ๏ธ Supabase ํ•ต์‹ฌ ๊ธฐ๋Šฅ

1๏ธโƒฃ Database (PostgreSQL)

Supabase์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์™„์ „ํ•œ PostgreSQL์ž…๋‹ˆ๋‹ค. ๋ณต์žกํ•œ SQL ์ฟผ๋ฆฌ, ์กฐ์ธ, ํŠธ๋žœ์žญ์…˜, ์ธ๋ฑ์Šค๋ฅผ ๋ชจ๋‘ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Row Level Security(RLS)๋กœ ์‚ฌ์šฉ์ž๋ณ„ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ถŒํ•œ์„ DB ๋ ˆ๋ฒจ์—์„œ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
-- RLS ์ •์ฑ… ์˜ˆ์‹œ: ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒ
CREATE POLICY "users can view own data"
ON profiles
FOR SELECT
USING (auth.uid() = user_id);

Tip: RLS๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด API์—์„œ ๋ณ„๋„ ๊ถŒํ•œ ์ฒดํฌ ์—†์ด DB ์ž์ฒด์—์„œ ๋ณด์•ˆ์ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ Auth (์ธ์ฆ)

Supabase Auth๋Š” ์ด๋ฉ”์ผ/ํŒจ์Šค์›Œ๋“œ, ์†Œ์…œ ๋กœ๊ทธ์ธ(Google, GitHub, Apple), OTP, ํŒจ์Šคํ‚ค๋ฅผ ๋Œ€์‹œ๋ณด๋“œ์—์„œ ํด๋ฆญ ๋ช‡ ๋ฒˆ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JWT ๊ธฐ๋ฐ˜์˜ ํ† ํฐ๊ณผ ์„ธ์…˜ ๊ด€๋ฆฌ๋Š” ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { createClient } from '@supabase/supabase-js'

const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY)

// ์†Œ์…œ ๋กœ๊ทธ์ธ (GitHub)
const { data, error } = await supabase.auth.signInWithOAuth({
  provider: 'github'
})

// ์ด๋ฉ”์ผ ๋กœ๊ทธ์ธ
const { data, error } = await supabase.auth.signInWithPassword({
  email: 'user@example.com',
  password: 'password'
})

3๏ธโƒฃ Realtime (์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ)

Supabase Realtime์€ PostgreSQL์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์›น์†Œ์ผ“์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์— ์ฆ‰์‹œ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„ ํด๋ง ์—†์ด ์ฑ„ํŒ…, ์•Œ๋ฆผ, ํ˜‘์—… ๋„๊ตฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
// ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง€ ๊ตฌ๋…
const channel = supabase
  .channel('messages')
  .on(
    'postgres_changes',
    { event: 'INSERT', schema: 'public', table: 'messages' },
    (payload) => {
      console.log('์ƒˆ ๋ฉ”์‹œ์ง€:', payload.new)
    }
  )
  .subscribe()

4๏ธโƒฃ Storage (ํŒŒ์ผ ๊ด€๋ฆฌ)

์ด๋ฏธ์ง€ยท๋™์˜์ƒ ์—…๋กœ๋“œ ์‹œ ์ž๋™ ์ธ๋„ค์ผ ๋ณ€ํ™˜, CDN ์—ฐ๋™, RLS ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด๊ฐ€ ๊ธฐ๋ณธ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
// ํŒŒ์ผ ์—…๋กœ๋“œ
const { data, error } = await supabase.storage
  .from('avatars')
  .upload(`${userId}/avatar.png`, file)

// ํผ๋ธ”๋ฆญ URL ์กฐํšŒ
const { data } = supabase.storage
  .from('avatars')
  .getPublicUrl(`${userId}/avatar.png`)

5๏ธโƒฃ Edge Functions (์„œ๋ฒ„๋ฆฌ์Šค)

Deno ๊ธฐ๋ฐ˜์˜ ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋กœ ์ธ์ฆ ์ฒดํฌ, ์›นํ›… ์ฒ˜๋ฆฌ, ์™ธ๋ถ€ API ํ˜ธ์ถœ, AI ์—ฐ๋™ ๋“ฑ ์„œ๋ฒ„ ๋กœ์ง์„ ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Edge Function ์˜ˆ์‹œ: OpenAI ์—ฐ๋™
import { serve } from 'https://deno.land/std@0.177.0/http/server.ts'

serve(async (req) => {
  const { query } = await req.json()

  const response = await fetch('https://api.openai.com/v1/chat/completions', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${Deno.env.get('OPENAI_API_KEY')}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      model: 'gpt-4o',
      messages: [{ role: 'user', content: query }]
    })
  })

  return new Response(await response.text(), {
    headers: { 'Content-Type': 'application/json' }
  })
})

6๏ธโƒฃ Vector DB (pgvector)

Supabase๋Š” pgvector ํ™•์žฅ์„ ๊ธฐ๋ณธ ์ง€์›ํ•˜์—ฌ ๋ณ„๋„ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—†์ด PostgreSQL ์•ˆ์—์„œ AI ์ž„๋ฒ ๋”ฉ ์ €์žฅ๊ณผ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- pgvector ํ™•์žฅ ํ™œ์„ฑํ™”
CREATE EXTENSION IF NOT EXISTS vector;

-- ์ž„๋ฒ ๋”ฉ ์ปฌ๋Ÿผ์ด ์žˆ๋Š” ํ…Œ์ด๋ธ” ์ƒ์„ฑ
CREATE TABLE documents (
  id BIGSERIAL PRIMARY KEY,
  content TEXT,
  embedding VECTOR(1536)
);

-- ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰
SELECT content, 1 - (embedding <=> query_embedding) AS similarity
FROM documents
ORDER BY embedding <=> query_embedding
LIMIT 5;

Tip: Supabase + pgvector ์กฐํ•ฉ์€ RAG(Retrieval-Augmented Generation) ์‹œ์Šคํ…œ ๊ตฌ์ถ•์— ๋งค์šฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.


๐Ÿ’ฐ ์š”๊ธˆ์ œ ๋น„๊ต

ํ”Œ๋žœ๊ฐ€๊ฒฉDB ์šฉ๋Ÿ‰์Šคํ† ๋ฆฌ์ง€MAUํŠน์ด์‚ฌํ•ญ
Free๋ฌด๋ฃŒ500MB1GB10,0001์ฃผ ๋ฏธ์‚ฌ์šฉ ์‹œ ์ž๋™ ์ค‘์ง€, 2๊ฐœ ํ”„๋กœ์ ํŠธ ์ œํ•œ
Pro$25/์›”8GB100GB100,000์ž๋™ ๋ฐฑ์—…, ์ปค์Šคํ…€ ๋„๋ฉ”์ธ
Team$599/์›”์ปค์Šคํ…€์ปค์Šคํ…€๋ฌด์ œํ•œSOC2, HIPAA, SSO ์ง€์›
Enterprise๋ฌธ์˜์ปค์Šคํ…€์ปค์Šคํ…€๋ฌด์ œํ•œ์ „์šฉ ์„œ๋ฒ„, SLA ๋ณด์žฅ

โš ๏ธ Free ํ”Œ๋žœ์€ 7์ผ ๋™์•ˆ ํ™œ๋™์ด ์—†์œผ๋ฉด ํ”„๋กœ์ ํŠธ๊ฐ€ ์ž๋™ ์ผ์‹œ์ •์ง€๋ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋‚˜ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


โœ… Supabase ์žฅ๋‹จ์  ์š”์•ฝ

์žฅ์ 

  • SQL ํ‘œ์ค€ ์ง€์›: ๋ณต์žกํ•œ ๊ด€๊ณ„ํ˜• ์ฟผ๋ฆฌ, ์กฐ์ธ, ํŠธ๋žœ์žญ์…˜ ์™„์ „ ์ง€์›
  • ์˜คํ”ˆ์†Œ์Šค: ๋ฒค๋” ๋ฝ์ธ ์—†์ด ์ž์ฒด ํ˜ธ์ŠคํŒ…์œผ๋กœ ์ „ํ™˜ ๊ฐ€๋Šฅ
  • AI ํ†ตํ•ฉ ์šฉ์ด: pgvector๋กœ ๋ฒกํ„ฐ DB๋ฅผ ๋ณ„๋„ ์„œ๋น„์Šค ์—†์ด ํ™œ์šฉ
  • ํ†ตํ•ฉ ์†”๋ฃจ์…˜: ์ธ์ฆยทDBยท์Šคํ† ๋ฆฌ์ง€ยท์‹ค์‹œ๊ฐ„ยทํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€
  • ๋น„์šฉ ์˜ˆ์ธก ๊ฐ€๋Šฅ: Firebase์˜ ์‚ฌ์šฉ๋Ÿ‰ ๊ธฐ๋ฐ˜ ๊ณผ๊ธˆ๊ณผ ๋‹ฌ๋ฆฌ ํ”Œ๋žœ ๊ธฐ๋ฐ˜ ์ •์•ก์ œ

๋‹จ์ 

  • Free ํ”Œ๋žœ ์ œ์•ฝ: 1์ฃผ ๋ฏธ์‚ฌ์šฉ ์‹œ ์ž๋™ ์ผ์‹œ์ •์ง€, 2๊ฐœ ํ”„๋กœ์ ํŠธ ์ œํ•œ
  • Region ๊ณ ์ •: ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ํ›„ ๋ฆฌ์ „ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€
  • PostgreSQL ๊ธฐ๋ณธ ์ง€์‹ ํ•„์š”: SQL์— ์ต์ˆ™ํ•˜์ง€ ์•Š์œผ๋ฉด ์ดˆ๊ธฐ ์„ค์ •์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ
  • Firebase ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ณต์žก๋„: NoSQL โ†’ ๊ด€๊ณ„ํ˜• ์ „ํ™˜ ์‹œ ๋ฐ์ดํ„ฐ ์žฌ์„ค๊ณ„ ํ•„์š”

๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ ๊ฐ€์ด๋“œ

Supabase CLI ์„ค์น˜ ๋ฐ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

1
2
3
4
5
6
7
8
9
10
11
# Supabase CLI ์„ค์น˜
npm install -g supabase

# ๋กœ๊ทธ์ธ
supabase login

# ์ƒˆ ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”
supabase init

# ๋กœ์ปฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹œ์ž‘ (Docker ํ•„์š”)
supabase start

Next.js + Supabase ์—ฐ๋™

1
npm install @supabase/supabase-js @supabase/ssr
1
2
3
4
5
6
7
// lib/supabase.ts
import { createBrowserClient } from '@supabase/ssr'

export const supabase = createBrowserClient(
  process.env.NEXT_PUBLIC_SUPABASE_URL!,
  process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
)
1
2
3
4
5
6
// ๋ฐ์ดํ„ฐ ์กฐํšŒ ์˜ˆ์‹œ
const { data: posts, error } = await supabase
  .from('posts')
  .select('id, title, created_at')
  .order('created_at', { ascending: false })
  .limit(10)

โ“ ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

Q. Supabase์™€ Firebase ์ค‘ ๋ฌด์—‡์„ ์„ ํƒํ•ด์•ผ ํ•˜๋‚˜์š”?

SQL๊ณผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ์— ์ต์ˆ™ํ•˜๊ฑฐ๋‚˜ AI ๊ธฐ๋Šฅ ํ†ตํ•ฉ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด Supabase๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ์ด ์ฃผ๋ชฉ์ ์ด๊ณ  Google ์ƒํƒœ๊ณ„๋ฅผ ์ ๊ทน ํ™œ์šฉํ•œ๋‹ค๋ฉด Firebase๊ฐ€ ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

Q. Supabase๋Š” ์…€ํ”„ ํ˜ธ์ŠคํŒ…์ด ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?

๋„ค, ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Supabase๋Š” ์˜คํ”ˆ์†Œ์Šค์ด๋ฉฐ Docker Compose๋กœ ์ž์ฒด ์„œ๋ฒ„์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. supabase/supabase GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๊ณต์‹ ์…€ํ”„ ํ˜ธ์ŠคํŒ… ๊ฐ€์ด๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Q. Free ํ”Œ๋žœ์˜ ํ”„๋กœ์ ํŠธ ์ž๋™ ์ค‘์ง€๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

๋ฌด๋ฃŒ ํ”Œ๋žœ์—์„œ๋Š” 7์ผ ์—ฐ์† ๋ฏธ์‚ฌ์šฉ ์‹œ ์ž๋™ ์ผ์‹œ์ •์ง€๋ฉ๋‹ˆ๋‹ค. ์ฃผ๊ธฐ์ ์œผ๋กœ ์ ‘์†ํ•˜๊ฑฐ๋‚˜, Pro ํ”Œ๋žœ($25/์›”)์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์ด ์ œํ•œ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

Q. pgvector๋ฅผ ํ™œ์šฉํ•œ AI ๊ธฐ๋Šฅ์€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜์š”?

Supabase ๋Œ€์‹œ๋ณด๋“œ์˜ Database > Extensions ํƒญ์—์„œ vector ํ™•์žฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ VECTOR ํƒ€์ž… ์ปฌ๋Ÿผ์„ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ  OpenAI ๋“ฑ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ๋กœ ์ƒ์„ฑํ•œ ๋ฒกํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Q. Free ํ”Œ๋žœ์˜ ํ”„๋กœ์ ํŠธ ๊ฐœ์ˆ˜ ์ œํ•œ์€?

Free ํ”Œ๋žœ์—์„œ๋Š” ์ตœ๋Œ€ 2๊ฐœ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pro ํ”Œ๋žœ๋ถ€ํ„ฐ๋Š” ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.

This post is licensed under CC BY 4.0 by the author.