
๐ก๋ ธ๋ง๋์ฝ๋ ๋๊ผฌ์ค์ ๊ฐ์๋ฅผ ๋ณด๋ฉฐ ๊ณต๋ถํ๋ ์๋ฆฌ์ฆ์ ๋๋ค.
npm install react-router-dom
๊ฐ์์์์ @5.3.0์์ง๋ง ๋ณธ์ธ์ @6.22.1์ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
์ผ๋จ ๊ฐ์๋๋ก ์งํํ๊ฒ ๋ ๋ ๋ง์ดํ๊ฒ๋๋ ๋ช๊ฐ์ง issue๋ค์ด ์๋๋ฐ, Switch๊ฐ Routes๋ก ๋ณ๊ฒฝ๋์๋ค. ๊ณต์๋ฌธ์ Client side routing ์ฐธ๊ณ .
๐๐ปFeature Overview v6.22.1
Route์ ๋ฐฉ์๋ ๋ณ๊ฒฝ๋์๋ค.
๊ธฐ์กด์๋ <Route><์ปดํฌ๋ํธ></Route>ํ์์ผ๋ก ์ฌ์ฉ๋์์ง๋ง v6์ด์ ๋ถํฐ๋ Route์ element๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ผ์ฐํ
ํ๋ค. ๋ํ ์ด์ํ๋ก build๋ฅผ ํ๊ฒ ๋๋ฉด ํ์ด์ง์ ์ ์ํ์ ๋ ๋นํ์ด์ง๋ง์ด ๋ณด์ฌ์ง๊ฒ ๋๋ฏ๋ก Router์ basename={process.env.PUBLIC_URL}์ ์ถ๊ฐํด์ผํ๋ค.
//App.js์์
import {
BrowserRouter as Router,
Routes,
Route,
} from 'react-router-dom';
import PageHome from './routes/PageHome';
function App() {
return (
<Router basename={process.env.PUBLIC_URL}>
<Routes>
<Route path="/" element={<PageHome />} />
</Routes>
</Router>
);
}
export default App;
vue๋ง ์ฌ์ฉํด๋ณธ ๋ด ์
์ฅ์์ ๋ณธ react์ routing์ ํ์ ์ด๋ค.
vue2, vue3๋ฅผ ๋ชจ๋ ์ฌ์ฉํด๋ณด๊ณ , vue2์ vue3๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์
๊น์ง ํด ๋ณด์์ง๋ง route ์ด๊ฒ ์๊ฐ๋ณด๋ค ๊ท์ฐฎ๊ธฐ๋ ํ๊ณ ๊น๋ค๋กญ๋ค๋ ์๊ฐ์ด ๋ค์๋๋ฐ react์ routing์ ๋ง ๊ทธ๋๋ก ์ถฉ๊ฒฉ์ ์ด๋ค.
๊ตณ์ด route.js๋ฅผ ๋ง๋ค์ด์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ด๋ค ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค์ง ์ผ์ผ์ด ์ค์ ์ ํ์ง ์์๋ ๋๋ค๋๊ฒ ๋๋ฌด๋๋ฌด ํธ๋ฆฌํ๊ณ ์ข๋ค!
vue์ route.js์์ ์ด๋ฐ ์ผ๋ จ์ ๊ณผ์ ์ ์ง๋ ๋ค์์ ๊ฐ ํ์ด์ง ๋ณ๋ก path๋ฅผ ๋ ์ง์ ํด์ผํ๋ค๋ฉด react์์๋ ๊ทธ๋ฅ Page์์ ๋ฐ๋ก routinge ํด๋ฒ๋ฆฌ๋ฉด ๋๋๋ค.
Link
Link๋ Router์ ๊ฐ์ react-router-dom์ด ์ ๊ณตํ๋ component์ด๋ค.
routing์ ํ๋ฉด ํ์ด์ง๊ฐ ์๋ก๊ณ ์นจ์ด ๋๋๋ฐ react์ ์ฅ์ ์ ์ด๋ ค์ ์ ๋นํ ์์ ์ Link๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด ์ํ๋ ํ์ด์ง๊ฐ render๋๋ค.
๋จ, App.js์์ Link๋ก Routeํ component๋ฅผ ๊ผญ importํด์ผํ๋ค.
import { Link } from 'react-router-dom';
function Movie() {
return (
<div>
<h1>
<Link to="/movie">{ํ์ดํ}</Link>
</h1>
</div>
);
}
url์์ ์ฐจ์ด๋ฅผ ๋ณผ ์ ์๋ค.
http://localhost:3000/movie : BrowserRouter,
http://localhost:3000/#/movie : HashRouter
URL์ Params๋ฅผ ๊ฐ์ด ๋๊ฒจ์ Params์ ๋ง๋ data๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ ๋ํ ์ฝ๋ค.
path="/์นดํ
๊ณ ๋ฆฌ/:params" ํ์์ผ๋ก ์์ฑํ๋ฉด ๋๋ค.
์๋ฅผ ๋ค์ด movie์นดํ
๊ณ ๋ฆฌ์์ id๋ฐ๋ผ ๋ณด์ฌ์ง๋ detailPage๋ฅผ ํธ์ถํ๋ค๋ฉด, path="/movie/:id"๋ก ๋๊ฒจ์ฃผ๋ฉด ๋๋ค.
์์ : App.js
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<PageHome />} />
//๋ฐ๋์ :id๋ก ์์ฑํด์ผํ๋ค. id๋ก ์์ฑํ ๊ฒฝ์ฐ id๋ ๊ฐ์ด์๋ ๋ฌธ์id๋ก ์ฒ๋ฆฌ๋๋ค.
<Route path="/movie/:id" element={<PageDetail />} />
</Routes>
</Router>
);
}
์์ : Index.js
<์ปดํฌ๋ํธ
key={movie.id}
propCover_image={movie.medium_cover_image}
propTitle={movie.title}
propSummary={movie.summary}
propGenres={movie.genres}
//props๋ก ์์์ id๋ฅผ ์ ๋ฌํ๋ค.
propGId={movie.id}
/>
์์ : Detail.js
useParams
React Router๊ฐ ์ ๊ณตํ๋ Hook์ด๋ฉฐ,<Route path>๋ฅผ ํตํด ํ์ฌ์ url์ ๊ฐ์ฒด์ key/value๋ฅผ ์์ผ๋ก ๋ฐํํ๋ ๋์ ๋งค๊ฐ๋ณ์dynamic params์ด๋ค.
//์ต์๋จ์ useParam import
import { useParams } from 'react-router-dom';
function Detail() {
const x = useParams();
console.log('x', x);
return <h1>๋ํ
์ผ ํ์ด์ง</h1>;
}
export default Detail;

ํ๋ฉด์ ๋ณด์ฌ์ง๋ ๋ํ ์ผ ํ์ด์ง๋ผ๋ ๊ธ์๋ฅผ id์ ๋ง๋ ์ํ ์ ๋ชฉ์ผ๋ก ๋ณ๊ฒฝํ๊ณ ์ ํ๋ค.
import { useParams } from 'react-router-dom';
import { useEffect, useState } from 'react';
function PageDetail() {
const { id } = useParams();
const [movie, setMovie] = useState([]);
async function getData() {
const response = await fetch(
`https://yts.mx/api/v2/movie_details.json?movie_id=${id}`
);
const jsonData = await response.json();
setMovie(jsonData.data.movie);
}
useEffect(() => getData(), []);
return <h1>{movie.title}</h1>;
}
export default PageDetail;
fetch๋ฅผ ์ฌ์ฉํ์ฌ api๋ฅผ ํธ์ถํ๊ณ data๋ฅผ ๊ฐ์ ธ์๋ค.
useEffect๋ก api๋ ํ ๋ฒ๋ง ์คํํ๋๋ก ํ๊ณ , state์ title๋ฅผ ํ๋ฉด์ ๋ฟ๋ ค์คฌ๋ค.

์๋ํ๋๋ก ํ๋ฉด์ title์ด ๋ณด์ฌ์ง์ง๋ง ์ฝ์์ ์๋ฌ๊ฐ ๋ณด์ฌ์ง๋ค.
hint
useEffect(() => {
async function fetchData() {
// You can await here
const response = await MyAPI.getData(someId);
// ...
}
fetchData();
}, [someId]);
์ฃผ์ด์ง ํํธ๋๋ก ์ฝ๋๋ฅผ ์์ ํด๋ณด์.

์๋ํ ๋๋ก ์ถ๋ ฅ๋๋ค.
๊ฐ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ movie-app์ ๋ฐฐํฌํด๋ณด์.
PUBLISHING
Install npm i gh-pages
github์์ ๋ฌด๋ฃ๋ก ์ ๊ณตํด์ฃผ๋ ํจํค์ง๋ก, ๊ฒฐ๊ณผ๋ฌผ์ github pages์ ์
๋ก๋ ํ ์ ์๊ฒ ๋์์ค๋ค.
package.json์ script๋ถ๋ถ์๋ deploy, predeploy ์ถ๊ฐํ๊ณ , ์ตํ๋จ์ homepage๋ฅผ ์ถ๊ฐํ๋ค.
์คํฌ๋ฆฝํธ ๋ํ๋ก์ด, ํ๋ฆฌ๋ํ๋ก์ด ์ถ๊ฐ. ์ตํ๋จ homepage ์ถ๊ฐ.
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"deploy": "gh-pages -d build",
"predeploy": "npm run build"
},
"homepage": "https://๊นํ์์ด๋.github.io/๋ฆฌํฌ์งํ ๋ฆฌ ์ด๋ฆ"
predeploy๋ npm run deploy ์คํ ํ์ ๋ build๊ฐ ๋๋๋ก ํ๋ ์ต์
์ผ๋ก, ํด๋น ์ต์
์ด ์์ผ๋ฉด build๊ฐ ๋์ง ์๊ธฐ ๋๋ฌธ์ ์๋ง๋ 404error๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
ํฐ๋ฏธ๋์์ npm run deploy ํ๋ฉด ๋จผ์ build๊ฐ ๋ ์ดํ ์๋์ผ๋ก ๊นํ ํ์ด์ง์ ๋ฐฐํฌ๋๋ค.