프로젝트 회고

트위터 클론 ‘Deli’ 회고 — React + Firebase (2. App.tsx)

0또는1 2025. 4. 20. 19:06
728x90

 

1. App.tsx 파일 개요

 

이 글에서는 ‘Deli’ 앱의 진입점인 `App.tsx` 파일을 살펴봅니다.  
- 전역 스타일 정의  
- 라우터(ProtectedRoute 포함) 설정  
- 로딩 화면 처리

 


2. 모듈 임포트

import { RouterProvider, createBrowserRouter } from "react-router-dom";
import { createGlobalStyle, styled } from "styled-components";
import reset from "styled-reset";
import { useEffect, useState } from "react";
import { auth } from "./firebase";

// 레이아웃·페이지·컴포넌트
import Layout from "./component/layout";
import Home from "./routes/home";
import Profile from "./routes/profile";
import Login from "./routes/login";
import CreateAccount from "./routes/create-account";
import LoadingScreen from "./component/loading-screen";
import ProtectedRoute from "./component/protected-route";
import GlobalStyle from './component/global-styles';
  • react-router-dom: SPA 라우팅
  • styled-components & reset: 전역·기본 스타일
  • firebase.auth: 인증 상태 확인

3. 라우터 설정

const router = createBrowserRouter([
  {
    path: "/",
    element: (
      <ProtectedRoute>
        <Layout />
      </ProtectedRoute>
    ),
    children: [
      { path: "", element: <Home /> },
      { path: "profile/:userId", element: <Profile /> },
    ],
  },
  { path: "/login", element: <Login /> },
  { path: "/create-account", element: <CreateAccount /> },
]);
  • ProtectedRoute로 인증된 사용자만 접근 가능
  • 기본 홈, 프로필, 로그인·계정 생성 페이지 등록

4. 전역 스타일 정의

const GlobalStyles = createGlobalStyle`
  ${reset};
  * { box-sizing: border-box; }
  body {
    background-color: #fff;
    color: #000;
  }
`;

const Wrapper = styled.div`
  height: 100vh;
  display: flex;
  justify-content: center;
`;
  • reset + box-sizing으로 브라우저 간 일관성 확보
  • Wrapper로 로딩·앱 화면 중앙 정렬

5. App 컴포넌트 & 로딩 처리

function App() {
  const [isLoading, setLoading] = useState(true);

  useEffect(() => {
    auth.onAuthStateChanged(() => setLoading(false));
  }, []);

  return (
    <Wrapper>
      <GlobalStyle />
      <GlobalStyles />
      {isLoading ? <LoadingScreen /> : <RouterProvider router={router} />}
    </Wrapper>
  );
}
  • isLoading: 인증 체크 전 로딩 스크린
  • onAuthStateChanged 콜백에서 로딩 해제

 

 

“다음 회차에서는 회원가입 로직과 로그인 코드를 분석해볼게요. 기대해주세요!
728x90