이번에는 realword API 문서에서 Frontend Specs > Routing Guidelines에 따라서 기본적인 라우팅 정의를 하여 dummy page를 만들어 보려고 한다.
해당 문서를 보면 아래와 같은 라우팅을 생성하도록 가이드 하고 있다.
- Home page (URL: /#/ )
- List of tags
- List of articles pulled from either Feed, Global, or by Tag
- Pagination for list of articles
- Sign in/Sign up pages (URL: /#/login, /#/register )
- Uses JWT (store the token in localStorage)
- Authentication can be easily switched to session/cookie based
- Settings page (URL: /#/settings )
- Editor page to create/edit articles (URL: /#/editor, /#/editor/article-slug-here )
- Article page (URL: /#/article/article-slug-here )
- Delete article button (only shown to article's author)
- Render markdown from server client side
- Comments section at bottom of page
- Delete comment button (only shown to comment's author)
- Profile page (URL: /#/profile/:username, /#/profile/:username/favorites )
- Show basic user info
- List of articles populated from author's created articles or author's favorited articles
Install React-router
react-router를 설치한다.
- npm
- Yarn
- pnpm
npm install react-router-dom
yarn add react-router-dom
pnpm add react-router-dom
나는 react-router 6를 사용해보기 위해 react-router-dom@next 로 설치를 진행하였다.
Create the Dummy Page Component
각 라우팅에 대응되는 화면 단위에 해당하는 컴포너트를 아래와 같은 예시와 같이 생성해주었다.
// src/pages/Home/index.tsx
import React from 'react';
export default function Home() {
return <>HOME</>;
}
Define the route constants
각 화면의 라우팅 정의를 constant.tx
파일을 생성하여 정의해주었다.
이렇게 정의하면 각 주소에 대한 값을 링크 정의 등에 필요한 경우 항상 동일한 값을 사용하게 할 수 있어 라우팅 주소 변경 또는 삭제 시에 관련하여 사용하고 있는 곳에서 놓치지 않고 반영해줄 수 있는 장점이 있는 것 같다.
// src/constants/index.tx
export const ROUTES = {
HOME: '/',
LOGIN: '/login',
REGISTER: '/register',
SETTING: '/settings',
EDIT: '/editor',
ARTICLE: '/article',
PROFILE: '/profile',
};
Create the Routes Component
각 화면에 대한 라우팅을 매칭해주기 위해 Routes.tsx
파일을 생성하여 아래와 같이 정의하였다.
메인 라우팅 경로에 대해서만 해당 파일에 정의를 해주었다.
github-actions을 이용하여 CI/CD 구성 후에 gh-pages
배포를 위해 HashRouter 로 정의하였다.
(일전에 BrowserRouter로 해보았는데, SPA인 경우 경로를 찾도록 하려면 추가적인 조치가 필요했던 기억이 있어서 HashRouter로...)
// src/pages/index.tsx
import React from 'react';
import { HashRouter as Router, Routes, Route } from 'react-router-dom';
import { ROUTES } from '../constants';
import Home from './Home';
import Login from './Login';
import Settings from './Settings';
import Editor from './Editor';
import Article from './Article';
import Profile from './Profile';
export default function PageRoutes() {
return (
<Router>
<Routes>
<Route path={ROUTES.PROFILE} element={<Profile />} />
<Route path={ROUTES.ARTICLE} element={<Article />} />
<Route path={ROUTES.EDITOR} element={<Editor />} />
<Route path={ROUTES.SETTING} element={<Settings />} />
{/* 기존에는 `path`에 array로 정의가 가능했는데 React-router 6 에선 타입 에러가 발생한다. ㅠㅠ */}
<Route path={ROUTES.LOGIN} element={<Login />} />
<Route path={ROUTES.REGISTER} element={<Login />} />
<Route path={ROUTES.HOME} element={<Home />} />
</Routes>
</Router>
);
}
정의한 Routes 컴포넌트를 App 컴포넌트
에 주입해준다.
// src/App.tsx
import React from 'react';
import PageRoutes from './pages';
export default function App() {
return <PageRoutes />;
}
이제 정의한 라우팅 주소를 올바르게 찾아가는 지 확인해보기 위해서 서버를 기동해서 각 정의한 라우팅 주소에 대하여 올바르게 호출이 되는 지 확인해본다.