๐Ÿ‘ฉโ€๐Ÿ’ป
Megaptera Frontend
  • ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
    • megaptera-front
    • 1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
      • 1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
      • 2. TypeScript
      • 3. React
      • 4. Testing Library
      • 5. Parcel & ESLint
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 2. JSX
      • 1. JSX
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 3. React๋กœ ์‚ฌ๊ณ ํ•˜๊ธฐ
      • 1. React Component
      • 2. React State
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 4. React Hooks
      • 1. Express
      • 2. Fetch API & CORS
      • 3. React์˜ Hook
      • 4. useRef & Custom Hook
      • 5. usehooks-ts
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 5. ํ…Œ์ŠคํŠธ
      • 1. TDD
      • 2. React Testing Library
      • 3. MSW
      • 4. Playwright
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 6. External Store
      • 1. External Store
      • 2. TSyringe
      • 3. Redux ๋”ฐ๋ผํ•˜๊ธฐ
      • 4. usestore-ts
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 7. React Router
      • 1. Routing
      • 2. Routes
      • 3. Router
      • 4. Navigation
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 8. CSS in JS
      • 1. Design System
      • 2. Style Basics
      • 3. CSS in JS
      • 4. styled-components
      • 5. props์™€ attrs
      • 6. Global Style & Theme
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 9. ์‡ผํ•‘๋ชฐ ๋ชฉ๋ก, ์ƒํ’ˆ ํŽ˜์ด์ง€
      • 1. ๊ฐœ๋ฐœํ•˜๊ธฐ ์ „ ์ค€๋น„
      • 2. ๋ชฉ๋ก ๋ณด๊ธฐ
      • 3. ์ƒํ’ˆ ์ƒ์„ธ ๋ณด๊ธฐ
      • 4. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ณด๊ธฐ
      • 5. ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ ๋‹ด๊ธฐ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 10. ์‚ฌ์šฉ์ž ์ธ์ฆ, ์ธ๊ฐ€
      • 1. ๋กœ๊ทธ์ธ
      • 2. ๋กœ๊ทธ์•„์›ƒ
      • 3. ํšŒ์›๊ฐ€์ž…
      • 4. ์ฃผ๋ฌธ ๋ชฉ๋ก & ์ฃผ๋ฌธ ์ƒ์„ธ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 11. ์ฃผ๋ฌธ, ๊ฒฐ์ œ
      • 1. ๋ฐฐ์†ก ์ •๋ณด ์ž…๋ ฅ
      • 2. ํฌํŠธ์› ๊ฒฐ์ œ ์š”์ฒญ
      • 3. ๋ฐฐ์†ก ๋ฐ ๊ฒฐ์ œ ์ •๋ณด ์ „๋‹ฌ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 12. ์–ด๋“œ๋ฏผ
      • 1. ๊ด€๋ฆฌ์ž ์›น ์‚ฌ์ดํŠธ ๊ฐœ๋ฐœ ์‹œ์ž‘
      • 2. ๋กœ๊ทธ์ธ, ์‚ฌ์šฉ์ž ๋ชฉ๋ก
      • 3. ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ
      • 4. ์ฃผ๋ฌธ ๊ด€๋ฆฌ
      • 5. ์ƒํ’ˆ ๊ด€๋ฆฌ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
Powered by GitBook
On this page
  • 1. Web APIs
  • History
  • History.pushState
  • 2. React Router
  • Link
  • NavLink
  • Navigate
  • useNavigate
  • 3. ๋™์  ๋ผ์šฐํŒ…
  • useParams
  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
  1. ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
  2. 7. React Router

4. Navigation

Previous3. RouterNextํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ

Last updated 2 years ago

1. Web APIs

History

History ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์„ธ์…˜ ๊ธฐ๋ก, ์ฆ‰ ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜จ ํƒญ ๋˜๋Š” ํ”„๋ ˆ์ž„์˜ ๋ฐฉ๋ฌธ ๊ธฐ๋ก์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณต

History.pushState

HTML5๋ถ€ํ„ฐ ์ƒˆ๋กœ ๋“ฑ์žฅํ•œ ๋ฉ”์†Œ๋“œ ๋ธŒ๋ผ์šฐ์ €์˜ ์„ธ์…˜ ๊ธฐ๋ก ์Šคํƒ์— ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ ๋งํฌ๋ฅผ ๊ฐ€๋กœ์ฑ”

  • ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•œ ์ œ๋ชฉ(์ œ๊ณตํ•œ ๊ฒฝ์šฐ URL๋„)์œผ๋กœ ์„ธ์…˜ ๊ธฐ๋ก ์Šคํƒ์— ์ถ”๊ฐ€

  • ๋ฐ์ดํ„ฐ๋Š” DOM์ด ๋ถˆํˆฌ๋ช…(opaque)ํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•˜๋ฏ€๋กœ, ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  JavaScript ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

  • Safari๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €๋Š” title ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฌด์‹œ

๐Ÿ”Ž ์ด์ „์—๋Š” ์ƒˆ๋กœ ๋กœ๋”ฉ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์ฃผ์†Œ์— #, #! ๋“ฑ์„ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ–ˆ์Œ

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

history.pushState(state, title[, url]);
  • state

    • ์•„๋ฌด ๊ฐ์ฒด๋‚˜ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ

    • ์ƒˆ๋กœ์šด ์„ธ์…˜ ๊ธฐ๋ก ํ•ญ๋ชฉ์— ์—ฐ๊ฒฐํ•  ์ƒํƒœ ๊ฐ์ฒด

  • url (Optional)

    • ์ƒˆ๋กœ์šด ์„ธ์…˜ ๊ธฐ๋ก ํ•ญ๋ชฉ์˜ URL

    • ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฌธ์„œ์˜ ํ˜„์žฌ URL์„ ์‚ฌ์šฉ

const handleClick = event => {
  event.preventDefault();
  const state = {};
  const title = '';
  const url = '/about';

  history.pushState(state, title, url);
}
  • <a> ํƒœ๊ทธ์— onClick์œผ๋กœ ๋„˜๊ฒจ์ฃผ๊ธฐ

โœ๏ธ ์กฐ๊ฐ๊ธ€

ํ‰์†Œ <Link> ํƒœ๊ทธ๋ฅผ ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•˜๊ณค ํ–ˆ์—ˆ๋Š”๋ฐ, History.pushState ๋ผ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ง์ ‘ ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ƒˆ๋กœ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. React๊ฐ€ Class ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋กœ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ์ „ํ™˜๋œ ๊ฒƒ ์ฒ˜๋Ÿผ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ํ˜์‹  async/await์˜ ๋“ฑ์žฅ์ฒ˜๋Ÿผ ๊ธฐ์ˆ ์€ ํ•ญ์ƒ ํŽธ๋ฆฌํ•˜๊ณ  ์‰ฌ์šด ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ™”ํ•œ๋‹ค๋Š”๊ฑธ ๋А๋‚€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ „์˜ ๋ถˆํŽธํ•จ์„ ๋ชจ๋ฅด๊ณ  ์žˆ๋Š” ๋‚ด๊ฐ€ ๋‹คํ–‰์ด๋ผ๋Š” ์ƒ๊ฐ๋„ ๋“ค๊ณ . ํ•œํŽธ์œผ๋ก  ์ง€๊ธˆ์˜ ํŽธ๋ฆฌํ•จ์—๋„ ์ˆ˜๋ช…์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์•ž์œผ๋กœ ๋”ฐ๋ผ์žก์•„์•ผ ํ•  ์‹ ๊ธฐ์ˆ ์— ์•„๋“ํ•ด์ง€๊ธฐ๋„ ํ•œ๋‹ค.

2. React Router

Link

์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ํƒญํ•˜์—ฌ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์š”์†Œ <Link>๋Š” ์—ฐ๊ฒฐ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” href๊ฐ€ ์žˆ๋Š” ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ <a> ์š”์†Œ๋ฅผ ๋ Œ๋”๋ง

History.pushState๋ฅผ ์ง์ ‘ ํ•˜์ง€ ์•Š์•„๋„ React Router์—์„œ ๋‹ค ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ

  • ํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ ์ฃผ์†Œ ๋ณ€๊ฒฝ

  • ๋‚ด์šฉ ๋ณ€๊ฒฝ

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

import {Link} from 'react-router-dom';

export default function Header() {
    
    return (
        <header>
          <nav>
            <ul>
              <li><Link to="/">Home</Link></li>
              <li><Link to="/about">About</Link></li>
            </ul>
          </nav>
        </header>
    );
}

NavLink

๋„ค๋น„๊ฒŒ์ด์…˜์šฉ ๋งํฌ ํ™œ์„ฑ, ๋ณด๋ฅ˜ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” <Link> ํƒœ๊ทธ ํƒ์ƒ‰ ๋ฉ”๋‰ด, ํ˜„์žฌ ์„ ํƒ๋œ ํ•ญ๋ชฉ์„ ํ‘œ์‹œํ•  ๋•Œ ์œ ์šฉ

<NavLink> ์ฒ˜๋ฆฌ๋œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์š”์†Œ ๋ณ€ํ™”

๊ธฐ๋ณธ์ ์œผ๋กœ active ํด๋ž˜์Šค๋Š” <NavLink>๊ฐ€ ํ™œ์„ฑ ์ƒํƒœ์ผ ๋•Œ ์ถ”๊ฐ€๋จ CSS๋กœ ์Šคํƒ€์ผ ์ง€์ • ๊ฐ€๋Šฅ

<a class="active" href="/" aria-current="page">Home</a>

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

function Header() {
    return (
        <header>
          <nav>
            <ul>
              <li><NavLink to="/">Home</NavLink></li>
              <li><NavLink to="/about">About</NavLink></li>
            </ul>
          </nav>
        </header>
    );
}

Navigate

๋ฌด์กฐ๊ฑด ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ๋ฐœ์ƒ <Navigate>๋Š” ๋ Œ๋”๋ง๋  ๋•Œ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝ ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ๋ฐœ์ƒ์‹œํ‚ฌ ๋•Œ (Ex. Logout ์ฒ˜๋ฆฌ)

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

import { Navigate } from 'react-router-dom';

export default function LogoutPage() {
    return (
        <Navigate to="/" />
    );
}

ํ…Œ์ŠคํŠธ

    context('When the current path is "/logout")', () => {
        it('redirects to the home page', () => {
            renderRouter('/logout');
            
            screen.getByText(/Welcome/);
        });
    });

๐Ÿ’ก ํ…Œ์ŠคํŠธ์—์„œ ReferenceError: Request is not defined ์—๋Ÿฌ๊ฐ€ ๋‚˜๋ฉด whatwg-fetch๋ฅผ ์ž„ํฌํŠธํ•ด์„œ ํ•ด๊ฒฐ

๐Ÿšจ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€

โ–ถ๏ธ RUNS src/routes.test.tsx return new Request(url, init); ^

ReferenceError: Request is not defined

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

npm i -D whatwg-fetch

setupTests.ts์— import 'whatwg-fetch'

useNavigate

Hook์„ ์ด์šฉํ•ด redirect์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌ

replace

๋’ค๋กœ๊ฐ€๊ธฐ ๋ฐฉ์ง€ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€์˜ ๊ฒฝ์šฐ, ๋กœ๊ทธ์•„์›ƒ์„ ํ•ด์„œ ์œ ์ € ํ† ํฐ ๊ฐ’์ด ์—†์„ ๋•Œ ์‚ฌ์šฉ

 navigate('/',  { replace: true });

navigate์˜ url๋กœ ๋„˜์–ด๊ฐ„ ํ›„์—๋Š” ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ํ•˜๋”๋ผ๋„ ์ด์ „ ํŽ˜์ด์ง€๋กœ ๋Œ์•„์˜ฌ ์ˆ˜ ์—†์Œ

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

import { useNavigate } from 'react-router-dom';

export default function Header() {
    const navigate = useNavigate();
    
    const handleClickLogout = () => {
        navigate('/');
    };
    
    return (
        <header>
          <ul>
            <li><Link to='/'>Home</Link></li>
            <li><Link to='/about'>About</Link></li>
            <li>
              <button type='button' onClick={handleClickLogout}>
                Log out
              </button>
            </li>
          </ul>
        </header>
    );
}

3. ๋™์  ๋ผ์šฐํŒ…

๋ผ์šฐํŠธ ๊ฒฝ๋กœ์— ํŠน์ • ๊ฐ’์„ ๋„ฃ์–ด ํ•ด๋‹นํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ ์›น ์‚ฌ์ดํŠธ์˜ ์ƒ์„ธ ํŽ˜์ด์ง€ ๊ตฌํ˜„์— ์‚ฌ์šฉ

useParams

  • React Router์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜, hook

  • Path Parameter์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด์Œ

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

Route์˜ path ์•ˆ์— '/category/:id' ํ˜•ํƒœ์˜ ๊ฒฝ๋กœ ์ถ”๊ฐ€

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

const Router = () => (
    <Routes>
    <Route path={PATH.HOME} element={<Home />} />
    <Route path={PATH.ABOUT} element={<AboutPage />} />
  </Routes>
);
// PATH๋ฅผ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ

export const PATH = {
  HOME: '/',
  ABOUT: '/about/:id',
};
  • Path Parameter : ๊ฒฝ๋กœ ๋์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ๊ธฐ ๋‹ค๋ฅธ id๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜

  • id : ํ•ด๋‹น Path Parameter์˜ ์ด๋ฆ„, ์ž„์˜๋กœ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ

  • : : Path Parameter๊ฐ€ ์˜ฌ ๊ฒƒ์ž„์„ ์˜๋ฏธ, ๋™์  ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋œป

url์— ๋‹ด๊ธด id ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

import * as React from 'react';
import { Routes, Route, useParams } from 'react-router-dom';

function ProfilePage() {
  // Get the userId param from the URL.
  let { userId } = useParams();
  // ...
}

function App() {
  return (
      <Routes>
        <Route path="users">
          <Route path=":userId" element={<ProfilePage />} />
          <Route path="me" element={...} />
        </Route>
      </Routes>
  );
}

History
History.pushState()
๐Ÿ”— ์‹ค์Šต ๋งํฌ : Navigate ์ ์šฉ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐ whatwg-fetch ์„ค์น˜
๐Ÿ”— ์‹ค์Šต ๋งํฌ : useNavigate ์ด์šฉํ•ด ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ
Link
NavLink
Navigate
useNavigate
useParams