๐ก React ๊ฐ์๋ฅผ ๋ณด๋ฉฐ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ ๋์ค ๊ฐ์์์ React Router ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด์ ๋ํด ์ ํ์ด ์ดํดํ๊ณ ๊ณต๋ถํ๊ธฐ ์ํด React Route์ ๋ํด ์ ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค.
๋ฆฌ์กํธ ๋ผ์ฐํฐ(React Router)์ ๋ํ ์ ํํ ์ ๋ณด๋ ๊ณต์๋ฌธ์๋ฅผ ํตํด ํ์ธํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข๊ณ , ์ด ๊ธ์ ๊ณต์๋ฌธ์์ ์ฌ๋ฌ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑํ์์ต๋๋ค.
React Router๋ Client Side Routing์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
Client Side Routing์ ํตํด ์๋ฒ์์ ๋ค๋ฅธ ๋ฌธ์๋ฅผ ์์ฒญํ์ง ์๊ณ ๋ ๋งํฌ๋ฅผ ํด๋ฆญํจ์ผ๋ก์จ URL์ ์ ๋ฐ์ดํฐํ ์ ์๋ค. ์ฆ์ ์ UI๋ฅผ ๋ ๋๋ง ํ๊ณ fetch๋ฅผ ํตํด ๋ฐ์ดํฐ ์์ฒญ์ ์ํํ์ฌ ํ์ด์ง๋ฅผ ์ ์ ๋ณด๋ก ์ ๋ฐ์ดํธ ํ ์ ์๋ค.
๋ธ๋ผ์ฐ์ ๊ฐ ๋ค์ ํ์ด์ง์ ๋ํ ์์ ํ ์๋ก์ด HTML์ ์์ฒญํ๊ฑฐ๋CSS ๋ฐ JavaScript๋ฅผ ๋ค์ ๋ฐ์์ฌ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ ๋น ๋ฅธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ค. ๋ํ ์ ๋๋ฉ์ด์ ๊ณผ ๊ฐ์ ์์ ์์ ๋ณด๋ค ์ญ๋์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ค.
Client Side Routing์ ๋ผ์ฐํฐ(Router)๋ฅผ ์์ฑํ๊ณ , Link ์ปดํฌ๋ํธ๋ <Form>์ ์ฌ์ฉํด ํ์ด์ง ๊ฐ ์ด๋์ ๊ตฌํํ๋ค
[์ถ์ฒ] React Router ๊ณต์๋ฌธ์
์ฌ๊ธฐ์ ๋จผ์ ๋ผ์ฐํ (Routing)์ ๋ํ ๊ฐ๋ ์ ์ ๊น ์ง๊ณ ๋์ด๊ฐ์
Routing์ด๋
๋ผ์ฐํ (Routing)์ ์ฌ์ฉ์๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํน์ URL์ ์ ๋ ฅํ๊ฑฐ๋ ํด๋ฆญํ์ ๋, ๊ทธ URL์ ํด๋นํ๋ ํ์ด์ง๋ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ์์ด๋ค. ์ฆ, ์ด๋ค URL์ ๋ํด ์ด๋ค ํ๋ฉด์ ๋ณด์ฌ์ค์ง ๊ฒฐ์ ํ๋ ๊ณผ์
์น ๊ฐ๋ฐ์์๋ ํฌ๊ฒ ๋ ๊ฐ์ง ๋ฐฉ์์ ๋ผ์ฐํ ์ด ์๋ค.
โ๏ธ Server-Side Routing
- ์ ํต์ ์ธ ๋ฐฉ์์ผ๋ก, ์ฌ์ฉ์๊ฐ ์๋ก์ด URL๋ก ์ด๋ํ ๋๋ง๋ค ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ฒ๊ฐ ๊ทธ์ ๋ง๋ HTML ํ์ด์ง๋ฅผ ๋ณด๋ด์ค๋ค
- ๋งค๋ฒ ์๋ฒ์์ ํต์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ํ์ด์ง๊ฐ ์๋ก๊ณ ์นจ๋๋ค
- ์: ์ฌ์ฉ์๊ฐ www.example.com/about์ ์ ๋ ฅํ๋ฉด ์๋ฒ๊ฐ /about ํ์ด์ง์ ๋ง๋ HTML์ ๋ณด๋ด์ค๋ค
โ๏ธ Client-Side Routing
- ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ๋ฐฉ์์ผ๋ก, ์๋ฒ์ ์ฌ๋ฌ ๋ฒ ์์ฒญ์ ๋ณด๋ด์ง ์๊ณ , ํ ๋ฒ ๋ถ๋ฌ์จ ํ์ด์ง ๋ด์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํด ํ๋ฉด์ ๋์ ์ผ๋ก ์ ํ
- ํ์ด์ง๊ฐ ์๋ก๊ณ ์นจ๋์ง ์์ผ๋ฉฐ, ๋น ๋ฅด๊ฒ ์ฝํ ์ธ ๋ฅผ ์ ํํ ์ ์๋ค
- ์: React, Vue, Angular ๊ฐ์ ํ๋ ์์ํฌ์์๋ react-router ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ ์ ๊ตฌํ
์ฆ, React Router๋ React ์ ํ๋ฆฌ์ผ์ด์ ์์ Client-Side Routing์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
React Router ์ฌ์ฉํ๊ธฐ!
1. react-router ์ค์นํ๊ธฐ
npm
# React Router ์ค์น
npm install react-router-dom
# ์ต์ ๋ฒ์ ์ React Router ์ค์น
npm install react-router-dom@latest
yarn
# React Router ์ค์น
yarn add react-router-dom
# ์ต์ ๋ฒ์ ์ React Router ์ค์น
yarn add react-router-dom@latest
์ค์น๊ฐ ์๋ฃ๋๋ฉด, package.json ํ์ผ์ ์ด์ด react-router-dom ํญ๋ชฉ์ด ์ถ๊ฐ๋์๋์ง ํ์ธํ๋ค.
์์)
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.x.x" // ์ต์ ๋ฒ์ ์ด ์ฌ๊ธฐ์ ํ์๋ฉ๋๋ค.
}
2. React Router ๊ธฐ๋ณธ ์ค์
๊ณต์๋ฌธ์๋ ๋ธ๋ก๊ทธ์ ๋ค์ํ ๊ธฐ๋ณธ ์ค์ ๋ฐฉ๋ฒ์ด ๋์์์ง๋ง ์ฌ๊ธฐ์๋ ๋ด๊ฐ ๊ฐ์ธ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฆฌ๋ ค ํ๋ค.
1. App.jsx๋ฅผ ๊ฐ์ธ๋ main.jsxํ์ผ ๋ง๋ค๊ธฐ
main.jsx
import React from 'react'
import ReactDOM from 'react-dom/client'
import { BrowserRouter } from 'react-router-dom';
import App from './App.jsx'
ReactDOM.createRoot(document.getElementById('root')).render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>,
)
<App> ์ปดํฌ๋ํธ๋ฅผ Reat.StrictMode์ BrowserRouter๋ก ๊ฐ์ธ์ฃผ๋ main.jsx ํ์ผ์ ๋ง๋ค์ด์ค๋ค์
App.jsx
import ThemeProvider from "./theme/ThemeProvider.jsx";
import Router from "./routes/Router.jsx";
function App() {
return (
<ThemeProvider>
<Router/>
</ThemeProvider>
)
}
export default App
<ThemeProvider>๋ ํ ๋ง ๋ณ๊ฒฝ์ ์ํด ๋ง๋ค์ด๋ Context์ด๊ธฐ ๋๋ฌธ์ ์ ๊ฒฝ์ฐ์ง ๋ง๊ณ App์ปดํฌ๋ํธ์๋ Router ์ปดํฌ๋ํธ๋ง ๋๋ฉด ๋๋ค.
๐๐ป Context์ ๋ํด ์๊ณ ์ถ๋ค๋ฉด
2. routes ํด๋๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ Router.jsx ํ์ผ ์์ฑํ๊ธฐ
Router.jsx
import {useRoutes} from "react-router-dom";
import HomePage from "../pages/HomePage.jsx";
import MainLayout from "../layouts/MainLayout/index.jsx";
import StorePage from "../pages/StorePage.jsx";
import ReviewPage from "../pages/review/ReviewPage.jsx";
export default function Router() {
return useRoutes([
{
path: '/',
element: <MainLayout/>,
children: [
{ index: true, element: <HomePage/> },
{ path: 'store', element: <StorePage />},
{ path: 'review', element: <ReviewPage />}
],
},
])
}
<MainLayout/>
<HomePage/>
<StorePage/>
<ReviewPage/>
๋ ๋ชจ๋ ๋ด๊ฐ ๋ง๋ค์ด๋ ์ปดํฌ๋ํธ๋ค์ด๋ฉฐ ๊ฐ๊ฐ์ ํ์ด์ง๋ฅผ ๋ํ๋ธ๋ค.
์ฌ๊ธฐ์ <MainLayout/> ์ ๋ณํ์ง ์๋ ๋ผ๋ ์ญํ ์ ํ๋ฉฐ children์ผ๋ก ์๋ ๊ฐ๊ฐ์ ํ์ด์ง๋ค๋ง ๋ณ๊ฒฝ๋๋ค.
<HomePage/>๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ผ๋ก ๋ณด์ฌ์ง๋ ํ์ด์ง์ด๊ธฐ ๋๋ฌธ์ path๊ฐ ์๋ index ์์ฑ์ ์ ์ฉํ๋ค.
๊ทธ ์ธ์ ๋๋จธ์ง ์ปดํฌ๋ํธ๋ค์๋ path: 'store', path: 'review'์ ๊ฐ์ path ์์ฑ์ด ๋ถ์ด์๋๋ฐ
์ด๋ url www.example/store ์ ๊ฐ์ด url์ ๋ฐ๋ฅธ ํ์ด์ง ๋ณ๊ฒฝ์ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
MainLayout.jsx
import Header from "./header";
import Sidebar from "./sidebar";
import {Outlet} from "react-router-dom";
export default function MainLayout(){
return(
<div>
<Header/>
<Sidebar/>
<Outlet/>
</div>
)
}
์ด ๋, <HomePage/>์ ๊ฐ์ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์๋ <Outlet/>์ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํ๋ค.
'Framework(Library) > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ์ด๋ฏธ์ง ๋ชฉ๋ก + ํ์ด์ง๋ค์ด์ ๊ตฌํ Part 1 (7) | 2024.10.11 |
---|---|
[React] ์ํ๊ด๋ฆฌ :: Redux์ React Query | ์ฐจ์ด์ | ํจ๊ป ์ฌ์ฉํ๋ฉด ์ข์ ์ด์ (0) | 2024.09.27 |
[React] Context๋? | Context ์ฌ์ฉ๋ฐฉ๋ฒ๊ณผ ์์ (1) | 2024.09.07 |
React์ Next.js์ ์ฐจ์ด์ Next.js ํ๋ก์ ํธ ์์ฑํ๊ธฐ (0) | 2024.01.22 |
[React] ๋๊ธฐ / ๋น๋๊ธฐ ํต์ (0) | 2023.08.28 |