ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

QueryString์œผ๋กœ ํฌ์ผ“๋ชฌ ๋””ํ…Œ์ผ ํŽ˜์ด์ง€ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์˜ค๋Š˜์˜ ๋ชฉํ‘œ์ด๋‹ค.

 

์•„๋ž˜๋Š” ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ํŽ˜์ด์ง€

 

 

 

Dynamic Route(useParams ์‚ฌ์šฉ)

 

๐Ÿ“Dynamic Route ๋ž€?

  • ๋™์  ๋ผ์šฐํŒ…
  • path์— ์œ ๋™์ ์ธ ๊ฐ’์„ ๋„ฃ์–ด์„œ ํŠน์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ๋” ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

๐Ÿ“์˜ˆ์‹œ :
์–ด๋– ํ•œ ํŽ˜์ด์ง€์— ์—ฌ๋Ÿฌ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ฐ ์š”์†Œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ํŽ˜์ด์ง€๋ฅผ ๊ฐ–๋„๋ก ๊ตฌํ˜„ํ•˜๊ธฐ 

  • Detail ํŽ˜์ด์ง€์˜ path์— :id ์ถ”๊ฐ€ํ•˜๊ธฐ
    • ๋™์ ์ธ ๊ฐ’์„ ๋ฐ›๊ฒ ๋‹ค๋Š” ์˜๋ฏธ
    • useParams ํ›…์—์„œ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’
 // src/shared/Router.jsx
 <Route path="/detail" element={<Detail />} />
 ๐Ÿ‘‡๐Ÿป
 <Route path="/detail/:id" element={<Detail />} />

 

๐Ÿ“useParams

  • path์˜ ์žˆ๋Š” id ๊ฐ’์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ›… 
  • ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋”๋ผ๋„ ๊ฐ๊ฐ์˜ ๊ณ ์œ ํ•œ id ๊ฐ’์„ ์กฐํšŒ
  const Detail = () => {
   const params = useParams();  ๐Ÿ‘‰๐ŸปRouter์—์„œ ๋™์  ๋ผ์šฐํŒ…์œผ๋กœ ์ •ํ•ด๋†“์€ ๊ฐ’(id)
       console.log("params", params);  ๐Ÿ‘‰๐Ÿป{id: 6} ์˜ ํ˜•์‹์œผ๋กœ ์ฝ˜์†”์ฐฝ์— ์ฐํž˜
      
     // ๋ฐฐ์—ด ํ•œ ๊ฐœ๋งŒ ๊บผ๋‚ด์˜ค๊ธฐ
   const targetCard = datas.filter((data) => {
    return data.id === Number(params.id);
  });
       console.log("targetCard", targetCard);  ๐Ÿ‘‰๐Ÿปid๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ๊ฐ™์€ ๊ฒƒ์ด ๋ฐฐ์—ด๋กœ ์ฐํž˜

 

๐Ÿ“Œ ๋ฌธ์ œ์ :

  • queryString์„ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๊ณผ์ œ ์กฐ๊ฑด์— ๋งž์ง€ ์•Š์Œ
  • /detail/123์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ง์ ‘ URL์„ ์ž…๋ ฅํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ํŽ˜์ด์ง€ ์ด๋™์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ.

 

QueryString(useSearchParams ์‚ฌ์šฉ)

 

๐Ÿ“queryString ๋ž€?

 

  • URL์˜ ํ•œ ๋ถ€๋ถ„์œผ๋กœ์„œ, ์š”์ฒญํ•˜๊ณ ์ž ํ•˜๋Š” URL์— ๋ถ€๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ
    (๊ตฌ์ฒด์ ์œผ๋กœ ๋” ์ •๋ ฌ๋˜๊ณ  ํŠน์ •๋œ ํ˜•ํƒœ์˜ ์ •๋ณด๋ฅผ ์š”์ฒญ)

์ด์ „์— ์ž‘์„ฑํ•œ ๊ธ€  ๋งจ ํ•˜๋‹จ์—์„œ '์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ'๋ฅผ ์ •๋ฆฌํ•œ ์ ์ด ์žˆ์–ด ์ต์ˆ™ํ•œ ํ˜•ํƒœ์ด์ง€๋งŒ, ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ฒƒ์€ ์ฒ˜์Œ์ด๋‹ค.

 

 

๐Ÿ“ํ˜•ํƒœ

https://www.example.com/products?sort=popular&color=red
  • key=value ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ (key=value ํŽ˜์–ด์˜ ๊ฐœ์ˆ˜ ์ œํ•œ์€ ์—†์Œ)
  • ? : ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์˜ ์‹œ์ž‘ ํ‘œ์‹œ (start of parameters)
  • & : key=value ํŽ˜์–ด ๊ตฌ๋ถ„ ํ‘œ์‹œ (separator)

 

๐Ÿ“์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ํฌํ•จํ•ด์„œ Routing ํ•˜๊ธฐ

  • Link๋‚˜ navigate๋กœ ์‚ฌ์šฉ
<Link to="/list?sort=popular" />
 
navigate("/list?sort=popular")

 

 

๐Ÿ“์ปดํฌ๋„ŒํŠธ์—์„œ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

  • ํ•„์š” hook : useLocation, useSearchParams
  • ์ฟผ๋ฆฌ์ŠคํŠธ๋ง ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ณ  ์ฟผ๋ฆฌ์ŠคํŠธ๋ง ๊ฐ’ ๋ณ€๊ฒฝ ์‹œ ๋ฆฌ๋ Œ๋”๋ง

 

useLocation hook

  • ํ˜„์žฌ Location ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ด
  • Location ๊ฐ์ฒด๋Š” ํ˜„์žฌ ์œ„์น˜(URL)์— ํฌํ•จ๋œ ์—ฌ๋Ÿฌ ์ •๋ณด๋ฅผ ํฌํ•จ
  • ๊ฐ๊ฐ์˜ ์ •๋ณด๋ฅผ pathname, search, hash, state, key ๋“ฑ์˜ ํ”„๋กœํผํ‹ฐ๋กœ ํ‘œํ˜„
  • search: ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ๋กœ URL ์ค‘ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜์–ด ์žˆ์Œ
  • ๋‹จ์ : ์›ํ•˜๋Š” ๊ฐ’๋งŒ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋ฌธ์ž์—ด(?sort=popular)์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด์„œ Parsing ํ•ด์•ผํ•จ
import { useLocation } from 'react-router-dom';

  const location = useLocation();
  const queryString = location.search;  //?sort=popularใ…

 

๋‹จ์ ์ด ์žˆ๋‹ค๋Š” ๊ฒŒ ๋ญ”๊ฐ€ ๊ฑธ๋ ค์„œ.. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์•˜๋‹ค. 

 

 

โญ๏ธuseSearchParams hook

  • ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์˜ ๊ฐ’์„ ์ด์šฉํ•ด์„œ URLSearchParams ๊ฐ์ฒด๋ฅผ return
  • URLSearchParams ๊ฐ์ฒด: ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์—์„œ ์›ํ•˜๋Š” ๊ฐ’๋งŒ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ๋Š” ๊ฐ์ฒด
  • useState์™€ ๋น„์Šทํ•˜๊ฒŒ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ searchParams์™€ setSearchParams ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ด
const [searchParams, setSearchParams] = useSearchParams();
  • searchParams: URLSearchParams ๊ฐ์ฒด
  • setSearchParams ํ•จ์ˆ˜: ์ธ์ž๋กœ ๊ฐ์ฒด ๋˜๋Š” ๋ฌธ์ž์—ด์„ ๋„ฃ์–ด์„œ ํ˜ธ์ถœํ•˜๋ฉด ํ˜„์žฌ URL์˜ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต (์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์„ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉ)
  • searchParams์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ
  1. ๊ฐ’์„ ์ฝ์–ด์˜ค๋Š” ๋ฉ”์„œ๋“œ
    • searchParams.get(key) : ํŠน์ •ํ•œ key์˜ value๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ
      ์›ํ•˜๋Š” ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์˜ key๋ฅผ ์ธ์ž๋กœ ๋„ฃ์–ด์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น key์— ๋ถ€ํ•ฉํ•˜๋Š” value๊ฐ€ ๋ฆฌํ„ด๋œ๋‹ค.
    • searchParams.getAll(key) : ํŠน์ •ํ•œ key์— ๋ถ€ํ•ฉํ•˜๋Š” value๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ get ๋ฉ”์„œ๋“œ๋Š” ์ œ์ผ ๋จผ์ € ๋‚˜์˜จ value๋งŒ ๋ฆฌํ„ดํ•ด์ค€๋‹ค. getAll ๋ฉ”์„œ๋“œ๋Š” ํ•ด๋‹น key์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  value ๊ฐ’๋“ค์„ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.
    • searchParams.toString() : ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์˜ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ string ํ˜•ํƒœ๋กœ ๋ฆฌํ„ด
  2. ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ
    searchParams์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ์‹ค์ œ URL์˜ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.
    ์‹ค์ œ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋ ค๋ฉด setSearchParams ํ•จ์ˆ˜์— searchParams๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋ฉด์„œ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.
    • searchParams.set(key, value) : ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ key ๊ฐ’์„ value๋กœ ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ
      ๋งŒ์•ฝ ๋™์ผํ•œ key์— ์—ฌ๋Ÿฌ value๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด, set ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์„ค์ •ํ•œ ๊ฐ’ ์™ธ์—๋Š” ์‚ญ์ œ๋œ๋‹ค.
    • searchParams.append(key, value) : ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ key ๊ฐ’์„ value๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ
      ๊ธฐ์กด์˜ ๊ฐ’๋“ค์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

๐ŸšจTrouble Shooting

Dynamic์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋Š” ํŽ˜์ด์ง€ ์ฃผ์†Œ์— ์ง์ ‘ /1 ์„ ์ž…๋ ฅํ•˜์—ฌ์„œ ๋‚ด๊ฐ€ ํด๋ฆญํ•œ ํฌ์ผ“๋ชฌ ์นด๋“œ์˜ ์ƒ์„ธ์ •๋ณด(Detail page)๋กœ ๋„˜์–ด๊ฐ”๋‹ค.

ํ•˜์ง€๋งŒ ํด๋ฆญํ•œ ์นด๋“œ์˜ ํŽ˜์ด์ง€๊ฐ€ ์ž๋™์œผ๋กœ ๋„˜์–ด๊ฐ€์•ผํ•˜๋ฉฐ, ์ด๋ฅผ QueryString ์œผ๋กœ (/๊ฐ€ ์•„๋‹Œ ?์‚ฌ์šฉ) ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

 

Dynamic์„ ๋– ์˜ฌ๋ฆฌ๋ฉฐ id๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”(get)์ด ์•„๋‹Œ, ์ž…๋ ฅ(set)ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€?  ๋ผ๋Š” ์ƒ๊ฐ์ด ๊ฐ€๋“ํ–ˆ๋‹ค.

 

 

๐Ÿ‘‡๐Ÿป๋”ฐ๋ผ์„œ set๊ณผ get์˜ ๋กœ์ง์„ ๋ชจ๋‘ ์ž‘์„ฑํ•ด ๋ณด์•˜๋‹ค.

 

[set]

// searchParams.set
  
  const setSortParams = (e) => {
    searchParams.set("id", "1");  โญ๏ธ
    setSearchParams(searchParams);
  };

 

[get]

// searchParams.get

  const getId = searchParams.get("id");

set ๋กœ์ง์€ setSearchParams ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ ์šฉํ•˜์ง€๋งŒ

get์€ ํฌ์ผ“๋ชฌ [์นด๋“œ๋ฅผ ๊ทธ๋ ค์ฃผ๋Š” ๋กœ์ง]์— ์ง์ ‘ ์ ์šฉํ•ด์•ผ ํ–ˆ๋‹ค.

<MonCard
      key={data.id}
      
      onClick={(e) => {
          navigate(`/detail?id=`);  โญ๏ธ
        }
      }}
    >

 

โญ๏ธ ํ‘œ์‹œ ๋ถ€๋ถ„์—์„œ ๋™์ผํ•˜๊ฒŒ ๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„์ด
set์—์„œ "1" ์ž๋ฆฌ์™€ get์—์„œ id= ๋’ค์— ์–ด๋–ป๊ฒŒ ๋™์ ์ธ ์š”์†Œ (ํด๋ฆญํ•˜๋Š” ์นด๋“œ์˜ id)๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋ ๊นŒ? ์˜€๋‹ค.

 

๊ทธ๋Ÿฌ๋˜ ์ค‘ <MonCard>์˜ key ๊ฐ’์ด ๋ˆˆ์— ๋“ค์–ด์™”๋‹ค.

id= ๋’ค์ชฝ์— ${data.id}๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋‹ˆ ์ž‘๋™์ด ์ž˜ ๋˜์—ˆ๋‹ค!

 

 

๐Ÿ“Œ[์™„์„ฑ ๋กœ์ง]

// Detail.jsx
const [searchParams] = useSearchParams();
const datas = MOCK_DATA;

  const getId = searchParams.get("id"); // queryString์—์„œ id ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

  // ๋ฐฐ์—ด ํ•œ ๊ฐœ๋งŒ ๊บผ๋‚ด์˜ค๊ธฐ (map์„ ์œ„ํ•ด filter ์‚ฌ์šฉ)
  const d_TargetCard = datas.filter((data) => {
    return data.id === Number(getId); // type ์ผ์น˜์‹œํ‚ค๊ธฐ
  });



// PokemonCard.jsx
<MonCard
      key={data.id}
      
      onClick={(e) => {
          navigate(`/detail?id=${data.id}`);
        }
      }}
    >
  • setSearchParams ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ง€์›Œ์คŒ
  • return๋ฌธ์—์„œ map์„ ํ™œ์šฉํ•˜์—ฌ ์นด๋“œ๋ฅผ ์ฐ์–ด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— filter๋ฅผ ์‚ฌ์šฉ
  • .get์œผ๋กœ ๊ฐ€์ ธ์˜จ ๊ฐ’์€ String์ด๊ธฐ ๋•Œ๋ฌธ์— Number() ๋กœ type ์ผ์น˜์‹œํ‚ด

์ฐธ๊ณ  ์ž๋ฃŒ:

https://velog.io/@leah1225/React-%EC%BF%BC%EB%A6%AC-%EC%8A%A4%ED%8A%B8%EB%A7%81Query-String

https://velog.io/@bigwave-cho/React-%EC%BF%BC%EB%A6%AC-%EC%8A%A4%ED%8A%B8%EB%A7%81

๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2026/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ