SW/TypeScript

React와 Firebase를 활용한 투두 애플리케이션 만들기: 기본부터 완성까지

얇은생각 2024. 11. 2. 07:30
반응형

오늘날 다양한 방식으로 작업을 관리할 수 있는 도구들이 있습니다. 그중에서도 투두 리스트 애플리케이션은 간단하면서도 강력한 작업 관리 도구로 널리 사용됩니다. 개발자들이 이러한 투두 애플리케이션을 만들어 보는 것은 단순히 기능 구현을 넘어서 다양한 개념들을 배우고 실전 경험을 쌓는 데 매우 유용합니다. 특히 이번 프로젝트에서는 React Firebase를 활용해 투두 리스트 애플리케이션을 만들어보면서, 데이터베이스와의 통합, 실시간 데이터 처리, UI 설계 등의 개념을 체험하게 됩니다.

 

 

React와 Firebase를 활용한 투두 애플리케이션 만들기: 기본부터 완성까지

 

 

사전 준비물

  • Node.js: React 프로젝트에서 필요한 npm 패키지 설치를 위해 필요합니다.
  • VS Code: 코드 편집기로서 React 프로젝트 개발을 위한 환경을 제공합니다.
  • Firebase 콘솔: 클라우드 기반 데이터베이스인 Firestore와의 통합을 위해 사용됩니다.

 

 

Firebase 프로젝트 생성 및 설정

Firebase를 사용하려면 먼저 Firebase 콘솔에서 프로젝트를 생성해야 합니다. Firebase 콘솔에 접속해 Google 계정으로 로그인한 후 새 프로젝트를 생성합니다. 프로젝트 생성 단계에서는 프로젝트 이름을 지정하고 Google 애널리틱스를 비활성화합니다. 프로젝트 생성이 완료되면 Firebase 대시보드로 이동하게 됩니다.

 

 

Firestore 데이터베이스 생성

Firebase 대시보드의 왼쪽 패널에서 Build 메뉴를 클릭하고, Firestore Database를 선택합니다. 데이터베이스 만들기 버튼을 클릭한 후, 테스트 모드로 설정하여 개발 단계에서 자유롭게 데이터를 저장하고 읽을 수 있도록 합니다. Firestore 데이터베이스가 생성되면 초기 상태는 비어있는 컬렉션으로 시작됩니다.

 

 

React 프로젝트 생성 및 설정

이제 React 프로젝트를 생성합니다. Node.js가 설치되어 있다면 아래 명령어로 Create React App(CRA)을 사용해 새로운 React 프로젝트를 시작할 수 있습니다.

npx create-react-app todo-app
cd todo-app
code .

 

 

위 명령어로 todo-app이라는 이름의 새로운 React 프로젝트가 생성되며, Visual Studio Code로 프로젝트가 열립니다.

 

 

프로젝트 구조 설정

프로젝트 구조를 설정하기 위해 src 폴더 아래에 두 개의 폴더를 생성합니다. 첫 번째는 components 폴더이며, 여기에는 Todo.jsEditTodo.js라는 두 개의 컴포넌트를 생성합니다. 두 번째는 services 폴더로, 여기에는 Firebase 설정을 담을 firebase.config.js 파일을 생성합니다.

 

 

Firebase React와 통합

Firebase React 프로젝트에 통합하기 위해 Firebase SDK를 설치해야 합니다. 터미널에서 아래 명령어를 실행하여 Firebase 패키지를 설치합니다.

npm install firebase

 

 

firebase.config.js 파일에서 Firebase 설정을 작성합니다. Firebase 대시보드에서 프로젝트 설정으로 이동해 Firebase SDK 설정 정보를 복사해 아래와 같이 구성합니다.

import { initializeApp } from 'firebase/app';
import { getFirestore } from 'firebase/firestore';

const firebaseConfig = {
  apiKey: "YOUR_API_KEY",
  authDomain: "YOUR_AUTH_DOMAIN",
  projectId: "YOUR_PROJECT_ID",
  storageBucket: "YOUR_STORAGE_BUCKET",
  messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
  appId: "YOUR_APP_ID"
};

const app = initializeApp(firebaseConfig);
export const db = getFirestore(app);

 

 

Bootstrap 5 React에 통합

Bootstrap을 활용해 간편하게 스타일링을 적용할 수 있습니다. Bootstrap 5 CDN 링크를 사용하여 public/index.html 파일의 <head> 섹션에 Bootstrap CSS JavaScript 파일을 추가합니다.

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet">

 

 

이제 React 컴포넌트에서 Bootstrap 클래스를 활용해 스타일링된 UI를 만들 수 있습니다.

 

 

사용자 인터페이스 설계

Todo.js 컴포넌트에서 할 일 목록을 추가하고 표시할 UI를 설계합니다. UI Bootstrap 클래스를 활용하여 간단하면서도 직관적인 디자인을 구현할 수 있습니다.

import React from 'react';

const Todo = () => {
  return (
    <div className="container">
      <div className="card">
        <div className="card-body">
          <button className="btn btn-info" data-bs-toggle="modal" data-bs-target="#addModal">할 일 추가</button>
          <div className="todo-list">
            {/* 할 일 목록 표시 */}
          </div>
        </div>
      </div>

      {/* 할 일 추가 모달 */}
      <div className="modal fade" id="addModal" tabIndex="-1">
        <div className="modal-dialog">
          <form>
            <div className="modal-content">
              <div className="modal-header">
                <h5 className="modal-title">할 일 추가</h5>
                <button type="button" className="btn-close" data-bs-dismiss="modal"></button>
              </div>
              <div className="modal-body">
                <input type="text" className="form-control" placeholder="할 일 입력" />
              </div>
              <div className="modal-footer">
                <button type="button" className="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
                <button type="button" className="btn btn-primary">저장</button>
              </div>
            </div>
          </form>
        </div>
      </div>
    </div>
  );
}

export default Todo;

 

 

Firestore 데이터 추가

할 일을 Firebase Firestore에 저장하기 위해 FirestoreaddDoc 메서드를 사용합니다. 사용자가 입력한 할 일을 Firestore에 추가하고, 이를 다시 화면에 표시합니다.

import { collection, addDoc, serverTimestamp } from 'firebase/firestore';
import { db } from '../services/firebase.config';

const submitTodo = async (e) => {
  e.preventDefault();
  try {
    await addDoc(collection(db, 'todos'), {
      task: newTask,
      completed: false,
      timestamp: serverTimestamp(),
    });
    window.location.reload();
  } catch (err) {
    console.error(err);
  }
};

 

 

Firestore에서 데이터 가져오기 및 표시

Firestore에 저장된 데이터를 가져와 React 컴포넌트에 표시하기 위해 getDocs 메서드를 사용합니다. 데이터를 가져와 useEffect를 활용해 화면에 렌더링합니다.

import { useEffect, useState } from 'react';
import { collection, getDocs } from 'firebase/firestore';
import { db } from '../services/firebase.config';

const Todo = () => {
  const [todos, setTodos] = useState([]);

  useEffect(() => {
    const fetchData = async () => {
      const querySnapshot = await getDocs(collection(db, 'todos'));
      setTodos(querySnapshot.docs.map(doc => ({ ...doc.data(), id: doc.id })));
    };
    fetchData();
  }, []);

  return (
    <div className="todo-list">
      {todos.map(todo => (
        <div key={todo.id}>{todo.task}</div>
      ))}
    </div>
  );
};

 

 

Firestore 데이터 삭제 및 업데이트

삭제 및 업데이트 기능은 deleteDoc, updateDoc 메서드를 사용하여 구현할 수 있습니다. 각 할 일 항목 옆에 삭제 및 수정 버튼을 추가해 사용자가 해당 기능을 쉽게 사용할 수 있도록 합니다.

 

 

체크박스 기능 구현 및 데이터 정렬

체크박스 기능을 구현하여 사용자가 완료한 작업을 표시할 수 있도록 합니다. 완료된 작업은 isChecked 값으로 Firestore에 저장되고, 화면에는 text-decoration: line-through 스타일로 표시됩니다. 또한, FirestoreorderBy 메서드를 활용해 할 일 목록을 시간 순으로 정렬할 수 있습니다.

 

 

결론

이번 프로젝트를 통해 React Firebase를 활용한 기본적인 투두 리스트 애플리케이션을 완성했습니다. 데이터베이스 연동, UI 설계, CRUD 기능 구현 등 여러 중요한 개념을 다뤘습니다.

반응형