TIL 5/22

Ramiยท2025๋…„ 5์›” 22์ผ

TodayILearn

๋ชฉ๋ก ๋ณด๊ธฐ
46/61

useRouteMath vs useParams

1. useParams ๋ฐฉ์‹

์‚ฌ์šฉ ์˜ˆ์‹œ

import { useParams } from "react-router-dom";

function MovieDetail() {
  // URL์— ์ •์˜๋œ :movieId ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”๋กœ ๊บผ๋ƒ„
  const { movieId } = useParams<{ movieId: string }>();

  // movieId๋ฅผ ์ด์šฉํ•ด API ํ˜ธ์ถœ, ํ™”๋ฉด ๋ Œ๋”๋ง ๋“ฑ ์ฒ˜๋ฆฌ
  return <div>Movie ID: {movieId}</div>;
}
  • ์žฅ์ 

    • ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.
    • ์˜ค๋กœ์ง€ โ€œํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’โ€๋งŒ ํ•„์š”ํ•  ๋•Œ ๋”ฑ ์ข‹์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ 

    • ํ˜„์žฌ ๋ผ์šฐํŠธ๊ฐ€ ์–ด๋–ค ํŒจํ„ด์— ๋งค์นญ๋๋Š”์ง€(path ์ •๋ณด)๊นŒ์ง€๋Š” ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • ์ค‘์ฒฉ๋œ(๋„ค์Šคํ‹ฐ๋“œ) ๋ผ์šฐํŒ…์—์„œ ๋ถ€๋ชจยท์ž์‹ ๊ฒฝ๋กœ์˜ ํŒจํ„ด์„ ๋ถ„๊ธฐํ•ด์•ผ ํ•  ๋•Œ ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. useMatch / useRouteMatch ๋ฐฉ์‹

react-router-dom@6๋ถ€ํ„ฐ๋Š” useMatch(pattern)์„, v5์—์„œ๋Š” useRouteMatch() ํ›…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ (v6 ๊ธฐ์ค€)

import { useMatch } from "react-router-dom";

function MovieDetail() {
  // "/movies/:movieId" ํŒจํ„ด์— ๋งค์นญ๋œ ์ •๋ณด๋ฅผ ๊ฐ์ฒด๋กœ ๋ฐ›์Œ
  const match = useMatch("/movies/:movieId");

  // match.params.movieId ๋กœ ๊บผ๋‚ผ ์ˆ˜ ์žˆ์Œ
  const movieId = match?.params.movieId;

  return <div>Movie ID: {movieId}</div>;
}

์ฃผ์š” ํŠน์ง•

  1. ํŒจํ„ด ๋งค์นญ ์ •๋ณด

    • match ๊ฐ์ฒด์—๋Š”

      • params: ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’,
      • pathname: ๋งค์นญ๋œ URL,
      • pattern: ๋งค์นญ์— ์‚ฌ์šฉ๋œ ํŒจํ„ด ์ •๋ณด(path, caseSensitive, end ๋“ฑ)
    • ์ฆ‰, โ€œ์–ด๋–ค URL ํŒจํ„ด์— ๋งค์นญ๋๋Š”์ง€โ€๊นŒ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง

    if (!match) {
      // URL์ด /movies/:movieId ํŒจํ„ด์ด ์•„๋‹ ๋•Œ
      return <NotFound />;
    }

    ์ด๋Ÿฐ ์‹์œผ๋กœ โ€œํŒจํ„ด์— ๋งค์นญ๋˜์ง€ ์•Š์•˜์œผ๋ฉด ๋‹ค๋ฅธ UI๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐโ€๋„ ์‰ฝ์Šต๋‹ˆ๋‹ค.

  3. ์ค‘์ฒฉ ๋ผ์šฐํŒ… ๋Œ€์‘

    • ์ค‘์ฒฉ๋œ ๊ตฌ์กฐ์—์„œ ๋ถ€๋ชจ ยท ์ž์‹ ๊ฒฝ๋กœ๊ฐ€ ๊ฒน์น  ๋•Œ, ๊ฐ ๋ ˆ๋ฒจ๋ณ„๋กœ useMatch๋ฅผ ์จ์„œ
      โ€œ์ง€๊ธˆ ๋‚ด๊ฐ€ ์–ด๋А ๋ ˆ๋ฒจ์˜ ๋ผ์šฐํŠธ์— ์žˆ๋Š”๊ฐ€?โ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

3. ์–ธ์ œ ๋ฌด์—‡์„ ์“ฐ๋ฉด ์ข‹์„๊นŒ?

์ƒํ™ฉ์ถ”์ฒœ ๋ฐฉ์‹์ด์œ 
๋‹จ์ˆœํžˆ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’๋งŒ ํ•„์š”ํ•  ๋•ŒuseParams์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
โ€œ์ง€๊ธˆ ์ด URL์ด ํŠน์ • ํŒจํ„ด์— ๋งž๋Š”์ง€โ€๋„ ํ•จ๊ป˜ ํ™•์ธํ•ด์•ผ ํ•  ๋•ŒuseMatch๋งค์นญ๋œ ํŒจํ„ด ์ •๋ณด(match.pattern)์™€ params๋ฅผ ๋‘˜ ๋‹ค ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ค‘์ฒฉ๋œ ๋„ค์Šคํ‹ฐ๋“œ ๋ผ์šฐํŒ… ๊ตฌ์กฐ์—์„œ ๋ถ€๋ชจยท์ž์‹ ๊ฒฝ๋กœ๋ฅผ ๋ถ„๊ธฐํ•  ๋•ŒuseMatch๋ ˆ๋ฒจ๋ณ„๋กœ match ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„์„œ, โ€œ๋ถ€๋ชจ ๊ฒฝ๋กœโ€์™€ โ€œ์ž์‹ ๊ฒฝ๋กœโ€๋ฅผ ๊ฐ๊ฐ ์ฒดํฌํ•˜๊ธฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌ ์˜ˆ์‹œ

// App.tsx
<Routes>
  <Route path="/" element={<Home />} />
  <Route path="/movies/:movieId" element={<MovieDetail />} />
</Routes>

// MovieDetail.tsx
import { useParams, useMatch } from "react-router-dom";

function MovieDetail() {
  // 1) ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ๊บผ๋‚ผ ๋•Œ
  const { movieId } = useParams<{ movieId: string }>();

  // 2) ํŒจํ„ด ๋งค์นญ ์ •๋ณด๋„ ํ•„์š”ํ•  ๋•Œ
  const match = useMatch("/movies/:movieId");

  console.log("Matched pattern:", match?.pattern);
  console.log("Movie ID:", movieId);

  return <div>Now showing details for movie #{movieId}</div>;
}
  • useParams๋กœ๋Š” ๊ฐ’๋งŒ,
  • useMatch๋กœ๋Š” ๊ฐ’ + ๋งค์นญ๋œ ํŒจํ„ด ์ •๋ณด๊นŒ์ง€ ๊ฐ€์ ธ์˜ค๋Š” ์ฐจ์ด๋ผ๊ณ  ์ดํ•ดํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
profile
YOLO

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