
import { BrowserRouter } from "react-router-dom";
<BrowserRouter>
<App />
</BrowserRouter>
import { HashRouter } from "react-router-dom";
<HashRouter>
<App />
</HashRouter>
서버에서 주소를 옮기지 못할때 주로 사용한다 아래는 그 예시입니다서버 설정에 제한이 있을 때
• 정적 호스팅 서비스(예: GitHub Pages, S3)에서 React 앱을 배포할 때 유용합니다.
• 이 경우, 서버가 URL 경로를 인식하지 못하므로 Browser Router 대신 Hash Router를 사용해야 정상 작동합니다.
단순한 프로젝트를 빠르게 배포할 때
• 초기 프로젝트나 간단한 SPA(Single Page Application)를 개발할 때, 서버 설정 없이 빠르게 배포할 수 있습니다.
SEO(Search Engine Optimization)가 중요하지 않을 때
• Hash Router를 사용하면 검색 엔진이 # 이후의 내용을 제대로 인식하지 못하므로 SEO에는 적합하지 않습니다.
• 하지만 SEO가 필요 없는 내부 관리 도구나 대시보드 프로젝트라면 큰 문제가 없습니다.
1) /profile/userIDx (Browser Router)
• 브라우저는 URL 전체를 서버로 요청합니다.
브라우저가 /profile/userIDx를 서버에 요청.
서버는 /profile/userIDx 요청을 처리해야 합니다.
• 서버 설정 필요: 이 경로를 React 앱의 index.html로 리다이렉트하도록 설정.
• 서버 설정이 없다면, 404 Not Found 오류 발생.
React 앱이 실행되면 Browser Router가 경로(/profile/userIDx)를 보고 렌더링할 컴포넌트를 결정.
• 장점:
• URL이 깔끔하고, SEO(검색 엔진 최적화)가 가능.
• 단점:
• 서버 설정이 필요함. (모든 경로를 React 앱으로 리다이렉트해야 함.)
2) /profile/#/userIDx (Hash Router)
• 브라우저는 # 이전 부분만 서버로 요청합니다.
브라우저가 /profile만 서버에 요청.
서버는 항상 index.html 파일을 반환.
React 앱의 Hash Router가 #/userIDx를 읽고, 렌더링할 컴포넌트를 결정.
• 장점:
• 서버 설정이 필요 없음. (정적 HTML 파일만 제공하면 동작.)
• GitHub Pages, AWS S3 등 정적 호스팅에서도 문제 없이 작동.
• 단점:
• URL이 #를 포함해 다소 덜 깔끔.
• SEO(검색 엔진 최적화)가 되지 않음. 검색 엔진은 # 이후 내용을 무시함.
import { MemoryRouter } from "react-router-dom";
<MemoryRouter initialEntries={['/home']} initialIndex={0}>
<App />
</MemoryRouter>
2.1 Routes
import { Routes, Route } from "react-router-dom";
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
2.2 Route
<Route path="/profile/:userId" element={<Profile />} />
Routes 를 이용하면 계층 라우팅을 할 수 있습니다.
계층라우팅이란 ? → React Router에서 라우트(경로)를 계층 구조로 설계하는 방법으로, 중첩된 페이지 구조를 URL 경로와 매핑하여 구현
import { Routes, Route, Outlet } from 'react-router-dom';
const App = () => {
return (
<Routes>
{/* 부모 라우트 */}
<Route path="/" element={<Layout />}>
{/* 자식 라우트 */}
<Route path="about" element={<About />} />
<Route path="contact" element={<Contact />} />
</Route>
</Routes>
);
};
const Layout = () => (
<div>
<h1>공통 레이아웃</h1>
{/* 자식 라우트를 렌더링할 위치 */}
<Outlet />
</div>
);
const About = () => <div>About Page</div>;
const Contact = () => <div>Contact Page</div>;
위와 같이 layout을 만들어서 중첩 시켜 자식요소로 쓸 수 있습니다.
굳이 사용하자면 아래와 같이 pc 모바일 버전을 만들때 사용할 수 있을것 같기도 합니다.
app에서 page/index.js 를 import 하고 page/index.js 의 style을 설정하는게 더 좋아보이긴합니다.
import { Routes, Route } from "react-router-dom";
import Layout from "./Layout";
import Home from "./Home";
import About from "./About";
const App = () => {
return (
<Routes>
{/* Layout에서 PC/Mobile 구분 */}
<Route path="/*" element={<Layout />}>
{/* 하위 라우트 정의 */}
<Route path="home" element={<Home />} />
<Route path="about" element={<About />} />
</Route>
</Routes>
);
};
export default App;
3.1 useNavigate
• 프로그래밍적으로 경로를 변경.
import { useNavigate } from "react-router-dom";
const Component = () => {
const navigate = useNavigate();
const goToHome = () => navigate("/");
const goBack = () => navigate(-1);
return <button onClick={goToHome}>홈으로 이동</button>;
};
useNavigate는 React Router에서 제공하는 프로그램적 라우팅을 위한 훅(Hook)입니다.
React Router의 라우팅 시스템을 통해 페이지를 리로드하지 않고 컴포넌트를 전환할 수 있습니다.
특징
• 브라우저가 페이지를 리로드하지 않고, React가 라우팅을 처리하여 컴포넌트를 전환.
• 현재 React 상태가 유지되며, 페이지 이동 시 전체 앱 상태가 초기화되지 않음.
• 이벤트 핸들러 내에서 조건에 따라 동적으로 경로를 이동할 수 있음.
• 페이지 전환 시 애니메이션 효과 등을 쉽게 추가 가능.
위와 같은 특징은 a태그와의 차이가 있습니다.

3.2 Link
• 네비게이션을 위한 링크 컴포넌트.
• 브라우저 새로고침 없이 경로를 변경.
import { Link } from "react-router-dom";
<Link to="/about">소개</Link>
3.3 NavLink
• Link와 유사하지만, 활성 상태를 표시할 수 있는 컴포넌트.
import { NavLink } from "react-router-dom";
<NavLink to="/about" activeClassName="active">
소개
</NavLink>

useNavigate
→ 조건부 경로 이동이 필요할 때.
→ 버튼 클릭이나 특정 이벤트에서 경로를 동적으로 전환할 때.
Link
→ 네비게이션 바처럼 정적인 경로 이동이 필요할 때.
NavLink
→ 활성화된 경로를 표시해야 할 때.
→ 예 네비게이션에서 현재 활성화된 페이지를 강조.
4.1 useParams
• 동적 경로(:id)의 파라미터 값을 추출.
import { useParams } from "react-router-dom";
const Profile = () => {
const { userId } = useParams();
return <div>사용자 ID: {userId}</div>;
};
4.2 useSearchParams
• URL 쿼리 문자열을 읽거나 수정.
import { useSearchParams } from "react-router-dom";
const Search = () => {
const [searchParams, setSearchParams] = useSearchParams();
const query = searchParams.get("query");
return (
<div>
<p>검색어: {query}</p>
<button onClick={() => setSearchParams({ query: "react" })}>React 검색</button>
</div>
);
};
4.3 useLocation
• 현재 URL 정보(pathname, search, hash 등)를 반환.
→ pathname : URL의 경로 부분 순수 url
→ search : URL의 쿼리 문자열(Query String)
→ hash : #로 시작하며, 보통 페이지 내 특정 위치로 스크롤하거나 앵커 링크 역할
import { useLocation } from "react-router-dom";
const CurrentLocation = () => {
const location = useLocation();
return <p>현재 경로: {location.pathname}</p>;
};
4.4 useMatch
• 특정 경로와 현재 URL이 일치하는지 확인.
import { useMatch } from "react-router-dom";
const MatchExample = () => {
const match = useMatch("/about");
return <div>{match ? "About 페이지입니다." : "다른 페이지입니다."}</div>;
};
5.1 Navigate
• 특정 조건에서 경로를 리다이렉트.
import { Navigate } from "react-router-dom";
const ProtectedPage = ({ isLoggedIn }) => {
return isLoggedIn ? <Dashboard /> : <Navigate to="/login" />;
};
→ Link태그의 trigger는 클릭
→ Navigate는 그 컴포넌트 렌더링 자체가 리다이렉션으로 간다
6.1 Outlet
• 중첩 라우트에서 하위 경로의 컴포넌트를 렌더링.
→ 자리 표시자(placeholder)” 역할
→ children 같은 역할을 합니다
const Dashboard = () => {
return (
<div>
<h1>대시보드</h1>
<Outlet />
</div>
);
};
6.2 useRoutes
• 객체 기반 라우트 설정.
import { useRoutes } from "react-router-dom";
const routes = [
{ path: "/", element: <Home /> },
{ path: "/about", element: <About /> },
];
const App = () => {
const routing = useRoutes(routes);
return routing;
};
react-router-dom 에서 가장 중요한 부분은 url을 state화 해서 쿼리,패스 파라미터의 값이 변하더라도 리로드 되지 않도록 최적화 해서 성능과 유저 편의를 높이는데 의의가 있다고 생각합니다.
SPA 의 핵심 !!
여기서 중요한점은 도메인이 변하면 reload를 피할 수 는 없다는 것입니다
패스 , 쿼리의 값은 상태화해서 변화를 감지 가능하지만 도메인이 변하면 reload는 필수적입니다.
• URL을 상태로 관리하고 React의 Virtual DOM을 활용해 파라미터를 최적화한다는 점을 기억해야 한다고 생각합니다.
React Router DOM은 단순히 조건부 렌더링을 구현하는 도구가 아니라, 최적화 기법의 하나라는 점을 인지하고, 다양한 함수들의 사용법을 익히는 것이 중요하다고 느낍니다.