REACT

REACT Supabase

zayn 2024. 11. 5. 22:01

Supabase와 React를 사용하는 방법



React Supabase

1. Supabase 소개와 특징

 주요 개념 설명
- Supabase는 오픈 소스 Firebase 대안으로, 데이터베이스, 인증, 스토리지 및 서버리스 함수를 제공하여 빠르게 백엔드 기능을 구현할 수 있도록 합니다.
- 특징:
  - PostgreSQL 기반 데이터베이스를 사용해 강력하고 확장 가능한 데이터베이스 환경을 제공합니다.
  - 실시간 기능: 데이터 변경 사항을 실시간으로 반영합니다.
  - 쉽고 빠른 인증: OAuth 제공자와 연동하여 쉽게 인증 기능을 설정할 수 있습니다.
  - RESTful API 자동 생성: 데이터베이스 테이블에 REST API와 GraphQL API가 자동으로 생성됩니다.

사용 시나리오
- 스타트업이나 소규모 프로젝트에서 백엔드 개발 시간을 줄여줍니다. 특히 데이터베이스와 인증이 필요한 SPA (Single Page Application) 애플리케이션에서 유용합니다.



 2. Supabase와 React의 통합 방법

주요 개념 설명
- Supabase 클라이언트 설정: Supabase를 React 애플리케이션과 통합하려면, Supabase 클라이언트를 초기화하여 프로젝트와 연결해야 합니다.
- 연결 설정: Supabase에서 발급한 API 키와 URL을 사용하여 클라이언트를 생성합니다.

예시 코드

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

const supabaseUrl = 'https://your-supabase-url.supabase.co';
const supabaseKey = 'your-public-anon-key';
export const supabase = createClient(supabaseUrl, supabaseKey);



사용 시나리오
- 데이터베이스 접근: 애플리케이션에서 Supabase 클라이언트를 통해 데이터베이스와 인증 기능을 쉽게 사용할 수 있습니다.
- Supabase 클라이언트를 전역 상태로 관리하여 어디서든 데이터를 불러오거나 인증 상태를 확인할 수 있습니다.




3. CRUD 기능 구현을 위한 기본 설정 및 사용법

주요 개념 설명
- CRUD (Create, Read, Update, Delete): Supabase에서 테이블에 데이터를 추가, 읽기, 수정, 삭제하는 기본적인 데이터 조작 방법입니다.
- Supabase 클라이언트를 사용해 각 기능을 쉽게 구현할 수 있습니다.

사용 시나리오
- 게시판이나 Todo 리스트와 같은 애플리케이션에서 데이터 조작을 할 때 유용합니다.

예시 코드

데이터 추가 (Create)

async function addTodo(text) {
    const { data, error } = await supabase.from('todos').insert([{ text }]);
    if (error) console.error(error);
    else console.log('Added:', data);
}



데이터 읽기 (Read)

async function getTodos() {
    const { data, error } = await supabase.from('todos').select('*');
    if (error) console.error(error);
    else return data;
}



 데이터 수정 (Update)

async function updateTodo(id, newText) {
    const { data, error } = await supabase.from('todos').update({ text: newText }).eq('id', id);
    if (error) console.error(error);
    else console.log('Updated:', data);
}



데이터 삭제 (Delete)

async function deleteTodo(id) {
    const { data, error } = await supabase.from('todos').delete().eq('id', id);
    if (error) console.error(error);
    else console.log('Deleted:', data);
}


4. 인증 기능 예제: 로그인, 회원가입, 로그아웃

주요 개념 설명
- Supabase의 인증 기능은 이메일/비밀번호 로그인뿐만 아니라 OAuth 제공자(Google, GitHub 등) 연동을 통해 다양한 로그인 옵션을 제공합니다.
- 인증 상태를 클라이언트에서 쉽게 관리할 수 있으며, React 애플리케이션과 연동하여 실시간으로 로그인 상태를 확인할 수 있습니다.

사용 시나리오
- 사용자의 로그인 상태를 기반으로 접근 권한을 관리하는 애플리케이션에서 활용됩니다. 예를 들어, 로그인이 필요한 페이지를 만들거나 특정 사용자의 데이터에만 접근할 수 있도록 할 수 있습니다.

예시 코드

회원가입

async function signUp(email, password) {
    const { user, error } = await supabase.auth.signUp({ email, password });
    if (error) console.error(error);
    else console.log('Signed up:', user);
}



로그인

async function signIn(email, password) {
    const { user, error } = await supabase.auth.signIn({ email, password });
    if (error) console.error(error);
    else console.log('Signed in:', user);
}



로그아웃

async function signOut() {
    const { error } = await supabase.auth.signOut();
    if (error) console.error(error);
    else console.log('Signed out');
}

 5. 실습 예제: React에서 Supabase를 사용한 간단한 데이터베이스 연동

주요 개념 설명


React와 Supabase를 활용해 간단한 Todo 리스트 애플리케이션을 구현해봅니다. 사용자 인증과 CRUD 기능을 포함하여 실습합니다.

예시 코드

App 컴포넌트

import React, { useState, useEffect } from 'react';
import { supabase } from './supabaseClient';

function App() {
    const [todos, setTodos] = useState([]);
    const [newTodo, setNewTodo] = useState('');
    const [user, setUser] = useState(null);

    useEffect(() => {
        fetchTodos();
        checkUser();
    }, []);

    // 유저 로그인 상태 확인
    const checkUser = async () => {
        const { data } = await supabase.auth.getSession();
        setUser(data.session?.user || null);
    };

    // Todo 리스트 가져오기
    const fetchTodos = async () => {
        const { data, error } = await supabase.from('todos').select('*');
        if (error) console.error(error);
        else setTodos(data);
    };

    // Todo 추가
    const addTodo = async () => {
        const { data, error } = await supabase.from('todos').insert([{ text: newTodo }]);
        if (error) console.error(error);
        else {
            setTodos([...todos, ...data]);
            setNewTodo('');
        }
    };

    // Todo 삭제
    const deleteTodo = async (id) => {
        const { error } = await supabase.from('todos').delete().eq('id', id);
        if (error) console.error(error);
        else setTodos(todos.filter(todo => todo.id !== id));
    };

    return (
        <div>
            <h1>Todo List</h1>
            {user ? (
                <>
                    <input
                        value={newTodo}
                        onChange={(e) => setNewTodo(e.target.value)}
                        placeholder="Add a new todo"
                    />
                    <button onClick={addTodo}>Add</button>
                    <ul>
                        {todos.map(todo => (
                            <li key={todo.id}>
                                {todo.text} 
                                <button onClick={() => deleteTodo(todo.id)}>Delete</button>
                            </li>
                        ))}
                    </ul>
                </>
            ) : (
                <p>Please log in to view your todos.</p>
            )}
        </div>
    );
}

export default App;

 

'REACT' 카테고리의 다른 글

24.11.12  (1) 2024.11.13
REACT 포켓몬 도감 만들기 DAY_1  (0) 2024.11.06
React Router  (0) 2024.11.05
REACT_REDUX  (1) 2024.11.05
REACT_숙련  (0) 2024.11.05