
React의 SPA를 보장하기 위한 Router의 구조에 대해서 살펴보고자 한다.
React-router
: React 에서 라우팅을 처리하기 위한 라이브러리
SPA를 구현한다. 페이지를 통해 새로그침하지 않고, 내비게이션과 동적 라우팅을 구현함.
너무 길어서 부분부분 잘라와서 작성할 수 있도록 하겠다.
먼저 살펴볼 부분은 가장 최상단의 MAIN 부분이다.
const router = createBrowserRouter([
{
path: `${ROUTE.main}`,
element: <LandingLayout />,
children: [
{
index: true,
element: <Landing />,
},
{
path: `${ROUTE.login}`,
element: <LogIn />,
},
],
},
createBrowserRouter 를 통해 Router를 구조화하고자 한다.
메인 Route 구성
path : ${Route.main} - 에플리케이션의 메인 섹션에 대한 기본 경로. 가장 최상단의 배경 컴포넌트를 랜더링했다. 이 레이아웃 내에 자식 라우트를 중첩시킴.
보호된 Route
{
element: <Outlet />,
errorElement: <Navigate to={ROUTE.main} replace />,
loader: checkToken,
children: [
{
path: `${ROUTE.tutorial}`,
element: <Tutorial />,
},
{
path: `${ROUTE.home}`,
element: <Home />,
loader: getUser,
},
이렇게 checkToken이 필요한 route는 AccessToken이 필요하다는 말인데, 이 로더에 의해 보호되어 사용자 인증 상태를 확인한다.
만약 checkToken이 없어서 오류가 발생하면 main으로 리다이렉션된다.
이외에도 getUser Loader를 사용해서 컴포넌트가 불러와지기 전에 필요한 데이터가 있다면 loader를 사용해서 화면을 오류없이 구성할 수 있도록 했다.
Catch-All Route
{
path: '/*',
element: <Navigate to={`${ROUTE.error}/404`} replace />,
},
마지막으로 정의되지 않은 경로들은 모두 404 오류로 보내버린다.
해당 경로들은 노출되지 않도록 Constants화를 진행시켜 따로 빼놓았다.
export const ROUTE = {
main: '/',
login: '/login',
tutorial: '/tutorial',
play: '/play',
...
}
위 구조의 이점
위와 구조를 통해서 아래와 같은 이점을 얻을 수 있다.