React에서 라우팅 처리에 대해 배워보자.
React Router에 대해 알아보자.
리액트에서 주소에 따른 컴포넌트 렌더링을 관리하기 위한 라이브러리이다.
Routes와 Route는 React Router v6부터 도입된 개념이다.
npm i react-router-dom
Routes는 여러 개의 Route 컴포넌트를 그룹화하고 관리하기 위한 컴포넌트이다.
Route는 실제로 주어진 경로에 대한 컴포넌트 렌더링을 하기 위한 컴포넌트이다.
const pages: Record<string, React.FC> = {
'/': HomePage,
'/about': AboutPage,
};
export default function App({products}: {
products: Product[];
}) {
const path = window.location.pathname;
const Page = pages[path] || HomePage;
return (
<div>
<Header />
<div>
<Page />
</div>
<Footer />
</div>
);
}
import {Routes, Route} from 'react-router-dom';
import Footer from './components/Footer';
import Header from './components/Header';
import AboutPage from './pages/AboutPage';
import HomePage from './pages/HomePage';
import type Product from './types/Product';
export default function App({products}: {
products: Product[];
}) {
return (
<div>
<Header />
<div>
<Routes>
<Route path='/' element={<HomePage/>}/>
<Route path='/about' element={<AboutPage />}/>
</Routes>
</div>
<Footer />
</div>
);
}
React Router를 쓰려면 BrowserRouter를 잡아줘야 한다. BrowserRouter 역시 React Router 라이브러이에서 제공하는 컴포넌트이다.
브라우저 주소가 변경되면 해당 주소에 대응하는 뷰를 렌더링한다.
BrowserRouter 는 라우팅과 관련된 정보를 컴포넌트 트리 아래의 모든 컴포넌트에 전달하기 위해 Context를 사용한다. Context는 컴포넌트 트리를 횡단하여 데이터를 전달하는 구조를 제공한다.
// main.tsx
<BrowserRouter>
<App products={products} />
</BrowserRouter>
테스트 환경에서는 BrowserRouter
를 쓰면 실패한다. 테스트 환경에서는 BrowserRouter
와 비슷한 MemoryRouter
가 있다.
BrowserRouter
는 브라우저의 주소를 알 수 있지만, BrowserRouter
는 브라우저가 없다. 주소를 알 수 없다. 그래서 주소를 따로 잡아줘야 한다.
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 products={[]} />
</MemoryRouter>
));
}
context('when the current path is “/”', () => {
it('renders the home page', () => {
renderApp('/');
screen.getByText(/Hello, World/);
});
});
context('when the current path is “/about”', () => {
it('renders the about page', () => {
renderApp('/about');
screen.getByText(/This is test/);
});
});
});
버전 6.4부터 지원하는, 라우터 객체를 만들어서 쓰는 방법이 있다.
라우팅 정보만 별로의 파일로 관리할 수 있다.