๐Ÿ“– TIL - Supabase ํ•ต์‹ฌ ์ •๋ฆฌ: ์‹ค๋ฌด์—์„œ ์ž์ฃผ ์“ฐ๋Š” ๊ธฐ๋Šฅ ์œ„์ฃผ๋กœ

์Š˜ยท2025๋…„ 2์›” 15์ผ

๐Ÿ“– TIL

๋ชฉ๋ก ๋ณด๊ธฐ
57/90

โœจ ๊ธฐ๋ณธ ์„ค์ • ๋ฐ ์ดˆ๊ธฐํ™”

import { createClient } from '@supabase/supabase-js'
// โš ๏ธ ์ค‘์š”: .env ํŒŒ์ผ์— ํ‚ค ๋ณด๊ด€ ํ•„์ˆ˜
const supabase = createClient(
  process.env.REACT_APP_SUPABASE_URL,
  process.env.REACT_APP_SUPABASE_ANON_KEY
)

๐Ÿ’ก ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•ต์‹ฌ ์ž‘์—…

1. Select (์กฐํšŒ)

// ๊ธฐ๋ณธ ์กฐํšŒ
const { data, error } = await supabase
  .from('table_name')
  .select('*')
// ํŠน์ • ์ปฌ๋Ÿผ๋งŒ ์กฐํšŒ
.select('column1, column2')
// ๊ด€๊ณ„ ํ…Œ์ด๋ธ” ์กฐํšŒ (์ค‘์š”!)
.select(`
  id,
  title,
  comments (
    id,
    content
  )
`)

2. Filter (ํ•„ํ„ฐ๋ง)

// ๊ฐ™์Œ
.eq('column', value)
// ํฌํ•จ
.in('column', ['value1', 'value2'])
// ํ…์ŠคํŠธ ๊ฒ€์ƒ‰
.ilike('column', '%value%')
// AND ์กฐ๊ฑด
.eq('column1', value1)
.eq('column2', value2)
// OR ์กฐ๊ฑด
.or('column1.eq.value1,column2.eq.value2')

3. ์‹ค์‹œ๊ฐ„ ๊ตฌ๋… (๊ณต์‹๋ฌธ์„œ ๊ฐ•์กฐ)

// ์‹ค์‹œ๊ฐ„ ๋ณ€๊ฒฝ ๊ฐ์ง€
const subscription = supabase
  .channel('custom-channel-name')
  .on('postgres_changes', 
    { event: '*', schema: 'public', table: 'table_name' },
    (payload) => {
      console.log('Change received!', payload)
    }
  )
  .subscribe()
// ๊ตฌ๋… ํ•ด์ œ (์ค‘์š”: ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€)
subscription.unsubscribe()

๐Ÿ” ์ธ์ฆ (๊ณต์‹๋ฌธ์„œ ํ•„์ˆ˜ ์‚ฌํ•ญ)

1. ๊ธฐ๋ณธ ์ธ์ฆ

// ํšŒ์›๊ฐ€์ž…
const { data, error } = await supabase.auth.signUp({
  email: 'user@email.com',
  password: 'password'
})
// ๋กœ๊ทธ์ธ
const { data, error } = await supabase.auth.signInWithPassword({
  email: 'user@email.com',
  password: 'password'
})
// ํ˜„์žฌ ์‚ฌ์šฉ์ž ๊ฐ€์ ธ์˜ค๊ธฐ (์ค‘์š”!)
const { data: { user } } = await supabase.auth.getUser()

2. ์„ธ์…˜ ๊ด€๋ฆฌ (์ค‘์š”)

// ์„ธ์…˜ ๋ณ€๊ฒฝ ๊ฐ์ง€
supabase.auth.onAuthStateChange((event, session) => {
  if (event === 'SIGNED_IN') console.log('SIGNED_IN', session)
})

โšก RLS (Row Level Security) - ํ•„์ˆ˜!

-- ํ…Œ์ด๋ธ” ๋ณด์•ˆ ์ •์ฑ… ์˜ˆ์‹œ
CREATE POLICY "Users can only access their own data"
ON table_name
FOR SELECT
USING (auth.uid() = user_id);

๐ŸŽฏ ์—๋Ÿฌ ์ฒ˜๋ฆฌ (๊ณต์‹๋ฌธ์„œ ๊ฐ•์กฐ์‚ฌํ•ญ)

const { data, error } = await supabase
  .from('table')
  .select()
if (error) {
  // โš ๏ธ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋Š” ํ•„์ˆ˜
  console.error('Error:', error.message)
  return
}
// ์„ฑ๊ณต ์‹œ ์ฒ˜๋ฆฌ
console.log('Data:', data)

๐Ÿ’ซ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ (๊ณต์‹๋ฌธ์„œ ๊ถŒ์žฅ์‚ฌํ•ญ)

1. ํ•„์š”ํ•œ ์ปฌ๋Ÿผ๋งŒ ์กฐํšŒ

// โœ… ์ข‹์€ ์˜ˆ
.select('id, title, created_at')
// โŒ ํ”ผํ•ด์•ผ ํ•  ์˜ˆ
.select('*')

2. ํŽ˜์ด์ง€๋„ค์ด์…˜ ํ™œ์šฉ

// ํŽ˜์ด์ง€๋„ค์ด์…˜
const { data, error } = await supabase
  .from('table')
  .select('*')
  .range(0, 9)  // 10๊ฐœ์”ฉ ์กฐํšŒ

๐Ÿค” ์ž์ฃผ ํ•˜๋Š” ์‹ค์ˆ˜๋“ค

  1. RLS ์ •์ฑ… ๋ฏธ์„ค์ •
  2. ๊ตฌ๋… ํ•ด์ œ ๋ˆ„๋ฝ
  3. ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ถ€์žฌ
  4. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ด€๋ฆฌ ์†Œํ™€
profile
์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ์žฅ๊ธฐ ๊ธฐ๋ก๊ธฐ๋ก

0๊ฐœ์˜ ๋Œ“๊ธ€