22. React Router
우선 라우팅의 개념을 간단하게 알아보면 사용자가 요청한 링크주소 즉, URL에 맞는 페이지를 찾아서 보여주는 것이라고 할 수 있다. MPA 방식에서는 여러 페이지를 분리해두고 페이지간의 이동으로 이 라우트 시스템을 구축을 하지만, SPA 방식의 리액트에서 라우트 시스템을 구축하기 위해서 React Router를 사용한다. 신규페이지를 불러오지 않는 SPA에서 각각의 URL에 따라 선택된 페이지를 렌더링 해준다.
설치
npm i react-router-dom
태그로 감싸기
react-router-dom에 내장되어 있는 BrowserRouter라는 컴포넌트를 사용하여 감싸면 된다.
src/main.jsx
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.jsx'
import './index.css'
import { BrowserRouter } from "react-router-dom";
ReactDOM.createRoot(document.getElementById('root')).render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>
)
Routes, Route 컴포넌트 사용하기
< Routes > 컴포넌트는 여러 Route를 감싸서 그 중에서 해당되는 Route를 렌더링 해주는 역할을 합니다. 그리고 < Route >는 path 속성에는 경로를 element 속성에는 보여주고 싶은 컴포넌트를 넣어주면 됩니다.
<Routes>
<Route path="경로" element={<컴포넌트 />} />
</Routes>
src/App.jsx
import { Route, Routes } from "react-router-dom";
import "./App.css";
import About from "./pages/About";
import Home from "./pages/Home";
import Profile from "./pages/Profile";
export default function App() {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/profiles/:username" element={<Profile />} />
</Routes>
)
}
Link를 이용한 이동
html 페이지에서는 링크를 넣어줄 때 a 태그를 사용하지만, 리액트 라우터를 사용하는 프로젝트에서는 a 태그를 바로 사용하면 안된다. 왜냐하면 a 태그를 클릭하여 페이지를 이동할 때 브라우저에서는 페이지를 새로 불러오게 되기 때문에 Link를 사용한다. Link 컴포넌트 역시 a 태그를 사용하긴 하지만, 페이지를 새로 불러오는 것을 막고 History API를 통해 브라우저 주소의 경로만 바꾸는 기능이 내장되어 있다.
<Link to="경로">링크 이름</Link>
src/pages/Home.jsx
import { Link } from "react-router-dom";
export default function Home() {
return (
<div>
<h1>Home</h1>
<p>가장 먼저 보여지는 페이지입니다.</p>
<ul>
<li>
<Link to="/about">About</Link>
</li>
<li>
<Link to="/profiles/chanwoong">profile1</Link>
</li>
<li>
<Link to="/profiles/gildong">profile2</Link>
</li>
<li>
<Link to="/profiles/void">존재하지 않는 프로필</Link>
</li>
</ul>
</div>
);
}
src/pages/About.jsx
export default function About() {
return (
<div>
<h1>소개</h1>
<p>리액트 라우터를 사용해 보는 프로젝트입니다.</p>
</div>
);
}
url 파라미터
<Route path="/profiles/:username" element={<Profile />} />
import { useParams } from "react-router-dom";
const data = {
chanwoong: {
name: "찬웅",
message: "hello",
imgsrc: '/profile.png',
},
gildong: {
name: "길동",
message: "안녕~~",
imgsrc: '/profile.png',
},
};
export default function Profile() {
const { username } = useParams();
let profile = null;
if (typeof username !== "undefined") {
profile = data[username];
}
return (
<div>
<h1>User Profile</h1>
{profile ? (
<div>
<h2>{profile.name}</h2>
<p>{profile.message}</p>
<img src={profile.imgsrc} alt="" />
</div>
) : (
<p>존재하지 않는 프로필 입니다.</p>
)}
</div>
);
}