๐ŸŒŸ ์•ฑ๊ตฌ์กฐ ์„ค์ •: Routes, Router

summereuna๐Ÿฅยท2022๋…„ 3์›” 8์ผ

๐ŸŒŸ Twinkle (React, Firebase)

๋ชฉ๋ก ๋ณด๊ธฐ
4/42

์•ฑ ๊ตฌ์กฐ ์žก๊ธฐ(Structure of App)

  1. /src/components ํด๋”, /src/routes ํด๋” ์ƒ์„ฑ

  2. App.js components ํด๋”๋กœ ์ด๋™, index.js์—์„œ App.js import path ์ˆ˜์ •ํ•˜๊ธฐ

  3. ๐Ÿ“ /routes ํด๋”์— route ๋งŒ๋“ค๊ธฐ

  • Auth.js (๋กœ๊ทธ์ธ: ์ธ์ฆ)
  • Home.js (ํ™ˆ: ํŠธ์œ— ์ž‘์„ฑ & ํŠธ์œ—๋ณด๊ธฐ)
  • Profile.js (ํ”„๋กœํ•„)
  • EditProfile.js (ํ”„๋กœํ•„ ์ˆ˜์ •)
//function component๋กœ ๋งŒ๋“ค์ž.
export default () => <span>Auth</span>;

//๊ทธ๋Ÿฐ๋ฐ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ Auth๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ธ ๋•Œ ์ž๋™์œผ๋กœ import ๋˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด ๋œ๋‹ค.
const Auth = () => <span>Auth</span>;

export default Auth;
  1. Routes ๋งŒ๋“ค๊ธฐ

    โ—๏ธ react-router-dom v.6๋กœ ์ž‘์—…

  • react-router-dom ์„ค์น˜
    npm i react-router-dom

  • Router๋Š” components์ด๊ธฐ ๋•Œ๋ฌธ์— ๐Ÿ“ /components/Router.js๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์ž

import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import { useState } from "react";
import Auth from "../routes/Auth";
import Home from "../routes/Home";

const AppRouter = () => {
  //useState Hook
  //๋กœ๊ทธ์ธ ์•ˆํ•œ ์ƒํƒœ๊ฐ€ ๋””ํ”ŒํŠธ๊ฐ’์ด ๋˜๋„๋ก false๋ฅผ ๋„ฃ์–ด ๋‘์ž.
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  return (
    <Router>
      <Routes>
        {/* ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ๋ฉด ํ™ˆ์œผ๋กœ, ์•„๋‹ˆ๋ฉด ์–ด์Šค๋กœ, ์ผ๋‹จ path๋Š” ๋‘˜๋‹ค /๋กœ ํ•˜์ž*/}
        {isLoggedIn ? (
          <Route path="/" element={<Home />}></Route>
        ) : (
          <Route path="/" element={<Auth />}></Route>
        )}
      </Routes>
    </Router>
  );
};

export default AppRouter;
  1. ๐Ÿ“ /src/components.App.js
    App์— ๋ฐฉ๊ธˆ ๋งŒ๋“  AppRouter ๋ Œ๋”ํ•˜๊ธฐ
import AppRouter from "./Router";

function App() {
  return <AppRouter />;
}

export default App;

์ฝ”๋“œ ์ˆ˜์ •

Router๋Š” ํ•˜๋‚˜์˜ ์šฉ๋„๋กœ๋งŒ ์“ฐ์ด๋Š”๊ฒŒ ์ข‹๊ธฐ ๋•Œ๋ฌธ์— Router.js์˜ AppRouter์˜ useState๋ฅผ ์‚ญ์ œํ•˜์ž.

๐Ÿ“ App.js
Application(App.js)์ด ๋ชจ๋“  ๋กœ์ง์„ ๋‹ค๋ฃจ๊ฒŒ ํ•˜์ž.

import AppRouter from "./Router";
import { useState } from "react";

function App() {
  //๐Ÿ”ฅ useState Hook
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  //Router ๋ Œ๋”ํ•˜๊ธฐ
  //๐Ÿ”ฅ AppRouter์— prop ์ „๋‹ฌํ•˜๊ธฐ
  return <AppRouter isLoggedIn={isLoggedIn} />;
}

export default App;

๐Ÿ“ Router.js

import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import Auth from "../routes/Auth";
import Home from "../routes/Home";

//๐Ÿ”ฅ App์—์„œ AppRouter๋กœ ๋ณด๋‚ธ prop์ธ isLoggedIn ๋ฐ›๊ธฐ
const AppRouter = ({ isLoggedIn }) => {
  return (
    <Router>
      <Routes>
        {/* ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ๋ฉด /์œผ๋กœ, ์•„๋‹ˆ๋ฉด /login์œผ๋กœ */}
        {isLoggedIn ? (
          <Route path="/" element={<Home />}></Route>
        ) : (
          <Route path="/" element={<Auth />}></Route>
        )}
      </Routes>
    </Router>
  );
};

export default AppRouter;

๐Ÿ”ฅ App.js๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ ์•ˆ์— AppRouter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”?
footer ๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.
์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ์ž‘์„ฑํ•˜๋ฉด AppRouter์—์„œ ์Šคํฌ๋ฆฐ์ด ๋ฐ”๋€Œ์–ด๋„ ํ‘ธํ„ฐ๋Š” ํ•ญ์ƒ ๋‚˜์˜จ๋‹ค.

๐Ÿ“ App.js

import AppRouter from "./Router";
import { useState } from "react";

function App() {
  //๐Ÿ”ฅ useState Hook
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  //Router ๋ Œ๋”ํ•˜๊ธฐ
  //๐Ÿ”ฅ AppRouter์— prop ์ „๋‹ฌํ•˜๊ธฐ
  return (
    <>
      <AppRouter isLoggedIn={isLoggedIn} />
      <footer>&copy; twinkle {new Date().getFullYear()}</footer>
    </>
  );
}

export default App;

JSX fragnent <>...</>
: ๋ Œ๋”ํ•˜๊ณ  ์‹ถ์€ ํƒœ๊ทธ๊ฐ€ ๋งŽ์€ ๋ฐ ์ƒ์œ„ ๋ถ€๋ชจ์š”์†Œ๊ฐ€ ํƒœ๊ทธ ์ „์ฒด๋ฅผ ๊ฐ์‹ธ๋Š” ํ˜•ํƒœ๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ, ์ „์ฒด๋ฅผ ๊ฐ์‹ธ๋Š” ์šฉ๋„๋กœ fragnent๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

profile
Always have hope๐Ÿ€ & constant passion๐Ÿ”ฅ

0๊ฐœ์˜ ๋Œ“๊ธ€