ํฐ์คํ ๋ฆฌ ๋ทฐ
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์ ์ ์๋ ๋ฉ์๋
- ๊ฐ์ ์ฝ์ด์ค๋ ๋ฉ์๋
- searchParams.get(key) : ํน์ ํ key์ value๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฉ์๋
์ํ๋ ์ฟผ๋ฆฌ ์คํธ๋ง์ key๋ฅผ ์ธ์๋ก ๋ฃ์ด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ํด๋น key์ ๋ถํฉํ๋ value๊ฐ ๋ฆฌํด๋๋ค. - searchParams.getAll(key) : ํน์ ํ key์ ๋ถํฉํ๋ value๊ฐ ๋ ๊ฐ ์ด์์ผ ๊ฒฝ์ฐ get ๋ฉ์๋๋ ์ ์ผ ๋จผ์ ๋์จ value๋ง ๋ฆฌํดํด์ค๋ค. getAll ๋ฉ์๋๋ ํด๋น key์ ํด๋นํ๋ ๋ชจ๋ value ๊ฐ๋ค์ ๋ฐฐ์ด์ ํํ๋ก ๋ฆฌํดํด์ค๋ค.
- searchParams.toString() : ์ฟผ๋ฆฌ ์คํธ๋ง์ ๊ฐ์ ๊ทธ๋๋ก string ํํ๋ก ๋ฆฌํด
- searchParams.get(key) : ํน์ ํ key์ value๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฉ์๋
- ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋ฉ์๋
searchParams์ ๊ฐ์ ๋ณ๊ฒฝํ๋๋ผ๋ ์ค์ URL์ ์ฟผ๋ฆฌ ์คํธ๋ง์ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
์ค์ ์ฟผ๋ฆฌ ์คํธ๋ง์ ๋ณ๊ฒฝ์ํค๋ ค๋ฉด setSearchParams ํจ์์ searchParams๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ฉด์ ํธ์ถํด์ผ ํ๋ค.- searchParams.set(key, value) : ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด์ ์ธ์๋ก ์ ๋ฌํ key ๊ฐ์ value๋ก ์ค์ ํ๋ ๋ฉ์๋
๋ง์ฝ ๋์ผํ key์ ์ฌ๋ฌ value๊ฐ ์ด๋ฏธ ์กด์ฌํ๊ณ ์์๋ค๋ฉด, set ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด์ ์ค์ ํ ๊ฐ ์ธ์๋ ์ญ์ ๋๋ค. - searchParams.append(key, value) : ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด์ ์ธ์๋ก ์ ๋ฌํ key ๊ฐ์ value๋ก ์ถ๊ฐํ๋ ๋ฉ์๋
๊ธฐ์กด์ ๊ฐ๋ค์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ญ์ ํ์ง ์๊ณ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
- searchParams.set(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
'Forntend > Trouble Shooting' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [/\/] fetch ์ต์ ์ ํ์์ฑ (0) | 2025.03.13 |
|---|---|
| vercel ๋ฐฐํฌ ์ค๋ฅ - ์๋ก๊ณ ์นจ 404: NON_FOUND (0) | 2025.02.09 |
| [Pokemon PJ_Day 2] ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง, Array.from, ์ด๋ฒคํธ ๋ฒ๋ธ๋ง ๋ฐฉ์ง (0) | 2025.02.05 |
| [movie PJ_day2] DOM์ ํ์ฉํ ๋ฐ๋๋ผ ์ฝ๋ฉ๐ฆ (0) | 2025.01.24 |
| [โ๏ธ] ๋ฆฌ์กํธ live server ์ฐ๊ฒฐํ๋ ๋ฒ (0) | 2025.01.21 |