TIL

TIL :: [React] React Router, Sass

sophie0527 2022. 5. 25. 23:55

ํ•™์Šต๋ชฉํ‘œ

  1. SPA๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. react-router-dom๋ฅผ ์ด์šฉํ•ด Router Component๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. react-router-dom์—์„œ Routing์„ ํ•˜๋Š” ๋ฐฉ๋ฒ• 2๊ฐ€์ง€์™€ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. <Link> Component ์™€ <a> tag ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  5. css ์ „์ฒ˜๋ฆฌ๊ธฐ์˜ ์—ญํ• ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  6. sass์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ cssํŒŒ์ผ์„ scssํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1. SPA๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

* spa๋ž€?(์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜)

: ๋ฉ€ํ‹ฐํ”Œ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹Œ ์‹ฑ๊ธ€ ํŽ˜์ด์ง€์ด๋‹ค.

 

2. react-router-dom๋ฅผ ์ด์šฉํ•ด Router Component๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

* react-router ๋ž€?

: ๋ฆฌ์•กํŠธ์˜ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

 

* Routing(๋ผ์šฐํŒ…) ์ด๋ž€?

: ๋‹ค๋ฅธ ๊ฒฝ๋กœ(url ์ฃผ์†Œ)์— ๋”ฐ๋ผ ๋‹ค๋ฅธ View(ํ™”๋ฉด)๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ.

 

ํŽ˜์ด์ง€ ์ด๋™์— ์žˆ์–ด์„œ, ํ™”๋ฉด์„ ์ „ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๊ฐ€ react router ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฃผ์†Œ(url)๋กœ ์ด๋™์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋„๊ตฌ ์ด๋‹ค.

๋ผ์šฐํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ์ฃผ์†Œ์™€ ์ฃผ์†Œ๋ฅผ ๋งตํ•‘์‹œํ‚ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค€๋‹ค.

 

react-router๋ฅผ ํ†ตํ•ด SPA(์‹ฑ๊ธ€ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)๊ฐ€ ํ™”๋ฉด์ด๋™์„ ํ•˜๋Š”๊ฒƒ ์ฒ˜๋Ÿผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

router๋ฅผ ์ด์šฉํ•ด ๋กœ๊ทธ์ธํŽ˜์ด์ง€์™€ ๋ฉ”์ธํŽ˜์ด์ง€๋ฅผ ์™”๋‹ค๊ฐ”๋‹คํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

*react-router ์„ค์น˜ :
npm install react-router-dom --save

Router Component ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค

์˜ ์˜๋ฏธ๋Š”  Router Component(=ํด๋”)๋ฅผ ๋งŒ๋“ค์–ด๋ผ!  Router.js 

์ฃผ์†Œ์™€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ์ปจํฌ๋„ŒํŠธ๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ๋งŒ ํ•ด๋‹น ์ฃผ์†Œ๋กœ ๋“ค์–ด๊ฐ”์„๋•Œ , ์ปดํฌ๋„ŒํŠธ์—์„œ ์ •์˜ํ•œ ํ™”๋ฉด์ด ๋ณด์ด๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

 

Router ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„๋ฐฉ๋ฒ• ์˜ˆ์‹œ

import React from "react"; //ํ•ด๋‹น ํŒŒ์ผ์ด 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>
        <Route path="/" element={<Login />} />        
        <Route path="/signup" element={<Signup />} />
        <Route path="/main" element={<Main />} />
        
        //์œ„์˜ ๋‚ด์šฉ์€ Route๊ฐ€ ๋ฆฌํ„ด์ด๋˜์–ด ๋ธŒ๋ผ์šฐ์ € ์ƒ์— ๋ณด์ด๊ฒŒ ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
        
      </Routes>
      <Footer />
    </BrowserRouter>
  );
}

export default Router;

 

3. react-router-dom์—์„œ Routing์„ ํ•˜๋Š” ๋ฐฉ๋ฒ• 2๊ฐ€์ง€์™€ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ** <a> ํƒœ๊ทธ ๋Œ€์‹  ์จ์•ผํ•  ๊ฒƒ๋“ค

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

 

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

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

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

export default Login;
  • <a> - ์™ธ๋ถ€ ์‚ฌ์ดํŠธ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ
  • <Link /> - ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ํŽ˜์ด์ง€ ์ „ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ
  • ํด๋ฆญ ์‹œ ๋ฐ”๋กœ ์ด๋™ํ•˜๋Š” ๋กœ์ง ๊ตฌํ˜„ ์‹œ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ex. Nav Bar, Aside Menu, ์•„์ดํ…œ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€์—์„œ ์•„์ดํ…œ ํด๋ฆญ ์‹œ > ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™

 

2. useNavigate ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• 

 

useNavigate๋Š” ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์—์„œ ๋„ค๋น„๊ฒŒ์ด์…˜(=๋ผ์šฐํŒ…)์„ ๋„์™€์ฃผ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์ธ ์žฅ์น˜์ด๋‹ค.

 

<button> ์—์„œ onclick ์„ ๋งตํ•‘ ์‹œํ‚ค๊ณ , onclick ์•ˆ์— goToMain์ด๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ , 

<button className="loginBtn" onClick={goToMain}>

goToMain์ด๋ผ๋Š” ํ•จ์ˆ˜ ์•ˆ์— ์œ„์— ์žˆ๋˜ navigate ํ•จ์ˆ˜๋ฅผ ์จ์„œ navigate("/main")์œผ๋กœ ๋ผ์šฐํŒ…์„ ์‹œํ‚ค๊ณ  ์žˆ๋‹ค.

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

  const goToMain = () => {
    navigate("/main");
  };

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

 

* ์ฐจ์ด์  

<Link>๋Š” ํด๋ฆญํ•˜๋ฉด ์ด๋™ํ•˜๋Š”๊ฒƒ๋งŒ ๊ฐ€๋Šฅ.

useNavigate ์˜ navigate์˜ ํ•จ์ˆ˜ navigate("/main") ๋Š” ์–ด๋””์„œ๋“  ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค. (ํฌ๊ด„์ ์ธ ํƒœ๊ทธ์— ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ ์ˆ˜ ์žˆ๋‹ค.)

 

ํ•จ์ˆ˜์ ์œผ๋กœ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ ์œผ๋กœ ์ด๋™์„ ํ•˜๋ ค๋ฉด useNavigate๋ฅผ ์“ฐ๊ณ 

๊ตฌ์กฐ์ ์œผ๋กœ ํด๋ฆญํ–ˆ์„๋•Œ ๋‹จ์ˆœํ•œ ์ด๋™์„ ์›ํ•œ๋‹ค๋ฉด Link ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

4. <Link> Component ์™€ <a> tag ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • <a> tag : ๋ฌธ์„œ์™€ ๋ฌธ์„œ๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉ

ํ•˜์ง€๋งŒ, SPA๋Š” ๋ฌธ์„œ์™€ ๋ฌธ์„œ๋ฅผ ์—ฐ๊ฒฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. SPA๋Š” ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€ ์•ˆ์—์„œ ๋‹ค๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—!

๊ฒฐ๋ก ! SPA์˜ ๋‚ด๋ถ€ํŽ˜์ด์ง€์—์„œ๋Š” <a> tag๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

 

 

5. css ์ „์ฒ˜๋ฆฌ๊ธฐ์˜ ์—ญํ• ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ „์ฒ˜๋ฆฌ(Preprocessor) ??

: ๋ง๊ทธ๋Œ€๋กœ ์ „์— ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค๋Š” ๋œป!

์ตœ์ข…์ ์œผ๋กœ css๊ฐ€ ๋‚˜์˜ค๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด, ๊ทธ ์ „์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฒƒ ๋“ค์„ ์ •์˜ํ•ด ๋†“๋Š” ๊ฒƒ!

 

 

6. sass์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ cssํŒŒ์ผ์„ scssํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

*sass ์„ค์น˜ :
npm install sass --save
  • css ํŒŒ์ผ๋ช…์„  .scss๋กœ ๋ฐ”๊พธ๊ธฐ!
  • Nesting ๊ธฐ๋Šฅ ์ ์šฉํ•˜๊ธฐ

  • ๋ณ€์ˆ˜ ํ™œ์šฉ, & ์—ฐ์‚ฐ์ž, mixin ๋“ฑ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์ ์šฉํ•˜๊ธฐ