[DevCamp] ๐Ÿ” React์—์„œ URLSearchParams ์‚ฌ์šฉํ•˜๊ธฐ

๋™๊ฑดยท2025๋…„ 4์›” 22์ผ

DevCamp

๋ชฉ๋ก ๋ณด๊ธฐ
53/85

๐Ÿ” React์—์„œ URLSearchParams ์‚ฌ์šฉํ•˜๊ธฐ

React ๋ฅผ ์‚ฌ์šฉํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š”
URL ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์„ ํ†ตํ•ด ํŽ˜์ด์ง€ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ผ์ด ์žฆ๋‹ค.

์ด๋Ÿด ๋•Œ URLSearchParams๋ฅผ ํ™œ์šฉํ•˜๋ฉด URL ์ฟผ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์‹ฑํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐ŸŒ URLSearchParams๋ž€?

URLSearchParams๋Š” URL ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋‚ด์žฅ ๊ฐ์ฒด์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ URL์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž:

https://example.com/search?keyword=react&page=2

์—ฌ๊ธฐ์„œ ?keyword=react&page=2๋Š” ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์ด๊ณ ,

URLSearchParams๋ฅผ ์ด์šฉํ•˜๋ฉด ํ•ด๋‹น ๊ฐ’์„ ์‰ฝ๊ฒŒ ์ฝ๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ”Ž ์ฟผ๋ฆฌ ์ฝ๊ธฐ

React ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ์ฝ๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

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

function SearchPage() {
  const { search } = useLocation();
  const query = new URLSearchParams(search);

  const keyword = query.get('keyword'); // 'react'
  const page = query.get('page');       // '2'

  return (
    <div>
      <h1>๊ฒ€์ƒ‰์–ด: {keyword}</h1>
      <p>ํŽ˜์ด์ง€: {page}</p>
    </div>
  );
}
  • useLocation()์€ ํ˜„์žฌ URL์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ 
  • search๋Š” ? ํฌํ•จํ•œ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด
  • query.get('key')๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”„ ์ฟผ๋ฆฌ ๋ณ€๊ฒฝํ•˜๊ธฐ

React ์—์„œ๋Š” URLSearchParams๋ฅผ ์กฐ์ž‘ํ•˜๊ณ  navigate๋ฅผ ํ†ตํ•ด URL์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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

  const handleClick = () => {
    const params = new URLSearchParams();
    params.set('keyword', 'react');
    params.set('page', '1');

    navigate(`/search?${params.toString()}`);
  };

  return <button onClick={handleClick}>React ๊ฒ€์ƒ‰ํ•˜๊ธฐ</button>;
}
  • params.set()์œผ๋กœ ์ฟผ๋ฆฌ ๊ฐ’ ์ถ”๊ฐ€/๋ณ€๊ฒฝ
  • params.toString()์œผ๋กœ ์ง๋ ฌํ™”
  • navigate()๋กœ URL ๊ฐฑ์‹ 

๐Ÿงช ์—ฌ๋Ÿฌ ๊ฐ’ ์ฒ˜๋ฆฌํ•˜๊ธฐ

URL์— ๋ฐฐ์—ด ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ์‹ถ๋‹ค๋ฉด ๊ฐ™์€ ํ‚ค๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

const params = new URLSearchParams();
params.append('filter', 'frontend');
params.append('filter', 'backend');

console.log(params.toString());
// filter=frontend&filter=backend

const filters = params.getAll('filter');
// ['frontend', 'backend']

โš ๏ธ ์ฃผ์˜ํ•  ์ 

  • URLSearchParams๋Š” ๋ฌธ์ž์—ด๋งŒ ๋‹ค๋ฃฌ๋‹ค. ์ˆซ์ž, boolean, ๋ฐฐ์—ด์€ ์ง์ ‘ ํ˜•๋ณ€ํ™˜์ด ํ•„์š”ํ•จ
  • ๊ฐ’์ด ์—†์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค โ†’ ||๋‚˜ optional chaining (?.)์œผ๋กœ ์ฒ˜๋ฆฌ

๐Ÿ”จ TIL

  • URLSearchParams๋Š” React์—์„œ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง์„ ์ฝ๊ณ  ์“ฐ๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค.
  • useLocation()๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ URL์˜ ์ฟผ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • URL์„ ๋™์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด useNavigate()์™€ ํ•จ๊ป˜ ์กฐ์ž‘ํ•˜๋ฉด ๋œ๋‹ค.
  • ์—ฌ๋Ÿฌ ๊ฐ’์„ ๊ฐ™์€ ํ‚ค๋กœ ๊ด€๋ฆฌํ•  ๋•Œ๋Š” append()์™€ getAll()์„ ํ™œ์šฉํ•˜์ž.
  • ์ฟผ๋ฆฌ ๊ธฐ๋ฐ˜ ํ•„ํ„ฐ๋ง, ํŽ˜์ด์ง€๋„ค์ด์…˜, ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‹œ ํ•„์ˆ˜ ๋„๊ตฌ๋‹ค!
profile
๋ฐฐ๊ณ ํ”ˆ ๊ฐœ๋ฐœ์ž

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