๋ผ์ฐํ ์ด๋?
- ์ฌ์ฉ์๊ฐ ์์ฒญํ URL์ ๋ฐ๋ผ ์๋ง์ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋ ํ๋ก์ ํธ๋ฅผ ํ๋์ ํ์ด์ง๋ก ๊ตฌ์ฑํ ์๋ ์๊ณ , ์ฌ๋ฌ ํ์ด์ง๋ก ๊ตฌ์ฑํ ์๋ ์์ต๋๋ค.
- ์ฌ๋ฌ ํ์ด์ง๋ก ๊ตฌ์ฑ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋ ํ์ด์ง ๋ณ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํด๊ฐ๋ฉด์ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ํ์ํ ๊ฒ์ด ๋ฐ๋ก ๋ผ์ฐํ ์์คํ ์ ๋๋ค.
๐ ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฝ๊ฒ ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ก ์ฑ๊ธํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
SPA๋ ์ด๋ฆ ๊ทธ๋๋ก ํ์ด์ง ํ๋๋ก ๋์๊ฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด๊ธฐ ๋๋ฌธ์ ํ์ด์ง ์ด๋์ ๋ฒ๋ฒ ์ ์์ด ๋ถ๋๋ฝ๊ฒ ์ ํ๋์ง๋ง,
์น ํ์ด์ง ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ SEO์๋ ๋งค์ฐ ์ทจ์ฝํฉ๋๋ค. ํ๋ ์ด๋ HTML metaํ๊ทธ์ ์ ๋ณด๋ฅผ ์ฌ๋ฆฌ๋ฉด ๋์ด์ ํฌ๊ฒ ๊ฑฑ์ ํ ์ ๋๋ ์๋๋๋ค.
์ต๊ทผ์๋ ์ด๋ฐ SEO์ ์ฝํ๋ค๋ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ์ด์ฉํ Next.js๊ฐ ๋ง์ด ์ฐ์ด๊ณค ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ์ ๋ณด๋ฅผ ํ๋ฒ์ ๋ค ๋ถ๋ฌ์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฒซ ํ์ด์ง ๋ก๋ฉ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ต๋๋ค.
ํ๋ก์ ํธ ์์ฑ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
$ yarn create react-app [ํด๋๋ช
]
$ cd [ํด๋๋ช
]
$ yarn add react-router-dom
ํ๋ก์ ํธ์ ๋ผ์ฐํฐ ์ ์ฉ
src/index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<App />
);
src/pages/Home.js
๐ src ๋๋ ํ ๋ฆฌ์ Pages ํด๋ ๋ง๋ค๊ณ , ํ์ ํ์ผ ์์ฑ
import React from "react";
const Home = () => {
return (
<div>
<h1>์ฌ๊ธฐ๊ฐ ํ ์
๋๋ค.</h1>
<p>๊ฐ์ฅ ๋จผ์ ๋ณด์ฌ์ง๋ ํ์ด์ง ์
๋๋ค.</p>
</div>
)
}
export default Home;
src/pages/About.js
import React from "react";
const About = () => {
return (
<div>
<h1>์๊ฐ</h1>
<p>๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํด ๋ณด๋ ํ๋ก์ ํธ ์
๋๋ค.</p>
</div>
)
}
export default About;
Route ์ปดํฌ๋ํธ๋ก ํน์ ๊ฒฝ๋ก์ ์ํ๋ ์ปดํฌ๋ํธ ๋ณด์ฌ์ฃผ๊ธฐ
<Route path="์ฃผ์ ๊ท์น" element={๋ณด์ฌ์ค ์ปดํฌ๋ํธ JSX} />
โฌ๏ธ
import './App.css';
import About from './pages/About';
import Home from './pages/Home';
import { BrowserRouter as Router, Route, Routes} from "react-router-dom";
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/About" element={<About />} />
</Routes>
</Router>
);
}
export default App;
Link ์ปดํฌ๋ํธ ์ฌ์ฉ
์น ํ์ด์ง์์๋ ์๋ ๋งํฌ๋ฅผ ๋ณด์ฌ์ค ๋ a ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋๋ฐ, ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์๋ a ํ๊ทธ๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ๋ฉด ์๋ฉ๋๋ค. (a ํ๊ทธ๋ฅผ ํด๋ฆญํ๋ฉด ๋ธ๋ผ์ฐ์ ์์๋ ํ์ด์ง๋ฅผ ์๋ก ๋ถ๋ฌ ์ค๊ธฐ ๋๋ฌธ์..)
Link ์ปดํฌ๋ํธ ์ญ์ a ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ธด ํ์ง๋ง ํ์ด์ง๋ฅผ ์๋ก ๋ถ๋ฌ์ค๋ ๊ฒ์ ๋ง๊ณ , History API๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ์ฃผ์์ ๊ฒฝ๋ก๋ง ๋ฐ๊พธ๋ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ต๋๋ค.
src/pages/Home.js
import { Link } from "react-router-dom";
const Home = () => {
return (
<div>
<h1>์ฌ๊ธฐ๊ฐ ํ ์
๋๋ค.</h1>
<p>๊ฐ์ฅ ๋จผ์ ๋ณด์ฌ์ง๋ ํ์ด์ง ์
๋๋ค.</p>
<Link to="/about">์๊ฐ</Link>
</div>
)
}
export default Home;
URL ํ๋ผ๋ฏธํฐ
- URL ํ๋ผ๋ฏธํฐ๋ ๋ฆฌ์กํธ ๋ผ์ฐํฐ์์ URL ํ๋ผ๋ฏธํฐ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ ์ํ ํ (Hook) ์ ๋๋ค.
- URL ํ๋ผ๋ฏธํฐ๋ useParams๋ผ๋ Hook์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด ํํ๋ก ์กฐํํ ์ ์์ต๋๋ค.
- URL ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ ๋ผ์ฐํธ ์ค์ ํ ๋ Route ์ปดํฌ๋ํธ์ path props๋ฅผ ํตํด ์ค์ ํฉ๋๋ค.
:username
๋ถ๋ถ์ ํธ์ถํ๋ ํ์ด์ง์์ ์ง์ ํ ์ ๋์ ์ธ ๊ฐ(aka ๋งค๊ฐ๋ณ์)์ผ๋ก ๋์ฒด๋์ด ์ปดํฌ๋ํธ์ ์ ๋ฌ๋ฉ๋๋ค.
Profile.js
import { useParams } from "react-router-dom";
const data = {
frontend: {
name: "๊ณฐ๋์ด์ฌ์ก์ฌ",
description: "๋ฆฌ์กํธ๋ฅผ ์ข์ํ๋ ๊ฐ๋ฐ์",
},
backend: {
name: "๋ฌ๋น์ฌ๋ฅ๊พผ",
description: "์คํ๋ง ๋ถํธ๋ฅผ ์ข์ํ๋ ๊ฐ๋ฐ์"
},
};
const Profile = () => {
const params = useParams();
const profile = data[params.username];
return(
<div>
<h1>์ฌ์ฉ์ ํ๋กํ</h1>
{profile ? (<div>
<h2>{profile.name}</h2>
<p>{profile.description}</p>
</div>
) : (<p>์กด์ฌํ์ง ์๋ ํ๋กํ ์
๋๋ค.</p>)
}
</div>
);
};
export default Profile;
App.js
import './App.css';
import About from './pages/About';
import Home from './pages/Home';
import { BrowserRouter as Router, Route, Routes} from "react-router-dom";
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/About" element={<About />} />
<Route path="/profiles/:username" element={<Profile />} />
</Routes>
</Router>
);
}
export default App;
Home.js
import { Link } from "react-router-dom";
const Home = () => {
return (
<div>
<h1>์ฌ๊ธฐ๊ฐ ํ ์
๋๋ค.</h1>
<p>๊ฐ์ฅ ๋จผ์ ๋ณด์ฌ์ง๋ ํ์ด์ง ์
๋๋ค.</p>
<Link to="/about">์๊ฐ</Link>
<ul>
<li>
<Link to="/profiles/frontend">Frontend ํ๋กํ</Link>
</li>
<li>
<Link to="/profiles/backend">Backend ํ๋กํ</Link>
</li>
</ul>
</div>
)
}
export default Home;
useNavigate
useNavigate๋ Link ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํด์ผ ํ๋ ์ํฉ์ ์ฌ์ฉํ๋ Hook ์ ๋๋ค.
useNavigate๋ ๋ฆฌ์กํธ ๋ฌธ๋ฒ์ด๋ผ ๋ค ์ ์ฉ๋์ด ๋ง์ด ์ฐ์ ๋๋ค.
๋ด๋ถ์ ์ผ๋ก stack ๊ตฌ์กฐ(LIFO)์ด๊ธฐ ๋๋ฌธ์ -1 ํ๋ฉด ์ด์ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
Link ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ค๊ฐ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๊ฒฝ์ฐ๊ฐ ์์.
์ด๋ด ๋๋ useNavigate๋ฅผ ์ฌ์ฉ..
Home.js
import React from "react";
import { Link, useNavigate } from "react-router-dom";
const Home = () => {
const navigate = useNavigate();
return (
<>
<h1>์ฌ๊ธฐ๋ ํ ์
๋๋ค.</h1>
<p>๊ฐ์ฅ ๋จผ์ ๋ณด์ด๋ ํ์ด์ง ์
๋๋ค.</p>
<Link to="/about">์๊ฐ</Link>
<p style={{ textDecoration: 'underline' }} onClick={()=>navigate("/about")}>์๊ฐํ์ด์ง๋ก ์ด๋</p>
</>
);
};
export default Home;
About.js
import React from "react";
import { useNavigate } from "react-router-dom";
const About = () => {
const navigate = useNavigate();
return (
<>
<h1>์๊ฐ ํ์ด์ง ์
๋๋ค.</h1>
<p>๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํด ๋ณด๋ ํ๋ก์ ํธ ์
๋๋ค.</p>
<button onClick={()=>navigate(-1)}>๋ค๋ก ๊ฐ๊ธฐ</button>
</>
);
};
export default About;
Navigate ์ปดํฌ๋ํธ (๋ฆฌ๋ค์ด๋ ์ )
Navigate ์ปดํฌ๋ํธ๋ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ์๊ฐ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค.
์ฆ, ํ์ด์ง๋ฅผ ๋ฆฌ๋ค์ด๋ ์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค.
์) ๋ง์ดํ์ด์ง ๋๋ ์ ๋ ๋ก๊ทธ์ธ ์๋์ด์์ผ๋ฉด ๋ฐ๋ก ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋(๋ฆฌ๋ค์ด๋ ์ )
replace={true}
๋ ๋ธ๋ผ์ฐ์ ์ ์ฃผ์ ํ์์ค์ ๋ด์ฉ์ ๋ฐ๊พธ์ง ์๊ณ ์ด๋ํ ์ ์๋๋ก ์ค์ ํ๋ ์ต์ - ์ด๋ฌํ ๋ฐฉ์์ผ๋ก
<Navigate>
์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด, ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋<a>
ํ๊ทธ๋window.location
๋ฑ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ณด๋ค ๋ผ์ฐํฐ์ ์ํ๋ฅผ ์ ์งํ๋ฉด์ ํจ๊ณผ์ ์ผ๋ก URL์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
Login.js
const Login = () => {
return <div>๋ก๊ทธ์ธ ํ์ด์ง</div>;
};
MyPage.js
import { Navigate } from "react-router-dom";
const MyPage = () => {
const isLogin = false;
if(!isLogin) {
return <Navigate to="/login" replace={true} />;
}
return <div>๋ง์ดํ์ด์ง</div>
};
export default MyPage;
'๐จ Frontend > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ฎ React - 9. ์ปดํฌ๋ํธ ์คํ์ผ๋ง (0) | 2023.04.18 |
---|---|
๐ฎ React - 8. Hook (4) | 2023.04.17 |
๐ฎ React - 7. ์ปดํฌ๋ํธ ๋ฐ๋ณต (Array, Map) (0) | 2023.04.13 |
๐ฎ React - 6. Ref์ DOM (0) | 2023.04.13 |
๐ฎ React - 5. ์ด๋ฒคํธ ํธ๋ค๋ง (0) | 2023.04.12 |