minstudio

React Router: SPA(싱글 페이지 애플리케이션) 라우팅 구현

SPA와 React Router DOM

리액트는 하나의 빈 HTML 페이지를 로드한 뒤 자바스크립트로 화면을 갈아끼우는 SPA(Single Page Application) 방식을 사용합니다. 브라우저가 실제로 새 페이지를 요청하지 않으므로 화면 깜빡임이 없고 매우 빠릅니다.

🌐 전통적 방식(MPA) vs React의 방식(SPA) 전통적 웹 (MPA) Page 1 새로고침 발생 (서버 통신) Page 2 상태(State) 완전 초기화 ❌ React 라우팅 (SPA) Component A 빠른 교체 (JS 가로채기) Component B 상태(State) 그대로 유지 ⚡️
🚨 <a> 태그의 치명적 단점
HTML의 기본 <a href="..."> 태그를 사용하면 브라우저가 페이지를 완전히 새로고침합니다. 이 경우 메모리에 저장되어 있던 리액트의 모든 State(상태값)가 날아가버리므로 절대 사용해서는 안 됩니다.
💡 <Link> vs useNavigate()
<Link>는 사용자가 명시적으로 클릭하는 메뉴바나 네비게이션에 사용합니다. 반면 useNavigate()는 '로그인 버튼 클릭 후 성공하면 메인으로 이동'과 같이 프로그래밍 방식(특정 로직 내부)에서 주소를 이동할 때 씁니다.

하지만 사용자는 주소(URL)에 따라 다른 화면을 보고 싶어 하고, 뒤로가기 버튼도 작동해야 합니다. 이를 구현하기 위해 브라우저의 History API를 가로채어 가짜 페이지 이동을 구현하는 표준 라이브러리가 바로 react-router-dom입니다.

핵심 컴포넌트

  • BrowserRouter: 최상위를 감싸 라우팅 환경을 활성화합니다.
  • Routes / Route: URL 경로(path)에 따라 보여줄 컴포넌트(element)를 매핑합니다.
  • Link: HTML의 <a> 태그를 대체합니다. 페이지 새로고침 없이 URL만 변경합니다.
Terminal
bash - Terminal
npm install react-router-dom
import { MemoryRouter as Router, Routes, Route, Link } from 'react-router-dom';
import Home from './Home';
import ProductDetail from './ProductDetail';

export default function App() {
  const linkStyle = { color: '#2563eb', textDecoration: 'underline', fontWeight: 'bold' };

  return (
    // 실습 환경(iframe)에서는 BrowserRouter 대신 MemoryRouter를 사용합니다.
    <Router>
      <nav style={{ padding: '1rem', background: '#f1f5f9', display: 'flex', gap: '1.5rem', borderRadius: '8px', border: '1px solid #e2e8f0' }}>
        {/* a 태그 대신 Link 컴포넌트 사용 */}
        <Link to="/" style={linkStyle}>홈</Link>
        <Link to="/product/123" style={linkStyle}>123번 상품보기</Link>
        <Link to="/product/999" style={linkStyle}>999번 상품보기</Link>
      </nav>

      <div style={{ padding: '2rem' }}>
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/product/:id" element={<ProductDetail />} />
          <Route path="*" element={<h2>404 Not Found</h2>} />
        </Routes>
      </div>
    </Router>
  );
}
실행 결과
React Router: SPA(싱글 페이지 애플리케이션) 라우팅 구현 | Minstudio