프로그래밍/ReactJS

React Router: URL 매개변수와 쿼리 문자열로 동적 웹 경험을 구축하는 비법 ✨

shimdh 2025. 9. 26. 14:29
728x90

웹 개발에서 사용자 경험은 곧 내비게이션의 품질에 달려 있습니다. 특히 React와 같은 라이브러리로 단일 페이지 애플리케이션(SPA) 을 구축할 때는 페이지 새로고침 없이도 사용자가 원하는 정보로 매끄럽게 이동할 수 있도록 하는 것이 핵심이죠. 이 모든 것을 가능하게 하는 마법 같은 도구가 바로 'React Router'입니다.

오늘은 React Router의 핵심 기능인 URL 매개변수쿼리 문자열을 깊이 있게 탐구하며, 어떻게 이를 활용하여 더욱 풍부하고 동적인 사용자 경험을 제공할 수 있는지 알아보겠습니다.


React Router, 왜 필요한가?

React Router는 React 애플리케이션에 동적인 라우팅 기능을 부여하여 사용자가 페이지를 새로고침할 필요 없이 다양한 뷰 사이를 자유롭게 넘나들 수 있도록 돕습니다. 이는 전통적인 다중 페이지 애플리케이션(MPA) 방식에서 벗어나, 더욱 빠르고 효율적인 사용자 인터페이스를 구현하는 데 필수적인 요소입니다. 웹 개발에서 내비게이션은 사용자가 정보를 탐색하고 서비스와 상호작용하는 통로이므로, 이를 효과적으로 관리하는 것은 애플리케이션의 성공을 좌우하는 중요한 부분입니다.


URL 매개변수: 특정 리소스 식별의 열쇠 🔑

URL 매개변수(URL Parameters) 는 URL의 특정 부분에 데이터를 포함시켜 한 경로에서 다른 경로로 정보를 전달하는 강력한 방법입니다. 주로 애플리케이션 내에서 고유한 리소스나 항목을 식별할 때 사용됩니다.

어떻게 활용될까?

가장 흔한 예시는 전자상거래 사이트에서 특정 제품의 상세 페이지를 보여줄 때입니다. 예를 들어, https://example.com/products/123과 같은 URL에서 '123'은 제품 ID를 나타냅니다. React Router에서는 useParams 훅을 사용하여 이 매개변수에 손쉽게 접근할 수 있습니다.

실제 예시를 통해 이해하기

  1. 경로 설정: 메인 애플리케이션 파일에서 다음과 같이 경로를 설정합니다.

    import { BrowserRouter as Router, Route } from 'react-router-dom';
    import ProductDetail from './ProductDetail';
    
    function App() {
      return (
        <Router>
          {/* :id 는 URL 매개변수를 의미합니다. */}
          <Route path="/products/:id" component={ProductDetail} />
        </Router>
      );
    }

    여기서 :/id/products/ 다음에 오는 모든 세그먼트를 id라는 매개변수로 캡처하여 ProductDetail 컴포넌트로 전달하겠다는 의미입니다.

  2. 매개변수 추출: ProductDetail 컴포넌트에서는 useParams 훅을 사용하여 id 값을 가져옵니다.

    import { useParams } from 'react-router-dom';
    
    function ProductDetail() {
      const { id } = useParams(); // URL에서 :id에 해당하는 값을 추출
    
      return (
        <div>
          <h1>제품 상세 정보</h1>
          <p>ID: {id}인 제품을 보고 있습니다</p>
        </div>
      );
    }

    사용자가 /products/123으로 이동하면 "ID: 123인 제품을 보고 있습니다"라는 메시지가 표시됩니다. 이는 매개변수를 통해 콘텐츠를 동적으로 로드하는 매우 효율적인 방법입니다.


쿼리 문자열: 유연한 정보 전달의 보고 📝

쿼리 문자열(Query String) 은 URL 매개변수와 마찬가지로 URL을 통해 추가 정보를 전달하는 방법이지만, 여러 값을 동시에 담을 수 있고 엄격한 형식 규칙이 없어 훨씬 유연합니다. URL에서 물음표('?') 뒤에 시작하며, 앰퍼샌트('&')로 구분된 '키-값' 쌍으로 구성됩니다.

어떻게 활용될까?

검색 결과 페이지에서 필터링 옵션이나 페이지네이션 정보를 전달할 때 유용하게 사용됩니다. 예를 들어, https://example.com/search?query=laptop&page=2와 같은 URL에서 'query'와 'page'는 각각 "laptop"과 "2"라는 값을 가진 키입니다.

React Router에서 쿼리 문자열에 접근하려면 useLocation 훅과 JavaScript의 내장 객체인 URLSearchParams 를 함께 사용합니다.

실제 예시를 통해 이해하기

  1. 검색 경로 설정: 검색 결과를 표시할 경로를 설정합니다.

    import { BrowserRouter as Router, Route } from 'react-router-dom';
    import SearchResults from './SearchResults';
    
    function App() {
      return (
        <Router>
          {/* 쿼리 문자열은 경로 설정 시 별도로 명시하지 않아도 됩니다. */}
          <Route path="/search" component={SearchResults} />
        </Router>
      );
    }

    이 경로는 /search로의 접근을 처리하며, 쿼리 문자열에 포함된 추가 필터링이나 검색 기준은 SearchResults 컴포넌트 내에서 파싱됩니다.

  2. 쿼리 매개변수 추출: SearchResults 컴포넌트에서 useLocation 훅을 사용하여 쿼리 매개변수를 추출합니다.

    import { useLocation } from 'react-router-dom';
    
    function SearchResults() {
      const location = useLocation();
    
      // location.search는 "?query=laptop&page=2"와 같은 문자열을 포함합니다.
      const getQueryParams = () => {
        // URLSearchParams를 사용해 키-값 쌍을 쉽게 다룹니다.
        return new URLSearchParams(location.search); 
      };
    
      const query = getQueryParams().get('query'); // 'query' 키의 값 검색
    
      return (
        <div>
          <h1>검색 결과</h1>
          <p>"{query}"를 검색했습니다</p>
        </div>
      );
    }

    사용자가 /search?query=laptop&page=2로 이동하면 페이지에 "검색 결과"와 함께 "laptop"이 표시됩니다. 이는 사용자의 검색 의도를 반영하여 맞춤형 결과를 제공할 수 있게 합니다.


요약: 사용자 경험을 극대화하는 React Router의 힘 💪

URL 매개변수와 쿼리 문자열을 이해하고 활용하는 것은 React 애플리케이션의 내비게이션 기능을 크게 향상시키는 중요한 단계입니다. React Router가 제공하는 이러한 강력한 기능을 통해 개발자는 다음과 같은 이점을 얻을 수 있습니다.

  • 동적 경로 생성: 사용자 입력에 따라 반응하는 유연한 경로를 만들 수 있습니다.
  • 효과적인 데이터 흐름: 컴포넌트 간의 데이터 전달을 더욱 체계적으로 구성할 수 있습니다.
  • 상호작용성 및 반응성 향상: 애플리케이션이 사용자 요구에 더욱 민감하게 반응하며 상호작용적인 경험을 제공합니다.

이러한 도구들은 사용자가 애플리케이션 내에서의 상호작용을 기반으로 항상 관련 정보에 접근할 수 있도록 보장하면서, 끊김 없는 경험을 제공하는 데 크게 기여합니다. 단순히 페이지를 이동하는 것을 넘어, 사용자에게 맞춤형이고 의미 있는 콘텐츠를 제공하는 데 필수적인 요소임을 잊지 마세요!

728x90