2. Routes
1. ๋ผ์ฐํฐ
๋ผ์ฐํฐ๋ ๋คํธ์ํฌ ์ฌ์ด์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ฅ์น ๋ณดํต ๋ ์ด์์ ์๋ก ๋ค๋ฅธ ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋จ ๋ฐ์ดํฐ(ํจํท)๋ฅผ ๋ชฉ์ ์ง๋ก ๋ณด๋ผ ๋ ์ต์ ์ ๊ฒฝ๋ก๋ฅผ ๊ฒฐ์ ํ๊ณ ๊ฒฝ๋ก๊ฐ ๊ฒฐ์ ๋๋ฉด ํด๋น ๊ฒฝ๋ก๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ฃผ๋ ์ผ(๋ผ์ฐํ )์ ์ํ ๋ผ์ฐํฐ๋ ๋ผ์ฐํ ํ ์ด๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ชฉ์ ์ง์๊ฒ ์ ๋ฌ

2. React Router
React Router Client Side Routing
Context API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : ์ปดํฌ๋ํธ๋ค์๊ฒ ๋์ผํ context(๋งฅ๋ฝ)๋ฅผ ์ ๋ฌํ๊ณ , ํ ๋ฒ์ ๊ฐ์ ๋ฐ์์์ ์ฌ์ฉ
์ฑ๊ธํ์ด์ง ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ์งํ๋ฉด์, url์ ๋ถ์ผ ์ ์์
ํด๋น ํ์ด์ง๋ก ์ด๋
๋ถ๋งํฌ ์ถ๊ฐ
๋ค๋น๊ฒ์ด์ ์ถ๊ฐ
SPA (Single Page Application)
์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์
ํ๋์ url๋ก ํ ๋ฒ ํ์ด์ง๊ฐ ๋ก๋ฉ๋๋ฉด ๊ทธ ์์์ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ํ์ด์ง๋ฅผ ํด๋ฆญํ์ ๋, โ ์๋ก์ด ํ์ด์ง๊ฐ ์ด๋ฆฌ๋ ๊ฒ์ด ์๋(์ ์ฒด์ ์ธ ํ์ด์ง ์๋ก๊ณ ์นจ x), โ ๋ถ๋ถ์ ์ธ ๋ด์ฉ๋ง ์ ๋ฐ์ดํธ(ํด๋น ์ปดํฌ๋ํธ๋ง ๋ณ๊ฒฝ) โ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋์ ์ผ๋ก ๋ฐ์์์ ๋์ ์ผ๋ก ๋ณผ ์ ์๋๋ก ์ฒ๋ฆฌ
MPA (Multiple Page Application) : ์๋ก๊ณ ์นจ๋๋ฉฐ ํ์ด์ง๋ฅผ ์ด๋์ํค๋ ๋ฐฉ์. html ๋ฌธ์, ๋ฐ์ดํฐ ๋ฑ์ ๋ฐ์ ์กฐ๋ฆฝํด์ผ ํจ
CSR (Client Side Rendering) : ํด๋ผ์ด์ธํธ ์ธก์์ ํ์ด์ง ๋ ๋๋ง
๋ฌธ์ ์ : ํ๋ฉด ๋ถ๋งํฌ ๋ถ๊ฐ, ๋ค๋ก๊ฐ๊ธฐ/์์ผ๋ก๊ฐ๊ธฐ ๋ฑ์ ๋ค๋น๊ฒ์ด์ ์ ํฌํจ๋์ง ์์
์ฌ์ฉ ๋ฐฉ๋ฒ
๐ ์ค์ต ๋งํฌ : React Router ์ค์น ๋ฐ ์ ์ฉ, App ํ ์คํธ ์ฝ๋ ์์ฑ
ํจํค์ง ์ค์น
npm i react-router-dom
React Router ์ฌ์ฉํ๊ธฐ
import {Routes, Route} from 'react-router-dom';
function App() {
return (
<div>
<Header/>
<main>
<Routes>
<Route path="/" element={<HomePage/>}/>
<Route path="/about" element={<AboutPage/>}/>
</Routes>
</main>
<Footer/>
</div>
);
}
Route
์ฑ์ ์ด๋์์๋ ๋ ๋๋ง๋๋ฉฐ <Routes>
๋ ํ์ฌ ์์น์ ํ์ ๊ฒฝ๋ก ์งํฉ๊ณผ ์ผ์นํจ
์์น๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค <Routes>
๋ ๋ชจ๋ ์์ ๊ฒฝ๋ก๋ฅผ ์ดํด๋ณด๊ณ ๊ฐ์ฅ ์ผ์นํ๋ ํญ๋ชฉ์ ์ฐพ์ ํด๋น UI ๋ถ๊ธฐ๋ฅผ ๋ ๋๋ง
์ฌ์ฉ ๋ฐฉ๋ฒ
<Route>
์์๋ ์ค์ฒฉ๋ URL ๊ฒฝ๋ก์ ํด๋นํ๋ ์ค์ฒฉ๋ UI๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ์ค์ฒฉ๋ ์ ์์
<Routes>
<Route path="/" element={<Dashboard />}>
<Route path="messages" element={<DashboardMessages />}/>
<Route path="tasks" element={<DashboardTasks />} />
</Route>
<Route path="about" element={<AboutPage />} />
</Routes>
Route๋ React Router ์ฑ์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ URL ์ธ๊ทธ๋จผํธ๋ฅผ ๊ตฌ์ฑ ์์, ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ๋ฐ์ดํฐ ๋ณํ์ ์ฐ๊ฒฐ ๊ฒฝ๋ก ์ค์ฒฉ์ ํตํด ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ๋ ์ด์์๊ณผ ๋ฐ์ดํฐ ์ข ์์ฑ์ด ๋จ์ํด์ง๊ณ ์ ์ธ์ ์ด ๋จ
path
Route๊ฐ URL, link href, form action๊ณผ ์ผ์นํ๋์ง ํ์ธํ๊ธฐ ์ํด URL๊ณผ ์ผ์น์ํฌ ๊ฒฝ๋ก ํจํด
element
Route๊ฐ URL๊ณผ ์ผ์นํ ๋ ๋ ๋๋งํ React ์์/๊ตฌ์ฑ ์์
<Route path="/mypage" element={<MyPage />} />
Browser Router
๋ธ๋ผ์ฐ์ ์ ์ฃผ์ ํ์์ค์ clean URL์ ์ฌ์ฉํด ํ์ฌ ์์น๋ฅผ ์ ์ฅํ๊ณ , ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ ๊ธฐ๋ก ์คํ์ ์ฌ์ฉํ์ฌ ํ์
๐จ Browser Router๋ฅผ ์ฌ์ฉํ์ง ์์์ ๋ ์๋ฌ ๋ฉ์์ง
Uncaught Error: useRoutes() may be used only in the context of a
<Router>
component.
์ฌ์ฉ ๋ฐฉ๋ฒ
<BrowserRouter window>
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ ๋ฌธ์์ defaultView๋ฅผ ์ฌ์ฉ
๋ค๋ฅธ ์ฐฝ์ URL์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํ๋ ๋ฐ ์ฌ์ฉํ ์๋ ์์ (Ex. <iframe>
)
import * as React from "react";
import {createRoot} from "react-dom/client";
import {BrowserRouter} from "react-router-dom";
const root = createRoot(document.getElementById("root"));
root.render(
<BrowserRouter>
<App />
</BrowserRouter>
);
โ๏ธ ์กฐ๊ฐ๊ธ
๐ [ํธ๋ฌ๋ธ ์ํ ] react router v6 ์ค๋ฅ ํด๊ฒฐ ๐ TIL : react router v6 ์ค๋ฅ ํด๊ฒฐ
์์ ์ ํธ๋ฌ๋ธ ์ํ ๊ธ์ ์ ์ด๋ ๋ด์ฉ๊ณผ ๋์ผํ ์ด์๊ฐ ๊ฐ์์์ ๋ฑ์ฅํ๋ค. ์ด์ ๋ณด๋ ์ ๊ธ ์ ๋ชฉ๋ ์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ ์์ผ๋ฉด ์ข์์ผ๋ จ๋ง, ๋น์์๋ ์ ํํ ์ด๋ค ์นดํ ๊ณ ๋ฆฌ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ๋ชฐ๋ผ์ 'react router v6 ์ค๋ฅ' ๋ผ๊ณ ํด๋์๋ค. ๊ฐ์๋ฅผ ๋ฃ๊ณ ๋์๋ ์ด๋ค ํํธ๊ฐ ๋ฌธ์ ์๋์ง ์๊ฒ ๋์ด ๋ช ์พํด์ง ๋๋์ด๋ค. ๋๋ถ์ด ํ ์คํธ ์ฝ๋์์๋ Memory Router๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ๊น์ง ์๊ฒ ๋์๋ค. ์ด ๋ด์ฉ์ ๋ชฐ๋๋ค๋ฉด, ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋ ๋๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช์์ ๊ฒ์ด๊ณ ๋ ๋ฒ์ด๋ ํธ๋ฌ๋ธ ์ํ ์ ํ ๋ป ํ๋ค.
Memory Router
โ ๏ธ ํ ์คํธ ํ๊ฒฝ์์๋ Browser Router๋ฅผ ์ฌ์ฉํ๋ฉด ์คํจ ๐ก ๋ธ๋ผ์ฐ์ ์๋ Window๊ฐ ์์ง๋ง, ํ ์คํธ ํ๊ฒฝ์์๋ Memory Router ์ฌ์ฉ
<MemoryRouter>
๋ ๋ฐฐ์ด์ ๋ด๋ถ์ ์ผ๋ก ์์น๋ฅผ ์ ์ฅํจ
<BrowserHistory>, <HashHistory>
์ ๋ฌ๋ฆฌ, ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ก ์คํ๊ณผ ๊ฐ์ ์ธ๋ถ ์์ค์ ์ฎ์ด์ง ์์
โ ํ
์คํธ๊ฐ์ด ๊ธฐ๋ก ์คํ์ ์๋ฒฝํ๊ฒ ์ ์ดํด์ผ ํ๋ ์๋๋ฆฌ์ค์ ์ด์์
initialEntries : ๊ธฐ๋ณธ๊ฐ์ ["/"] (root '/' URL์ ๋จ์ผ ํญ๋ชฉ)
initialIndex : ๊ธฐ๋ณธ๊ฐ์ initialEntries์ ๋ง์ง๋ง index
๋๋ถ๋ถ์ React Router ํ
์คํธ๋ ์ง์ค์ ์ถ์ฒ๋ก <MemoryRouter>
๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋์๊ธฐ ๋๋ฌธ์
ํ
์คํธ๋ฅผ ์ดํด๋ณด๊ธฐ๋ง ํด๋ ์ด๋ฅผ ์ฌ์ฉํ๋ ์ข์ ์๋ฅผ ๋ณผ ์ ์์
์ฌ์ฉ ๋ฐฉ๋ฒ
import {render, screen} from '@testing-library/react';
import {MemoryRouter} from 'react-router-dom';
import App from './App';
const context = describe;
describe('App', () => {
function renderApp(path: string) {
render((
<MemoryRouter initialEntries={[path]}>
<App />
</MemoryRouter>
));
}
context('when the current path is โ/โ', () => {
it('renders the home page', () => {
renderApp('/');
screen.getByText(/Hello/);
});
});
context('when the current path is โ/aboutโ', () => {
it('renders the about page', () => {
renderApp('/about');
screen.getByText(/About/);
});
});
});
Last updated