๋ชฉ. 8์›” 14th, 2025

D: Supabase๋Š” Firebase์˜ ๊ฐ•๋ ฅํ•œ ๋Œ€์•ˆ์œผ๋กœ, ์˜คํ”ˆ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ธ์ฆ(Authentication) ๊ธฐ๋Šฅ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‰ฝ๊ฒŒ ๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” 5๋ถ„ ์•ˆ์— Supabase๋กœ ๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค! โœจ


๐Ÿ”ฅ 1. Supabase ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ

  1. Supabase ๊ณต์‹ ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.
  2. “Start your project” ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ณ , GitHub ๋˜๋Š” Google ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  3. “New Project”๋ฅผ ์„ ํƒํ•˜๊ณ , ํ”„๋กœ์ ํŠธ ์ด๋ฆ„๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • (์˜ˆ: ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ my-auth-app, ์ง€์—ญ Seoul ์„ ํƒ)
  4. ์ƒ์„ฑ์ด ์™„๋ฃŒ๋˜๋ฉด, API URL๊ณผ Anon(์ต๋ช…) Key๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. (์ด ๊ฐ’๋“ค์€ ๋‚˜์ค‘์— ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค!)

๐Ÿ”‘ 2. ์ธ์ฆ(Auth) ์„ค์ •ํ•˜๊ธฐ

Supabase๋Š” ๋‹ค์–‘ํ•œ ๋กœ๊ทธ์ธ ๋ฐฉ์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฉ”์ผ/๋น„๋ฐ€๋ฒˆํ˜ธ ๋กœ๊ทธ์ธ์„ ํ™œ์„ฑํ™”ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์ขŒ์ธก ๋ฉ”๋‰ด์—์„œ Authentication โ†’ Providers๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. “Email” ์ œ๊ณต์ž๋ฅผ ์ผœ๊ณ (ํ† ๊ธ€ ๋ฒ„ํŠผ ํ™œ์„ฑํ™”), ํ•„์š”ํ•˜๋ฉด “Confirm email” ์„ค์ •์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
    • (ํ…Œ์ŠคํŠธ ์‹œ์—๋Š” ์ด๋ฉ”์ผ ํ™•์ธ์„ ๋„๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.)
  3. ์ถ”๊ฐ€๋กœ Google, GitHub ๋กœ๊ทธ์ธ๋„ ์‰ฝ๊ฒŒ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

๐Ÿ’ป 3. ํ”„๋ก ํŠธ์—”๋“œ์— Supabase ์—ฐ๊ฒฐํ•˜๊ธฐ (React ์˜ˆ์‹œ)

์ด์ œ ํด๋ผ์ด์–ธํŠธ์—์„œ Supabase๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. React ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

1) ํŒจํ‚ค์ง€ ์„ค์น˜

npm install @supabase/supabase-js

2) Supabase ํด๋ผ์ด์–ธํŠธ ์ดˆ๊ธฐํ™”

src/supabaseClient.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ์•„๊นŒ ํ™•์ธํ•œ API URL๊ณผ Anon Key๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

import { createClient } from '@supabase/supabase-js';

const supabaseUrl = 'YOUR_SUPABASE_URL';
const supabaseKey = 'YOUR_SUPABASE_ANON_KEY';
export const supabase = createClient(supabaseUrl, supabaseKey);

3) ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ ๊ตฌํ˜„

import { supabase } from './supabaseClient';

// ํšŒ์›๊ฐ€์ž…
async function signUp(email, password) {
  const { user, error } = await supabase.auth.signUp({
    email: email,
    password: password,
  });
  if (error) console.error('ํšŒ์›๊ฐ€์ž… ์˜ค๋ฅ˜:', error);
  else console.log('๊ฐ€์ž… ์„ฑ๊ณต:', user);
}

// ๋กœ๊ทธ์ธ
async function signIn(email, password) {
  const { user, error } = await supabase.auth.signIn({
    email: email,
    password: password,
  });
  if (error) console.error('๋กœ๊ทธ์ธ ์˜ค๋ฅ˜:', error);
  else console.log('๋กœ๊ทธ์ธ ์„ฑ๊ณต:', user);
}

๐ŸŒŸ 4. ๋กœ๊ทธ์ธ ์ƒํƒœ ํ™•์ธ & ๋กœ๊ทธ์•„์›ƒ

Supabase๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‚ฌ์šฉ์ž ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ํ˜„์žฌ ์‚ฌ์šฉ์ž ๊ฐ€์ ธ์˜ค๊ธฐ
const user = supabase.auth.user();

// ๋กœ๊ทธ์•„์›ƒ
async function signOut() {
  await supabase.auth.signOut();
}

// ๋กœ๊ทธ์ธ ์ƒํƒœ ๊ฐ์ง€ (์‹ค์‹œ๊ฐ„)
supabase.auth.onAuthStateChange((event, session) => {
  console.log('ํ˜„์žฌ ์ด๋ฒคํŠธ:', event); // 'SIGNED_IN', 'SIGNED_OUT' ๋“ฑ
  console.log('์„ธ์…˜ ์ •๋ณด:', session);
});

๐ŸŽฏ 5. ์ถ”๊ฐ€ ๊ธฐ๋Šฅ & ํŒ

  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ •: supabase.auth.api.resetPasswordForEmail(email)
  • ์†Œ์…œ ๋กœ๊ทธ์ธ: Google/GitHub ์—ฐ๋™์€ Providers์—์„œ ์„ค์ • ํ›„ supabase.auth.signIn({ provider: 'google' })
  • ์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ: supabase.from('profiles').insert(...)๋กœ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฐ€๋Šฅ

โœ… ๋งˆ๋ฌด๋ฆฌ

Supabase๋ฅผ ์ด์šฉํ•˜๋ฉด 5๋ถ„ ์•ˆ์— ์™„๋ฒฝํ•œ ๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐ŸŽ‰

  • ์žฅ์ : ์˜คํ”ˆ์†Œ์Šค, ๋ฌด๋ฃŒ ์š”๊ธˆ์ œ, Firebase ๋Œ€๋น„ ์œ ์—ฐ์„ฑ
  • ์ฃผ์˜์ : ์ดˆ๊ธฐ ์„ค์ • ์‹œ Anon Key ๋ณด์•ˆ์— ์œ ์˜ํ•˜์„ธ์š”!

์ง€๊ธˆ ๋ฐ”๋กœ Supabase๋กœ ๋‚˜๋งŒ์˜ ์ธ์ฆ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”! ๐Ÿ’ช

๐Ÿ“Œ ์ฐธ๊ณ  ์ž๋ฃŒ

ํ˜น์‹œ ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”! โœ๏ธ

๋‹ต๊ธ€ ๋‚จ๊ธฐ๊ธฐ

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค