๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
React

[React] ํŽ˜์ด์ง€ ์ด๋™ ๊ธฐ๋Šฅ ๋„ฃ๊ธฐ

by wildOjisan 2025. 5. 10.

my_react_app.zip
0.18MB

 

์„ค์น˜:

npm install react-router-dom

 

๐Ÿ’ก ๋ชฉํ‘œ

๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด "Todo List" ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ ,
๋ชจ๋“  ํŽ˜์ด์ง€์— ํ—ค๋”์™€ ํ‘ธํ„ฐ๋Š” ํ•ญ์ƒ ๋‚˜์˜ค๊ฒŒ ๋งŒ๋“ค์ž!

๐Ÿงฉ 1. ๋จผ์ € ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๊ตฌ์กฐ๋Š” ์ด๊ฑฐ์•ผ

ํŽ˜์ด์ง€ ์ฃผ์†Œํ™”๋ฉด์— ๋ณด์ด๋Š” ๋‚ด์šฉ
/ ํ—ค๋” + ํ™ˆ ํŽ˜์ด์ง€ ๋ณธ๋ฌธ + ํ‘ธํ„ฐ
/todo_list ํ—ค๋” + ํˆฌ๋‘๋ฆฌ์ŠคํŠธ ๋ณธ๋ฌธ + ํ‘ธํ„ฐ
 

โœ… ํ—ค๋”๋ž‘ ํ‘ธํ„ฐ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š๊ณ  ํ•ญ์ƒ ๊ณ ์ •
โœ… ๊ฐ€์šด๋ฐ ๋‚ด์šฉ(๋ณธ๋ฌธ)๋งŒ ์ฃผ์†Œ์— ๋”ฐ๋ผ ๋ฐ”๋€œ

 

๐Ÿ“ 2. ํด๋” ๊ตฌ์กฐ๋ฅผ ๋‚˜๋ˆ„๋Š” ์ด์œ 

โ“์™œ /pages ํด๋”๋ฅผ ๋งŒ๋“ค๊นŒ?

  • ํŽ˜์ด์ง€๋งˆ๋‹ค ๋ณด์—ฌ์ค„ ๋ณธ๋ฌธ ๋‚ด์šฉ์„ ๋”ฐ๋กœ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๋ ค๊ณ !
  • ์˜ˆ: Home.tsx, TodoList.tsx ๊ฐ™์€ ๊ฒƒ๋“ค

โ“์™œ /components ํด๋”๋ฅผ ๋งŒ๋“ค๊นŒ?

  • ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ๊ฐ™์ด ์“ฐ๋Š” ์žฌ๋ฃŒ๋“ค์„ ๋„ฃ์–ด๋‘๋ ค๊ณ !
  • ์˜ˆ: Header.tsx, Footer.tsx, Layout.tsx

์ด๋ ‡๊ฒŒ ๊ตฌ๋ถ„ํ•ด๋‘๋ฉด

“์ด๊ฑด ํŽ˜์ด์ง€ ๋ณธ๋ฌธ์ด๊ณ ”
“์ด๊ฑด ๋ชจ๋“  ํŽ˜์ด์ง€์— ํ•ญ์ƒ ํ•„์š”ํ•œ ๊ณตํ†ต ๋ถ€ํ’ˆ์ด์•ผ”
๋”ฑ ๊ตฌ๋ถ„์ด ๋ผ์„œ ์ฝ”๋“œ๊ฐ€ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š์•„!

 

Layout.tsx: ๊ณตํ†ตํ‹€ ๋งŒ๋“ค๊ธฐ

// src/components/Layout.tsx
import React from "react";
import Header from "./Header";
import Footer from "./Footer";
import { Outlet } from "react-router-dom";

const Layout: React.FC = () => {
  return (
    <>
      <Header />
      <main>
        <Outlet />
      </main>
      <Footer />
    </>
  );
};

export default Layout;

๐Ÿ” ์ด๊ฒŒ ๋ฌด์Šจ ๋œป์ด์•ผ?

  • <Header />, <Footer />๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ํ•ญ์ƒ ๋ณด์—ฌ์ง
  • <Outlet /> ← ์š”๊ธฐ๋งŒ ๋ฐ”๋€๋‹ค!
    ๐Ÿ‘‰ ์ฆ‰, Home ํŽ˜์ด์ง€๋ฉด ์—ฌ๊ธฐ <Home /> ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€๊ณ 
    ๐Ÿ‘‰ /todo_list๋ฉด <TodoList /> ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ!

๐Ÿงƒ ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด: Layout.tsx๋Š” ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ์„ ์ •์˜ํ•˜๊ณ ,
ํŽ˜์ด์ง€์— ๋”ฐ๋ผ ์ค‘๊ฐ„ ๋‚ด์šฉ๋งŒ ๊ฐˆ์•„๋ผ์šฐ๋Š” ์—ญํ• !

 

src/pages/Home.tsx

import React from "react";
import { Link } from "react-router-dom";

const Home: React.FC = () => {
  return (
    <>
      <h2>ํ™ˆ ํ™”๋ฉด์ด์—์š”!</h2>
      <p>๋ฆฌ์•กํŠธ์™€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐฐ์›Œ๋ด์š” ๐ŸŽ‰</p>
      <Link to="/todo_list">
        <button>Todo List๋กœ ์ด๋™</button>
      </Link>
    </>
  );
};

export default Home;

 

src/pages/TodoList.tsx

import React from "react";

const TodoList: React.FC = () => {
  return (
    <>
      <h2>๐Ÿ“ Todo List ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค!</h2>
      <p>์—ฌ๊ธฐ์— ํ•  ์ผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์š”!</p>
    </>
  );
};

export default TodoList;

โ“<> </> ์ด๊ฑด ๋ญ์•ผ?

์ด๊ฑด "๋นˆ ๊ป๋ฐ๊ธฐ ํƒœ๊ทธ"์•ผ. ์ด๋ฆ„์€ Fragment(ํ”„๋ž˜๊ทธ๋จผํŠธ).
div์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ํƒœ๊ทธ๋ฅผ ๋ฌถ์–ด์ฃผ์ง€๋งŒ ๋ถˆํ•„์š”ํ•œ HTML ํƒœ๊ทธ๊ฐ€ ์ถ”๊ฐ€๋˜์ง€ ์•Š์•„์„œ ๊น”๋”ํ•ด.

 

 

App.tsx: ๋ชจ๋“  ๊ฑธ ์กฐ๋ฆฝํ•˜๋Š” ๊ณณ!

import React from "react";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Layout from "./components/Layout";
import Home from "./pages/Home";
import TodoList from "./pages/TodoList";

function App() {
  return (
    <BrowserRouter>
      <Routes>
        {/* Layout์€ ๊ณตํ†ต ํ‹€์ด๊ณ  */}
        <Route element={<Layout />}>
          {/* ์—ฌ๊ธฐ ์•ˆ์— ์žˆ๋Š” ๊ฒƒ๋งŒ ๋ฐ”๋€œ */}
          <Route path="/" element={<Home />} />
          <Route path="/todo_list" element={<TodoList />} />
        </Route>
      </Routes>
    </BrowserRouter>
  );
}

export default App;

๐Ÿ” ์ด๊ฑด ๋ฌด์Šจ ๋œป์ด์•ผ?

  • BrowserRouter → ์ฃผ์†Œ๋กœ ํŽ˜์ด์ง€ ์ด๋™ ๊ธฐ๋Šฅ์„ ์ผœ์คŒ
  • Routes → ํŽ˜์ด์ง€๋“ค์„ ๋ชจ์•„๋†“๋Š” ๊ณต๊ฐ„
  • Route element={<Layout />} → ๊ธฐ๋ณธํ‹€์„ ๋จผ์ € ์ •ํ•˜๊ณ 
  • ๊ทธ ์•ˆ์— Home, TodoList ๋ฅผ ๊ฐ๊ฐ ์ฃผ์†Œ(path)๋กœ ์—ฐ๊ฒฐํ•จ

๐Ÿ‘‰ ์ฆ‰, Layout ํ‹€์€ ๊ณ ์ •์ด๊ณ , Outlet ์ž๋ฆฌ์— Home ๋˜๋Š” TodoList๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š” ๊ตฌ์กฐ์•ผ!

 

 

โœ… ์ •๋ฆฌ: ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•ด!

  1. /๋กœ ์ ‘์†ํ•˜๋ฉด → Layout ํ‹€ ์•ˆ์— Home ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ
  2. /todo_list๋กœ ์ ‘์†ํ•˜๋ฉด → Layout ํ‹€ ์•ˆ์— TodoList ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ

์ฆ‰, Header๋ž‘ Footer๋Š” ๊ณ„์† ๊ณ ์ •์ด๊ณ , ๋ณธ๋ฌธ๋งŒ ๋ฐ”๋€Œ๋Š” ์•„์ฃผ ๊น”๋”ํ•œ ๊ตฌ์กฐ!


๐Ÿงผ ๋งˆ์ง€๋ง‰ ํŒ: ํด๋” ์ด๋ฆ„์€ ์ด๋ ‡๊ฒŒ ์™ธ์šฐ๋ฉด ์‰ฌ์›Œ

  • components = ๋ถ€ํ’ˆ๋“ค
  • pages = ๋ณธ๋ฌธ๋“ค
  • Layout = ๋ถ€ํ’ˆ ์กฐ๋ฆฝ ํ‹€
  • App.tsx = ์ „์ฒด ์กฐ๋ฆฝํŒ

 

 

------------------------------------------------ ๋ณด์ถฉ-----------------------------------------------------

  • App.tsx๋Š” ์ „์ฒด ์•ฑ์˜ ๊ธธ์žก์ด ์—ญํ• ์„ ํ•ด์š”.
  • Layout.tsx๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ๊ณตํ†ต์œผ๋กœ ๋ณด์—ฌ์ง€๋Š” ํ‹€์„ ์ •์˜ํ•ด์š”.
  • <Outlet />์€ ํ˜„์žฌ ์„ ํƒ๋œ ํŽ˜์ด์ง€์˜ ๋ณธ๋ฌธ ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐˆ ์ž๋ฆฌ ํ‘œ์‹œ์ž์˜ˆ์š”.

๐Ÿงฑ ์ „์ฒด ๊ตฌ์กฐ ์ดํ•ดํ•˜๊ธฐ

App.tsx
โ”œโ”€โ”€ Layout.tsx
โ”‚   โ”œโ”€โ”€ Header
โ”‚   โ”œโ”€โ”€ <Outlet /> ← ์—ฌ๊ธฐ์— ํŽ˜์ด์ง€ ๋ณธ๋ฌธ์ด ๋“ค์–ด๊ฐ
โ”‚   โ””โ”€โ”€ Footer
โ”œโ”€โ”€ Home.tsx
โ””โ”€โ”€ TodoList.tsx

 

  • App.tsx์—์„œ ๋ผ์šฐํŒ…์„ ์„ค์ •ํ•˜๊ณ , ๊ฐ ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ์–ด๋–ค ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค„์ง€ ๊ฒฐ์ •ํ•ด์š”.
  • Layout.tsx๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ๊ณตํ†ต์œผ๋กœ ๋ณด์—ฌ์ง€๋Š” Header์™€ Footer๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์š”.
  • <Outlet />์€ ํ˜„์žฌ ๊ฒฝ๋กœ์— ํ•ด๋‹นํ•˜๋Š” ํŽ˜์ด์ง€์˜ ๋ณธ๋ฌธ์ด ๋“ค์–ด๊ฐˆ ์ž๋ฆฌ์˜ˆ์š”.

 

๐Ÿ–ผ๏ธ ์‹œ๊ฐ์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ

+------------------------------------------------+
|                    Header                      |
+------------------------------------------------+
|                                                |
|   [ ํ˜„์žฌ ๊ฒฝ๋กœ์— ๋”ฐ๋ผ Home ๋˜๋Š” TodoList ๋‚ด์šฉ ]  |
|                                                |
+------------------------------------------------+
|                    Footer                      |
+------------------------------------------------+

 

  • ์œ„์˜ ๊ตฌ์กฐ์—์„œ Header์™€ Footer๋Š” ํ•ญ์ƒ ๊ณ ์ •๋˜์–ด ์žˆ๊ณ , ๊ฐ€์šด๋ฐ ๋ถ€๋ถ„๋งŒ ํ˜„์žฌ ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ๋ฐ”๋€Œ์–ด์š”.
  • ์ด ๊ฐ€์šด๋ฐ ๋ถ€๋ถ„์ด ๋ฐ”๋กœ <Outlet />์ด ์œ„์น˜ํ•œ ๊ณณ์ด์—์š”.

 

๐Ÿ”„ ์ž‘๋™ ๋ฐฉ์‹ ์˜ˆ์‹œ

  1. ์‚ฌ์šฉ์ž๊ฐ€ / ๊ฒฝ๋กœ๋กœ ์ ‘์†ํ•˜๋ฉด:
    • App.tsx๋Š” Layout.tsx๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ , <Outlet /> ์ž๋ฆฌ์— Home.tsx์˜ ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€์š”.
  2. ์‚ฌ์šฉ์ž๊ฐ€ /todo_list ๊ฒฝ๋กœ๋กœ ์ ‘์†ํ•˜๋ฉด:
    • App.tsx๋Š” Layout.tsx๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ , <Outlet /> ์ž๋ฆฌ์— TodoList.tsx์˜ ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€์š”.