์ค์น:
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๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ ๊ตฌ์กฐ์ผ!
โ ์ ๋ฆฌ: ์ด๋ ๊ฒ ๋์ํด!
- /๋ก ์ ์ํ๋ฉด → Layout ํ ์์ Home ๋ด์ฉ์ด ๋ค์ด๊ฐ
- /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 />์ด ์์นํ ๊ณณ์ด์์.
๐ ์๋ ๋ฐฉ์ ์์
- ์ฌ์ฉ์๊ฐ / ๊ฒฝ๋ก๋ก ์ ์ํ๋ฉด:
- App.tsx๋ Layout.tsx๋ฅผ ๋ ๋๋งํ๊ณ , <Outlet /> ์๋ฆฌ์ Home.tsx์ ๋ด์ฉ์ด ๋ค์ด๊ฐ์.
- ์ฌ์ฉ์๊ฐ /todo_list ๊ฒฝ๋ก๋ก ์ ์ํ๋ฉด:
- App.tsx๋ Layout.tsx๋ฅผ ๋ ๋๋งํ๊ณ , <Outlet /> ์๋ฆฌ์ TodoList.tsx์ ๋ด์ฉ์ด ๋ค์ด๊ฐ์.
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [React] Props ๋ถ๋ชจ -> ์์ (2) | 2025.05.13 |
|---|---|
| [React] To do list (ํ ์ผ๋ชฉ๋ก) (1) | 2025.05.12 |
| [React] ์ ์ญ ์ํ zustand (0) | 2025.05.10 |
| [React] ๊ณตํต ํค๋(Header)์ ํธํฐ(Footer) ๋ง๋ค๊ธฐ (0) | 2025.05.10 |
| [React] ํ๋ก์ ํธ ์์ฑ (0) | 2025.05.09 |