본문 바로가기
React

React에서 Firebase와의 연동: 실시간 데이터와 인증 구현하기

by 굿센스굿 2024. 12. 16.
반응형

 

React와 Firebase는 프론트엔드 애플리케이션 개발에서 강력한 조합을 제공합니다. Firebase는 실시간 데이터베이스, 인증, 호스팅 등 다양한 기능을 제공하며, 이를 React와 함께 사용하면 간단하게 완성도 높은 애플리케이션을 만들 수 있습니다. 이번 글에서는 Firebase와 React를 연동하여 실시간 데이터베이스 및 인증 기능을 구현하는 방법을 단계별로 알아보겠습니다.


1. Firebase란 무엇인가?

Firebase는 Google이 제공하는 백엔드 서비스로, 다음과 같은 주요 기능을 제공합니다:

  • 실시간 데이터베이스 및 Firestore: 클라우드 기반 NoSQL 데이터베이스.
  • 인증(Authentication): 이메일, Google, Facebook, GitHub 등 다양한 방식의 사용자 인증.
  • 호스팅(Hosting): 정적 웹 애플리케이션 호스팅.
  • 스토리지(Storage): 파일 업로드 및 관리.
  • 클라우드 펑션(Cloud Functions): 서버리스 백엔드 로직 실행.

React 애플리케이션에서는 Firebase를 사용해 빠르게 백엔드 기능을 구현할 수 있습니다.


2. Firebase 설정 및 초기화

2.1 Firebase 프로젝트 생성

  1. Firebase Console에 접속하여 새 프로젝트를 생성합니다.
  2. 프로젝트 이름을 입력하고 설정을 완료합니다.
  3. Firebase SDK 설정 페이지에서 웹 애플리케이션을 추가합니다.
  4. Firebase가 제공하는 Firebase Config 객체를 복사하여 React 프로젝트에서 사용할 준비를 합니다.

2.2 React 프로젝트 생성

React 프로젝트를 생성하고 필요한 Firebase 패키지를 설치합니다:

npx create-react-app react-firebase-app
cd react-firebase-app
npm install firebase

3. Firebase 초기화

React 프로젝트의 src 폴더에 firebase.js 파일을 생성하고 Firebase를 초기화합니다.

// src/firebase.js
import { initializeApp } from "firebase/app";
import { getFirestore } from "firebase/firestore";
import { getAuth } from "firebase/auth";

// Firebase 프로젝트 설정
const firebaseConfig = {
  apiKey: "your-api-key",
  authDomain: "your-project-id.firebaseapp.com",
  projectId: "your-project-id",
  storageBucket: "your-project-id.appspot.com",
  messagingSenderId: "your-sender-id",
  appId: "your-app-id",
};

// Firebase 초기화
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);
const auth = getAuth(app);

export { db, auth };

위의 코드에서 initializeApp을 사용해 Firebase 앱을 초기화하고, Firestore와 Authentication 서비스를 가져옵니다.


4. Firebase Authentication 연동

Firebase 인증을 React와 연동하는 방법을 알아보겠습니다.

4.1 Firebase 인증 활성화

  1. Firebase Console에서 Authentication 탭을 클릭합니다.
  2. 로그인 방법(Sign-in method)에서 이메일/비밀번호를 활성화합니다.

4.2 React에서 이메일/비밀번호 인증 구현

Login.js와 Register.js 컴포넌트를 생성하여 사용자 로그인 및 회원가입 기능을 구현합니다.

회원가입 컴포넌트

// src/Register.js
import React, { useState } from "react";
import { createUserWithEmailAndPassword } from "firebase/auth";
import { auth } from "./firebase";

const Register = () => {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");

  const handleRegister = async (e) => {
    e.preventDefault();
    try {
      await createUserWithEmailAndPassword(auth, email, password);
      alert("회원가입 성공!");
    } catch (error) {
      alert("회원가입 실패: " + error.message);
    }
  };

  return (
    <form onSubmit={handleRegister}>
      <input
        type="email"
        placeholder="이메일"
        value={email}
        onChange={(e) => setEmail(e.target.value)}
      />
      <input
        type="password"
        placeholder="비밀번호"
        value={password}
        onChange={(e) => setPassword(e.target.value)}
      />
      <button type="submit">회원가입</button>
    </form>
  );
};

export default Register;

로그인 컴포넌트

// src/Login.js
import React, { useState } from "react";
import { signInWithEmailAndPassword } from "firebase/auth";
import { auth } from "./firebase";

const Login = () => {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");

  const handleLogin = async (e) => {
    e.preventDefault();
    try {
      await signInWithEmailAndPassword(auth, email, password);
      alert("로그인 성공!");
    } catch (error) {
      alert("로그인 실패: " + error.message);
    }
  };

  return (
    <form onSubmit={handleLogin}>
      <input
        type="email"
        placeholder="이메일"
        value={email}
        onChange={(e) => setEmail(e.target.value)}
      />
      <input
        type="password"
        placeholder="비밀번호"
        value={password}
        onChange={(e) => setPassword(e.target.value)}
      />
      <button type="submit">로그인</button>
    </form>
  );
};

export default Login;

5. Firebase Firestore 연동

Firestore는 Firebase의 클라우드 기반 NoSQL 데이터베이스로, 실시간 데이터 동기화가 가능합니다.

5.1 Firestore 데이터 읽기 및 쓰기

아래는 Firestore에 데이터를 저장하고 읽는 간단한 예제입니다.

데이터 쓰기

import { collection, addDoc } from "firebase/firestore";
import { db } from "./firebase";

const saveData = async () => {
  try {
    await addDoc(collection(db, "tasks"), { title: "React와 Firebase 연동", completed: false });
    alert("데이터 저장 성공!");
  } catch (error) {
    alert("데이터 저장 실패: " + error.message);
  }
};

데이터 읽기

import { collection, getDocs } from "firebase/firestore";
import { db } from "./firebase";

const fetchData = async () => {
  try {
    const querySnapshot = await getDocs(collection(db, "tasks"));
    querySnapshot.forEach((doc) => {
      console.log(doc.id, "=>", doc.data());
    });
  } catch (error) {
    alert("데이터 읽기 실패: " + error.message);
  }
};

6. Firebase를 사용한 실시간 데이터 관리

Firestore는 실시간 업데이트 기능을 제공합니다. 다음은 데이터의 실시간 변경 사항을 구독하는 방법입니다:

import { collection, onSnapshot } from "firebase/firestore";
import { db } from "./firebase";

const subscribeToData = () => {
  const unsubscribe = onSnapshot(collection(db, "tasks"), (snapshot) => {
    snapshot.docs.forEach((doc) => {
      console.log(doc.id, "=>", doc.data());
    });
  });

  // 필요 시 구독 해제
  return unsubscribe;
};

7. 결론

React와 Firebase를 연동하면 인증, 실시간 데이터 동기화, 서버리스 백엔드 기능을 손쉽게 구현할 수 있습니다. Firebase의 강력한 기능을 활용해 애플리케이션의 확장성과 생산성을 극대화해 보세요! 이 글을 기반으로 간단한 To-Do 앱, 채팅 앱 등을 만들어 보며 Firebase의 다양한 기능을 경험해 보시길 추천합니다.

반응형