React | Router

๐Ÿ™‹๐Ÿปโ€โ™€๏ธยท2022๋…„ 5์›” 12์ผ
0

wecode

๋ชฉ๋ก ๋ณด๊ธฐ
30/40

๐ŸŸ 1. SPA

โ–ช๏ธ SPA(Single Page Application) - ํŽ˜์ด์ง€๊ฐ€ ํ•œ ๊ฐœ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
โ–ช๏ธ Westgram-frontend : login.html,main.html-ํŽ˜์ด์ง€ ์ˆ˜๋งŒํผ html ํŒŒ์ผ์ด ์กด์žฌ
โ–ช๏ธ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ .html ํŒŒ์ผ์˜ ๊ฐœ์ˆ˜๋Š”? 1๊ฐœ >>> SPA(Single Page Application)
โ–ช๏ธ ํ•œ ๊ฐœ์˜ ์›นํŽ˜์ด์ง€(html)์•ˆ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ๋ฒ•์€? >>>Routing



๐ŸŸ 2. Routing

โ–ช๏ธ ๋ผ์šฐํŒ…(Routing)์ด๋ž€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ(url ์ฃผ์†Œ)์— ๋”ฐ๋ผ ๋‹ค๋ฅธ View(ํ™”๋ฉด)๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
โ–ช๏ธ ๋ฆฌ์•กํŠธ ์ž์ฒด์—๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค.
โ–ช๏ธ ๋ฆฌ์•กํŠธ๊ฐ€ Framework๊ฐ€ ์•„๋‹Œ Library๋กœ ๋ถ„๋ฅ˜๋˜๋Š” ์ด์œ 



โ–ช๏ธReact-router๋Š” ๋ฆฌ์•กํŠธ์˜ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.



๐ŸŸ 3. React Router

Create React App(CRA)์— ํŠน๋ณ„ํžˆ routing์„ ์œ„ํ•œ ๋กœ์ง์ด ๋“ค์–ด์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” routing solution์ธ react-router๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ routing์„ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋‹ค.



๐ŸŸก3-1. react-router ์„ค์น˜

npm install react-router-dom --save

๐ŸŸก3-2. Router ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ

import React from "react";
import { BrowserRouter, Routes, Route } from "react-router-dom";

import Nav from "./components/Nav/Nav";
import Footer from "./components/Footer/Footer";
import Login from "./pages/Login/Login";
import Signup from "./pages/Signup/Signup";
import Main from "./pages/Main/Main";

function Router() {
 return (
  <BrowserRouter>
   <Nav />
   <Routes>
    <Routes path="/" element={<Login />} />
    <Routes path="/signup" element={<Signup />} />
    <Routes path="/main" element={<Main />} />
   </Routes>
   <Footer />
  <BrowserRouter>
 );
}

export default Router;

๐ŸŸก3-3. index.js

ReactDOM.render(<Router />, document.getElementById('root'));

โ–ช๏ธ ํ˜„์žฌ ํ™”๋ฉด์—๋Š” <App /> ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณด์—ฌ์ง€๊ณ  ์žˆ๋‹ค.(๋˜๋Š” Login ์ปดํฌ๋„ŒํŠธ, Main ์ปดํฌ๋„ŒํŠธ)
โ–ช๏ธ CRA๋กœ ๋งŒ๋“  ์•ฑ์— routing ๊ธฐ๋Šฅ์„ ์ ์šฉํ•˜๋ ค๋ฉด index.js๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.
โ–ช๏ธ <App /> ์ปดํฌ๋„ŒํŠธ ๋Œ€์‹ ์— routing์„ ์„ค์ •ํ•œ ์ปดํฌ๋„ŒํŠธ(<Router />)๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.



๐ŸŸก3-4. Route ์ด๋™ํ•˜๊ธฐ

โ–ช๏ธ Route ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. <Link> ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  2. useNavigate๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

๐ŸŸก3-4-1. <Link>์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

import React from "react";
import { Link } from "react-router-dom";

function Login() {
 return (
  <div>
   <Link to="/signup">ํšŒ์›๊ฐ€์ž…</Link>
  </div>
 );
}

export default Login;

โ–ช๏ธ Router.js์—์„œ ์„ค์ •ํ•œ path๋กœ ์ด๋™ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ <Link /> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
โ–ช๏ธ react-router-dom์—์„œ ์ œ๊ณตํ•˜๋Š” <Link /> ์ปดํฌ๋„ŒํŠธ๋Š” DOM์—์„œ <a>๋กœ ๋ณ€ํ™˜(Complie)๋œ๋‹ค.
โ–ช๏ธ cf) JSX-Babel-JavaScript
โ–ช๏ธ <a>ํƒœ๊ทธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ <Link /> ์ปดํฌ๋„ŒํŠธ๋„ ์ง€์ •ํ•œ ๊ฒฝ๋กœ๋กœ ๋ฐ”๋กœ ์ด๋™์‹œ์ผœ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.
โ–ช๏ธ cf)<a> vs <Link>
(1)<a>- ์™ธ๋ถ€ ์‚ฌ์ดํŠธ๋กœ ์ด๋™ํ•˜๋Š”๊ฒฝ์šฐ
(2)<Link /> - ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ํŽ˜์ด์ง€ ์ „ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ


๐ŸŸก3-4-2.useNavigate๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

import React from "react";
import { useNavigate } from "react-router-dom";

function Login() {
 const navigate = useNavigate();

 const goToMain = () => {
  navigate("/main");
};
// ์‹ค์ œ ํ™œ์šฉ ์˜ˆ์‹œ
// const goToMain = () => {
//	if(response.message === "valid user") {
//	 navigate('/main');
// } else {
//	 alert("๊ฐ€์ž…๋œ ํšŒ์›์ด ์•„๋‹™๋‹ˆ๋‹ค. ํšŒ์›๊ฐ€์ž…์„ ๋จผ์ € ํ•ด์ฃผ์„ธ์š”.")
//	 navigate('/signup');
// }
//}

return (
 <div>
  <button className="loginBtn" onClick={goToMain}>
  ๋กœ๊ทธ์ธ
  </button>
 </div>
);
}

export default Login;

โ–ช๏ธ <Link />๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.
โ–ช๏ธ goToMainํ•จ์ˆ˜์—์„œ ๊ตฌํ˜„๋œ ๊ฒƒ์ฒ˜๋Ÿผ, useNavigateํ›…์„ ํ†ตํ•ด ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
โ–ช๏ธ useNavigateํ›…์„ ์‹คํ–‰ํ•˜๋ฉด ํŽ˜์ด์ง€ ์ด๋™์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ navigate๋ผ๋Š” ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.
โ–ช๏ธ ์ดํ›„, navigate์˜ ์ธ์ž๋กœ Router.js์—์„œ ์„ค์ •ํ•œ path๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด, ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
โ–ช๏ธ usenavigate๋Š” ํŠน์ • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•ด์คŒ


๐ŸŸก3-4-3. ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์˜ ํ™œ์šฉ๋ฒ•โœจโœจโœจ

  1. <Link />
    โ–ช๏ธ ํด๋ฆญ ์‹œ ๋ฐ”๋กœ ์ด๋™ํ•˜๋Š” ๋กœ์ง ๊ตฌํ˜„ ์‹œ์— ์‚ฌ์šฉํ•œ๋‹ค.
    โ–ช๏ธ ex.Nav Bar, Aside Menu, ์•„์ดํ…œ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€์—์„œ ์•„์ดํ…œ ํด๋ฆญ ์‹œ> ์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™

  2. useNavigate
    โ–ช๏ธ ํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ ์ถ”๊ฐ€๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋กœ์ง์ด ์žˆ๋Š” ๊ฒฝ์šฐ useNavigate ํ›…์„ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.
    โ–ช๏ธ ex.๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ
  • Backend API๋กœ ๋ฐ์ดํ„ฐ(User Info)์ „์†ก
  • User Data ์ธ์ฆ/์ธ๊ฐ€
  • response message
  • case 1: ํšŒ์› ๊ฐ€์ž…๋˜์–ด ์žˆ๋Š” ์‚ฌ์šฉ์ž > Main ํŽ˜์ด์ง€๋กœ ์ด๋™
  • case 2: ํšŒ์› ๊ฐ€์ž…์ด ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์‚ฌ์šฉ์ž > Signup ํŽ˜์ด์ง€๋กœ ์ด๋™





0๊ฐœ์˜ ๋Œ“๊ธ€