Router
React μ ν리μΌμ΄μ
μ URLμ κ΄λ¦¬νλ λΌμ΄λΈλ¬λ¦¬
μ μ
React λΌμ°ν°λ React μ ν리μΌμ΄μ
λ΄μμ νμ΄μ§ κ°μ λ€λΉκ²μ΄μ
μ κ΄λ¦¬νλ λΌμ΄λΈλ¬λ¦¬μ
λλ€. μ£Όλ‘ μ±κΈ νμ΄μ§ μ ν리μΌμ΄μ
(Single Page Application, SPA)μμ μ¬μ©λλ©°, URLμ κΈ°λ°μΌλ‘ λ€μν μ»΄ν¬λνΈλ₯Ό λ λλ§νμ¬ μ¬μ©μ κ²½νμ ν₯μμν΅λλ€.
Router λ₯Ό μ¬μ©νλ©΄ URLμ κΈ°λ°μΌλ‘ μ ν리μΌμ΄μ
μ λ λλ§μ μ μ΄ν μ μμ΅λλ€.
μ¬μ©λͺ©μ
React λΌμ°ν°λ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ μμ
μ μνν μ μμ΅λλ€.
β’
μ ν리μΌμ΄μ
μ κ° νμ΄μ§μ λν URLμ μ μν©λλ€.
β’
μ¬μ©μκ° URLμ λ³κ²½ν λ μ ν리μΌμ΄μ
μ λ λλ§μ μ
λ°μ΄νΈν©λλ€.
β’
μ ν리μΌμ΄μ
μ κ° νμ΄μ§μ λν μ‘μΈμ€λ₯Ό μ μ΄ν©λλ€.
μΌλ°μ μΈ νμ΄μ§ μ΄λκ³Ό λΌμ°ν μ μ°¨μ΄
νΉμ§ | μΌλ°μ μΈ νμ΄μ§ μ΄λ | λΌμ°ν
|
HTTP μμ² | μ νμ΄μ§μ HTML, CSS, JavaScript νμΌμ λ€μ΄λ‘λ | κΈ°μ‘΄ νμ΄μ§μ DOMμ μ
λ°μ΄νΈ |
λΈλΌμ°μ μ λ λλ§ | λΈλΌμ°μ μ DOMμ μμ ν μλ‘ λ λλ§ | κΈ°μ‘΄ νμ΄μ§μ DOMμ μ
λ°μ΄νΈ |
μ₯μ | κΈ°μ‘΄ μΉ κ°λ° λ°©μκ³Όμ νΈνμ± | λΈλΌμ°μ μ 리μμ€λ₯Ό μ μ½νκ³ λ‘λ© μλλ₯Ό κ°μ ν μ μμ΅λλ€. |
λ¨μ | μλ‘μ΄ νμ΄μ§λ₯Ό μμ ν μλ‘ λ‘λν΄μΌ νλ κ²½μ°, 리μμ€λ₯Ό λ§μ΄ μλͺ¨ν μ μμ΅λλ€. | λΌμ°ν
μ ꡬννκΈ° μν λΌμ΄λΈλ¬λ¦¬ λλ νλ μμν¬κ° νμν©λλ€. |
μΌλ°μ μΈ νμ΄μ§ μ΄λ
μΌλ°μ μΈ νμ΄μ§ μ΄λμ λΈλΌμ°μ μμ HTTP μμ²μ ν΅ν΄ μλ‘μ΄ νμ΄μ§λ₯Ό λ‘λνλ κ²μ μλ―Έν©λλ€. μ΄ κ²½μ° λΈλΌμ°μ λ μ νμ΄μ§μ HTML, CSS, JavaScript νμΌμ λ€μ΄λ‘λνκ³ , λΈλΌμ°μ μ DOMμ μ νμ΄μ§λ₯Ό λ λλ§ν©λλ€.
λΌμ°ν
λΌμ°ν
μ νμ΄μ§ μ΄λμ λ³΄λ€ ν¨μ¨μ μΌλ‘ μ²λ¦¬νκΈ° μν λ°©λ²μ
λλ€. λΌμ°ν
μ μ¬μ©νλ©΄ λΈλΌμ°μ κ° μλ‘μ΄ νμ΄μ§λ₯Ό μμ ν λ‘λνλ λμ , κΈ°μ‘΄ νμ΄μ§μ DOMμ μ
λ°μ΄νΈνμ¬ μλ‘μ΄ νμ΄μ§λ₯Ό νμν©λλ€.
μ€μΉ
React λΌμ°ν°λ₯Ό μ¬μ©νκΈ° μν΄μλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ€μΉν΄μΌ ν©λλ€.
npm install react-router-dom
JavaScript
볡μ¬
λ¬Έλ²
μ£Όμ ν€μλ
v5 (react-router-dom)
ν€μλ | μ€λͺ
|
BrowserRouter | λΈλΌμ°μ μμ λΌμ°ν
μ νμ±ννλ μ»΄ν¬λνΈ |
Route | URL ν¨ν΄κ³Ό λ λλ§ν μ»΄ν¬λνΈλ₯Ό μ μνλ μ»΄ν¬λνΈ |
Switch | μ¬λ¬Β RouteΒ μ»΄ν¬λνΈλ₯Ό κ·Έλ£Ήννλ μ»΄ν¬λνΈ |
Link | URLμ λ§ν¬νλ μ»΄ν¬λνΈ |
to | LinkΒ μ»΄ν¬λνΈμ μμ±μΌλ‘, μ΄λν κ²½λ‘λ₯Ό μ§μ ν©λλ€. |
exact | RouteΒ μ»΄ν¬λνΈμ μμ±μΌλ‘, κ²½λ‘κ° μ νν μΌμΉν΄μΌλ§ λ λλ§λ©λλ€. |
param, params | RouteΒ μ»΄ν¬λνΈμ μμ±μΌλ‘, URLμ 맀κ°λ³μλ₯Ό μΆκ°ν©λλ€. |
redirect | RouteΒ μ»΄ν¬λνΈμ μμ±μΌλ‘, λ€λ₯Έ URLλ‘ λ¦¬λλ μ
ν©λλ€. |
component | RouteΒ μ»΄ν¬λνΈμ μμ±μΌλ‘, λ λλ§ν μ»΄ν¬λνΈλ₯Ό μ§μ ν©λλ€. |
Hooks
ν€μλ | μ€λͺ
|
withRouter | λΌμ°ν
μ 보λ₯Ό μ¬μ©ν μ μλ Hook |
useHistory | λΈλΌμ°μ μ URLμ μ§μ μ‘°μν μ μλ Hook |
useLocation | νμ¬ URLμ κ°μ Έμ¬ μ μλ Hook |
useParams | URLμ μ§μ λ 맀κ°λ³μλ₯Ό κ°μ Έμ¬ μ μλ Hook |
v6 (react-router-dom)
ν€μλ
ν€μλ | μ€λͺ
|
BrowserRouter | λΈλΌμ°μ μ History APIλ₯Ό μ¬μ©νμ¬ λΌμ°ν
μ κ΄λ¦¬νλ μ»΄ν¬λνΈμ
λλ€. |
HashRouter | λΈλΌμ°μ μ URL ν΄μλ₯Ό μ¬μ©νμ¬ λΌμ°ν
μ κ΄λ¦¬νλ μ»΄ν¬λνΈμ
λλ€. |
Routes | λΌμ°ν
κ·μΉμ μ μνλ μ»΄ν¬λνΈμ
λλ€. |
Route | νΉμ κ²½λ‘μ ν΄λΉνλ μ»΄ν¬λνΈλ₯Ό λ λλ§νλ μ»΄ν¬λνΈμ
λλ€. |
Link | νΉμ κ²½λ‘λ‘ μ΄λνλ λ§ν¬λ₯Ό λ λλ§νλ μ»΄ν¬λνΈμ
λλ€. |
useHistory | History APIλ₯Ό μ¬μ©ν μ μλ ν
μ
λλ€. |
useNavigate | History APIλ₯Ό μ¬μ©νμ¬ νΉμ κ²½λ‘λ‘ μ΄λνλ ν
μ
λλ€. |
useLocation | νμ¬ μμΉ μ 보λ₯Ό κ°μ Έμ¬ μ μλ ν
μ
λλ€. |
useParams | κ²½λ‘ νλΌλ―Έν°λ₯Ό κ°μ Έμ¬ μ μλ ν
μ
λλ€. |
useQuery | 쿼리 μ€νΈλ§μ κ°μ Έμ¬ μ μλ ν
μ
λλ€. |
β’
v5
import React from "react";
import { BrowserRouter, Route, Switch } from "react-router-dom";
function App() {
return (
<BrowserRouter>
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
</Switch>
</BrowserRouter>
);
}
const Home = () => {
return (
<div>
<h1>ννμ΄μ§</h1>
<Link to="/about">μκ°</Link>
</div>
);
};
const About = () => {
return (
<div>
<h1>μκ°</h1>
<Link to="/">ννμ΄μ§</Link>
</div>
);
};
JavaScript
볡μ¬
μ μ½λμμλ BrowserRouter μ»΄ν¬λνΈλ₯Ό μ¬μ©νμ¬ λΈλΌμ°μ μμ λΌμ°ν
μ νμ±νν©λλ€. Switch μ»΄ν¬λνΈλ₯Ό μ¬μ©νμ¬ μ¬λ¬ Route μ»΄ν¬λνΈλ₯Ό κ·Έλ£Ήνν©λλ€. Route μ»΄ν¬λνΈλ URL ν¨ν΄κ³Ό λ λλ§ν μ»΄ν¬λνΈλ₯Ό μ μν©λλ€.
β’
v6
import logo from './logo.svg';
import './App.css';
import { BrowserRouter, Link, Route, Routes } from 'react-router-dom'
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={ <Home /> } />
<Route path="/about" element={ <About /> } />
</Routes>
</BrowserRouter>
);
}
// π /
function Home() {
return (
<>
<h1>Home</h1>
<Link to="/about">About</Link>
</>
)
}
// π /about
function About() {
return (
<>
<h1>About</h1>
<Link to="/">Home</Link>
</>
)
}
export default App;
JavaScript
볡μ¬
BrowserRouter
λΈλΌμ°μ μμ λΌμ°ν
μ νμ±ννλ μ»΄ν¬λνΈ
BrowserRouterλ λΈλΌμ°μ μμ λΌμ°ν
μ νμ±ννλ μ»΄ν¬λνΈμ
λλ€. BrowserRouterλ₯Ό μ¬μ©νλ©΄ React μ ν리μΌμ΄μ
μ URLμ λ³κ²½ν λ μ ν리μΌμ΄μ
μ λ λλ§μ μ
λ°μ΄νΈν μ μμ΅λλ€.
BrowserRouterλ λ€μκ³Ό κ°μ μμ±μ μ 곡ν©λλ€.
β’
basename:Β URLμ κΈ°λ³Έ κ²½λ‘λ₯Ό μ§μ ν©λλ€.
β’
history:Β λΈλΌμ°μ μ URLμ μ‘°μνλ λ° μ¬μ©ν μ μλ History μΈν°νμ΄μ€λ₯Ό μ 곡ν©λλ€.
import React from "react";
import { BrowserRouter, Route, Switch } from "react-router-dom";
function App() {
return (
<BrowserRouter basename="/my-app">
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
</Switch>
</BrowserRouter>
);
}
const Home = () => {
return <h1>ννμ΄μ§</h1>;
};
const About = () => {
return <h1>μκ°</h1>;
};
JavaScript
볡μ¬
http://localhost:3000/my-app/
Plain Text
볡μ¬
Route
URL ν¨ν΄κ³Ό λ λλ§ν μ»΄ν¬λνΈλ₯Ό μ μνλ μ»΄ν¬λνΈ
Routeλ URL ν¨ν΄κ³Ό λ λλ§ν μ»΄ν¬λνΈλ₯Ό μ μνλ μ»΄ν¬λνΈμ
λλ€. Route μ»΄ν¬λνΈλ₯Ό μ¬μ©νμ¬ React μ ν리μΌμ΄μ
μ λΌμ°ν
μ ꡬνν μ μμ΅λλ€.
Route μ»΄ν¬λνΈλ λ€μκ³Ό κ°μ μμ±μ μ 곡ν©λλ€.
β’
path:Β λΌμ°ν
ν URL ν¨ν΄μ
λλ€.
β’
exact:Β κ²½λ‘κ° μ νν μΌμΉν΄μΌλ§ λ λλ§λ©λλ€.
β’
params:Β URLμ 맀κ°λ³μλ₯Ό μΆκ°ν©λλ€.
β’
redirect:Β λ€λ₯Έ URLλ‘ λ¦¬λλ μ
ν©λλ€.
β’
component:Β λ λλ§ν μ»΄ν¬λνΈλ₯Ό μ§μ ν©λλ€.
κΈ°λ³Έ μμ
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
JavaScript
볡μ¬
params μμ± μ¬μ© μμ
β’
β’ paramsΒ μμ±μ μ¬μ©νμ¬Β id 맀κ°λ³μμ κ°μ μ§μ ν©λλ€.
import React, { useState } from "react";
import { BrowserRouter, Route, Switch } from "react-router-dom";
function App() {
return (
<BrowserRouter>
<Switch>
<Route path="/" exact component={Home} />
<Route
path="/boards/:id"
component={Board}
params={{ id: 123 }}
/>
</Switch>
</BrowserRouter>
);
}
const Home = () => {
return <h1>ννμ΄μ§</h1>;
};
const Board = () => {
const { id } = useParams();
return (
<div>
<h2>κ²μλ¬Ό μ‘°ν</h2>
<p>κ²μλ¬Ό ID: {id}</p>
</div>
);
};
JavaScript
볡μ¬
redirect μμ± μ¬μ© μμ
β’ /adminΒ κ²½λ‘λ λ‘κ·ΈμΈνμ§ μμ μ¬μ©μμκ² λ‘κ·ΈμΈ νμ΄μ§λ‘ 리λλ μ
ν©λλ€.
import React, { useState } from "react";
import { BrowserRouter, Route, Switch } from "react-router-dom";
function App() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
return (
<BrowserRouter>
<Switch>
<Route path="/" exact component={Home} />
<Route
path="/admin"
render={() => {
if (isLoggedIn) {
return <Admin />;
} else {
return <Redirect to="/login" />;
}
}}
/>
<Route path="/boards/:id" component={Board} />
<Route path="/boards/:id/delete" redirect="/boards" />
</Switch>
</BrowserRouter>
);
}
const Home = () => {
return <h1>ννμ΄μ§</h1>;
};
const Board = () => {
const { id } = useParams();
return (
<div>
<h2>κ²μλ¬Ό μ‘°ν</h2>
<p>κ²μλ¬Ό ID: {id}</p>
</div>
);
};
const Admin = () => {
return <h1>κ΄λ¦¬μ νμ΄μ§</h1>;
};
JavaScript
볡μ¬
μ κ·μ URL ν¨ν΄ μμ±
path μμ±μ κ²½λ‘μ 맀κ°λ³μκ° ν¬ν¨λλ κ²½μ°, μ κ·μμΌλ‘ ν¨ν΄ 맀νμ ν μ μμ΅λλ€.
<Route path="/κ²½λ‘/:νλΌλ―Έν°[μ κ·μ]" component={μ»΄ν¬λνΈ} />
JavaScript
볡μ¬
μ½λλ /κ²½λ‘ κ²½λ‘μ :νλΌλ―Έν° 맀κ°λ³μκ° ν¬ν¨λ κ²½μ°μλ§ μ»΄ν¬λνΈλ₯Ό λ λλ§ν©λλ€.
μ¬κΈ°μ :νλΌλ―Έν°λ μ κ·μμ΄λ©°, λ€μκ³Ό κ°μ μλ―Έλ₯Ό κ°μ΅λλ€.
β’
:λ 맀κ°λ³μλ₯Ό μλ―Έν©λλ€.
β’
νλΌλ―Έν°λ 맀κ°λ³μμ μ΄λ¦μ
λλ€.
β’
[μ κ·μ]μ 맀κ°λ³μμ κ°μ λν μ κ·μμ
λλ€.
μ΄λ κ² μ λ¬λ :νλΌλ―Έν° λ ν΄λΉ μ»΄ν¬λνΈμμ useParams() ν
μΌλ‘ κ°μ Έμ¬ μ μμ΅λλ€.
const { id } = useParams();
JavaScript
볡μ¬
μμ
<Route path="/boards/:id" component={Board} />
JavaScript
볡μ¬
/boards κ²½λ‘μ 맀κ°λ³μκ° ν¬ν¨λ κ²½μ°μλ§ Board μ»΄ν¬λνΈλ₯Ό λ λλ§ν©λλ€.
μ¬κΈ°μ :idλ μ κ·μμ΄λ©°, λ€μκ³Ό κ°μ μλ―Έλ₯Ό κ°μ΅λλ€.
β’
:λ 맀κ°λ³μλ₯Ό μλ―Έν©λλ€.
β’
idλ 맀κ°λ³μμ μ΄λ¦μ
λλ€.
/boards/:id κ²½λ‘λ λ€μκ³Ό κ°μ URLκ³Ό μΌμΉν©λλ€.
β’
/boards/123
β’
/boards/abc
β’
/boards/hello
:id μ κ·μμ λ€μκ³Ό κ°μ΄ λ€λ₯Έ κ°μΌλ‘ λ³κ²½ν μλ μμ΅λλ€.
β’
:id([0-9]+)λ μ«μλ§ ν¬ν¨λ 맀κ°λ³μλ₯Ό μλ―Έν©λλ€.
β’
:id([a-z]+)λ λ¬Έμλ§ ν¬ν¨λ 맀κ°λ³μλ₯Ό μλ―Έν©λλ€.
β’
:id([a-z0-9]+)λ λ¬Έμμ μ«μλ₯Ό λͺ¨λ ν¬ν¨ν μ μλ 맀κ°λ³μλ₯Ό μλ―Έν©λλ€.
<Route path="/boards/:id([0-9]+)" component={Board} />
JavaScript
볡μ¬
μ μ½λλ /boards κ²½λ‘μ μ«μλ§ ν¬ν¨λ 맀κ°λ³μκ° ν¬ν¨λ κ²½μ°μλ§ Board μ»΄ν¬λνΈλ₯Ό λ λλ§ν©λλ€.
import React, { useState } from "react";
import { BrowserRouter, Route, Switch } from "react-router-dom";
function App() {
return (
<BrowserRouter>
<Switch>
<Route path="/" exact component={Home} />
<Route path="/users/:id)" component={User} />
<Route path="/boards/:id" component={Board} />
</Switch>
</BrowserRouter>
);
}
const Home = () => {
return <h1>ννμ΄μ§</h1>;
};
const User = () => {
const { id } = useParams();
return (
<h1>μ¬μ©μ ID: {id}</h1>
);
};
const Board = () => {
const { id } = useParams();
return (
<h1>κ²μλ¬Ό ID: {id}</h1>
);
};
JavaScript
볡μ¬
Routes (v.6)
μμ Route μ»΄ν¬λνΈ μ€ νλλ§ λ λλ§νλ μ»΄ν¬λνΈ
Routes μ»΄ν¬λνΈμ μμ Route μ»΄ν¬λνΈ μ€ URLκ³Ό μΌμΉνλ Route μ»΄ν¬λνΈλ§ λ λλ§λ©λλ€.
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
JavaScript
볡μ¬
Switch (v.5)
μμ Route μ»΄ν¬λνΈ μ€ νλλ§ λ λλ§νλ μ»΄ν¬λνΈ
Switch μ»΄ν¬λνΈμ μμ Route μ»΄ν¬λνΈ μ€ URLκ³Ό μΌμΉνλ Route μ»΄ν¬λνΈλ§ λ λλ§λ©λλ€.
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
</Switch>
JavaScript
볡μ¬
μν
Switchλ₯Ό μ¬μ©νμ§ μκ³ Route μ¬λ¬ κ°λ₯Ό μ¬μ©νμ¬ λΌμ°ν
μ ꡬννλ κ²½μ°, URLμ΄ μΌμΉνλ λͺ¨λ Route μ»΄ν¬λνΈκ° λ λλ§λ©λλ€. μλ₯Ό λ€μ΄, λ€μκ³Ό κ°μ μ½λλ / κ²½λ‘μ /about κ²½λ‘μ ν΄λΉνλ Route μ»΄ν¬λνΈλ₯Ό λͺ¨λ λ λλ§ν©λλ€.
β’
<Switch> μ»΄ν¬λνΈλ₯Ό μ¬μ©ν κ²½μ°
import React, { useState } from "react";
import { BrowserRouter, Route, Switch } from "react-router-dom";
function App() {
return (
<BrowserRouter>
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
</Switch>
</BrowserRouter>
);
}
const Home = () => {
return <h1>ννμ΄μ§</h1>;
};
const About = () => {
return <h1>μκ°</h1>;
};
JavaScript
볡μ¬
β’
URL : /
ννμ΄μ§
Plain Text
볡μ¬
β’
URL : /about
μκ°
Plain Text
볡μ¬
β’
<Switch> μ»΄ν¬λνΈλ₯Ό μ¬μ©νμ§ μμ κ²½μ°
import React, { useState } from "react";
import { BrowserRouter, Route } from "react-router-dom";
function App() {
return (
<BrowserRouter>
<Route path="/" component={Home} />
<Route path="/about" component={About} />
</BrowserRouter>
);
}
const Home = () => {
return <h1>ννμ΄μ§</h1>;
};
const About = () => {
return <h1>μκ°</h1>;
};
JavaScript
볡μ¬
β’
URL : /
ννμ΄μ§
μκ°
Plain Text
볡μ¬
β’
URL : /about
μκ°
Plain Text
볡μ¬