์น์ฌ์ดํธ๋ผ๋ฉด ์ด๋ ํ ๊ฒฝ๋ก์ ๋ํด ํ์ ๊ฒฝ๋ก๋ค์ ํ์ ํ์ด์ง๋ฅผ ์ฌ๋ฌ๊ฐ๋ก ๋ถ๊ธฐ์์ผ์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์๋ค.
์๋ฅผ ๋ค๋ฉด ์ด๋ ํ ํ์ด์ง(๊ฒฝ๋ก)์ ๋ค์ด๊ฐ๋๋ฐ ๊ฑฐ๊ธฐ์ ๋ ๋ค๋ฅธ ๋งํฌ๊ฐ ์๊ณ , ๊ทธ ๋งํฌ๋ฅผ ๋๋ฅด๋ฉด ํด๋น ํ์ด์ง ๋ด์์ ๋ ๋ค๋ฅธ ๋ทฐ๋ฅผ ๋ณผ ์ ์๋ ๊ฒฝ์ฐ์ด๋ค.
์ด๋ ๊ฒ ๊ฐ์ ๊ฒฝ๋ก ๋ด์์ ํ์ ๊ฒฝ๋ก๋ค์ ๋ผ์ฐํ ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ค์ฒฉ ๋ผ์ฐํ ์ด๋ผ๊ณ ํ๋๋ฐ react router dom ์ผ๋ก ์ค์ฒฉ ๋ผ์ฐํ ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์.
home, topics, login ๋งํฌ๋ง๋ค ๊ฐ๊ฐ ์ ๋ชฉ๊ณผ ์ ๋ชฉ + page๋ผ๋ ๋ณธ๋ฌธ ๋ด์ฉ์ด ๋จ๋ ํ์ฐฎ์ ์ฌ์ดํธ๋ค.
home๊ณผ login์ ๋ค์ด๊ฐ๋ฉด ์ ๋ชฉ๊ณผ ๋ณธ๋ฌธ๋ง ๋์ค์ง๋ง topics๋ ์ ๋ชฉ, ๋ณธ๋ฌธ๊ณผ topic1, topic2, topic3 ๋งํฌ๊ฐ ๋์จ๋ค.
topics ์ปดํฌ๋ํธ์์ ํ์ ๊ฒฝ๋ก์ธ topic1, topic2, topic3 ์ ์ค์ฒฉ๋ผ์ฐํ ์ฒ๋ฆฌ๋ฅผ ํด์คฌ๊ธฐ ๋๋ฌธ์ topic1, 2, 3 ๋งํฌ๋ฅผ ๋๋ฅด๋ฉด topic/1, topic/2, topic/3 ์ด๋ผ๋ ๊ฒฝ๋ก์ ์์ฒญ์ด ๊ฐ๊ณ ๊ทธ ์์ฒญ์ ์๋ตํ ์ ์๊ฒ ๋๋ค.
์ด ์์๋ก ์ค์ฒฉ๋ผ์ฐํ ์ ์ดํด๋ณด์
// App.js
function App() {
return (
<BrowserRouter>
<div>
<ul>
<li><Link to="/home">home</Link></li>
<li><Link to="/topics">topics</Link></li>
<li><Link to="/login">login</Link></li>
</ul>
<Routes>
<Route path="/home" element={<Home />} />
<Route path="/topics/*" element={<Topics />} />
<Route path="/login" element={<Login />} />
</Routes>
</div>
</BrowserRouter>
)
}
์ ์ฒด ํ์ด์ง์ ํด๋นํ๋ App ์ปดํฌ๋ํธ์ด๋ค. home, topics, login ๋งํฌ๋ฅผ ๋ฐฐ์นํ๊ณ ๊ฐ ๋งํฌ์ ๊ฒฝ๋ก๋ฅผ ๋ด๋นํ๋ ๋ผ์ฐํฐ๋ฅผ ์ถ๊ฐํ๋ค.
์ฌ๊ธฐ์ topics ๊ฒฝ๋ก ๋ผ์ฐํฐ์ path๊ฐ /topics๊ฐ ์๋๋ผ /topics/* ์ธ๊ฒ์ ์ฃผ์ํ๊ณ Topics ์ปดํฌ๋ํธ๋ฅผ ์ดํด๋ณด์.
// Topics.js
export default function Topics() {
return (
<div>
<h2>Topics</h2>
<p>Topics Page</p>
<hr />
<ul>
<li><Link to="/topics/1">topic1</Link></li>
<li><Link to="/topics/2">topic2</Link></li>
<li><Link to="/topics/3">topic3</Link></li>
</ul>
<Routes>
<Route exact path=":tid" element={<Topic />} />
</Routes>
</div>
);
}
Topics ์ปดํฌ๋ํธ๋ ๋ง์ฐฌ๊ฐ์ง๋ก topic1, topic2, topic3 ๋งํฌ๊ฐ ์๊ณ ๊ฐ ๊ฒฝ๋ก๋ฅผ ๋ด๋นํ๋ ๋ผ์ฐํฐ๊ฐ ์๋๋ฐ ๋ผ์ฐํฐ๊ฐ :tid ๋ผ๋ path name ํ๋๋ง ์กด์ฌํ๋ค.
๊ธฐ์กด์ ์๊ณ ์๋ ๋ผ์ฐํ ๋ฐฉ๋ฒ๋๋ก ๋จ์ํ ์๊ฐํ์๋ฉด
<Routes>
<Route exact path="/topics/1" element={<Topic1 />} />
<Route exact path="/topics/2" element={<Topic2 />} />
<Route exact path="/topics/3" element={<Topic3 />} />
</Routes>
์ด๋ฐ์์ผ๋ก topic1, topic2, topic3์ ํด๋นํ๋ ๊ฒฝ๋ก๋ง๋ค ๊ฐ๊ฐ ๋ผ์ฐํฐ๊ฐ ์กด์ฌํด์ผํ ๊ฒ ๊ฐ์๋ฐ ๋ง์ด๋ค.
๋ฌผ๋ก ์ด๊ฒ๋ ๋ง๊ธด ๋ง๋ค. ํ์ง๋ง ์ง๊ธ์ topic์ด 1, 2, 3์ผ๋ก 3๊ฐ๋๊น ๋ณ ์๊ด์์ง๋ง topic์ ์๊ฐ ๊ต์ฅํ ๋ง๋ค๋ฉด ๊ทธ๊ฒ๋ค์ ๋ผ์ฐํฐ๋ฅผ ํ๋ํ๋ ๋ค ์์ฑํ๋๊ฑด ์๊ฐ๋งํด๋ ํ๊ธฐ์ฆ์ด ๋๋ค.
๊ฒฝ๋ก์์ ๋ค๋ฅธ ๋ถ๋ถ์ /topics ๋ค์ ์ค๋ ์ซ์๋ฐ์ ์๋๋ฐ ์ด๊ฑธ ํ๋ํ๋ ๋ค ์ง์ ํ๋๊ฑด ๊ต์ฅํ ๋นํจ์จ์ ์ด๋ค.
์ด๋ฐ ๋ถ๋ถ์ ํด๊ฒฐํ๊ณ ์ ์ฌ์ฉํ๋๊ฒ Parameter ๋ผ๋ ๊ฐ๋ ์ด๋ค. Parameter๋ url ์์์์ ๋ณ์๊ฐ์๊ฑฐ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
/topics/1, /topics/2, /topics/3 ๋ฑ๋ฑ. ์ฌ๊ธฐ์ ๋ฐ๋๋๊ฑด /topics ๋ค์ ์ซ์์ด๋ค. ์ด ์ซ์๋ฅผ ๋ง์น ํจ์์ ๋งค๊ฐ๋ณ์์ฒ๋ผ ๋ณ์ํ์์ผ์ ๋๊ฒจ์ฃผ๋ฉด ์ข์ง ์์๊น! ์ถ์๊ฑฐ๋ค.
๊ทธ ๋ณ์์ฒ๋ฆฌ ํด์ฃผ๊ณ ์ถ์ ๋ถ๋ถ์ < ์ฝ๋ก (:) + ๋ณ์๋ช > ์ ํ์์ผ๋ก url์ ์์ฑํ๋ฉด ์ด ๋ถ๋ถ์ด ํ๋ผ๋ฏธํฐ๊ฐ ๋๋ค.
๊ทธ๋์ ๋ณ์๋ช ์ tid๋ผ๊ณ ํ๋ค๋ฉด, path="/topics/:tid" ๋ผ๊ณ ํ๋ฉด ์์ฒญ ๊ฒฝ๋ก๊ฐ /topics/1 ์ผ๋๋ tid = 1์ด ๋๊ณ , /topics/2 ์ด๋ฉด tid = 2๊ฐ ๋๋๊ฒ์ด๋ค. ๋๋ฌธ์ /topics/1, /topics/2, ... ์ ๊ฐ์ ๊ฒฝ๋ก์ ์์ฒญ๋ค์ /topics/:tid ๋ผ๋ ๊ฒฝ๋ก์ ๋ผ์ฐํฐ ํ๋๋ก ๋ด๋นํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ํ๋ผ๋ฏธํฐ ๋ณ์๋ฅผ useParams ๋ผ๋ ํ ์ ์ด์ฉํด ์ ๊ทผํ์ฌ ์ฝ๋์์ ํ์ฉํ ์ ์๋ค.
๊ทผ๋ฐ ์์ ์์์ฝ๋์์๋ path๋ฅผ /topics/:tid ๊ฐ ์๋๋ผ :tid ๋ผ๊ณ ํด๋จ๋ค.
์ด๋ react-router-dom์ด v6๋ก ์ ๋ฐ์ดํธ๋๋ฉด์ ๋ฐ๋ ์ฌํญ์ธ๋ฐ, ์๋๋ ์์ ๊ฒฝ๋ก์ ๋ผ์ฐํฐ(์ด ์์์์๋ App ์ปดํฌ๋ํธ์ /topics ๋ผ์ฐํฐ)์์๋ ๊ทธ๋ฅ path๋ฅผ /topics๋ก ํด๋๊ณ ํ์ ๊ฒฝ๋ก์ ๋ผ์ฐํฐ์์ /topics/:tid ๋ผ๊ณ ํ๋ฉด ๋๋ค.
ํ์ง๋ง ์ด์ ๋ ์์ ๊ฒฝ๋ก์ ๋ผ์ฐํฐ์์ ๊ฒฝ๋ก์ ๋ง์ง๋ง์ * ์ ๋ช ์ํ๊ณ ํ์ ๊ฒฝ๋ก์ ๋ผ์ฐํฐ์์๋ ํ๋ผ๋ฏธํฐ๊ฐ๋ง ์ ์ผ๋ฉด ๋๋ค.
v5 ๊น์ง์ ๋ฐฉ์
// App.js
function App() {
return (
<BrowserRouter>
<div>
<ul>
<li><Link to="/home">home</Link></li>
<li><Link to="/topics">topics</Link></li>
<li><Link to="/login">login</Link></li>
</ul>
<Routes>
<Route path="/home" element={<Home />} />
<Route path="/topics" element={<Topics />} />
<Route path="/login" element={<Login />} />
</Routes>
</div>
</BrowserRouter>
)
}
// Topics.js
export default function Topics() {
return (
<div>
<h2>Topics</h2>
<p>Topics Page</p>
<hr />
<ul>
<li><Link to="/topics/1">topic1</Link></li>
<li><Link to="/topics/2">topic2</Link></li>
<li><Link to="/topics/3">topic3</Link></li>
</ul>
<Routes>
<Route exact path="/topics/:tid" element={<Topic />} />
</Routes>
</div>
);
}
๊ธฐ์กด์๋ /topics ๊ฒฝ๋ก ๋ผ์ฐํ ํด๋๊ณ /topics ๊ฒฝ๋ก ํ์ ํ๋ผ๋ฏธํฐ๋ /topics/:tid ์ ๊ฐ์ด ํ์ ์ปดํฌ๋ํธ์์ full ๊ฒฝ๋ก๋ฅผ ์ง์ ํด์ฃผ๋ฉด ๋์๋ค.
v6 ๋ฐฉ์
// App.js
function App() {
return (
<BrowserRouter>
<div>
<ul>
<li><Link to="/home">home</Link></li>
<li><Link to="/topics">topics</Link></li>
<li><Link to="/login">login</Link></li>
</ul>
<Routes>
<Route path="/home" element={<Home />} />
<Route path="/topics/*" element={<Topics />} />
<Route path="/login" element={<Login />} />
</Routes>
</div>
</BrowserRouter>
)
}
// Topics.js
export default function Topics() {
return (
<div>
<h2>Topics</h2>
<p>Topics Page</p>
<hr />
<ul>
<li><Link to="/topics/1">topic1</Link></li>
<li><Link to="/topics/2">topic2</Link></li>
<li><Link to="/topics/3">topic3</Link></li>
</ul>
<Routes>
<Route exact path=":tid" element={<Topic />} />
</Routes>
</div>
);
}
ํ์ง๋ง v6๋ถํฐ๋ ์์ ๊ฒฝ๋ก์์ /topics ๋ค์ * ๋ฅผ ๋ถ์ฌ์ค์ผ ํ๋ค.
/topics/* ๋ผ๊ณ ํ๋ฉด /topics ๋ค์ ์ด๋ค ๊ฒฝ๋ก๊ฐ ์ค๋ ๋ค ๋ฐ๊ฒ ๋ค๋ผ๋ ์๋ฏธ๊ฐ ๋๋ ๋ค์ ํ๋ผ๋ฏธํฐ๊ฐ ์ค๋ ๊ฒฝ์ฐ์ ๊ทธ๊ฒ์ ๋ฐ๊ธฐ์ํด ์จ์ค์ผ๋๋ ๊ฑฐ ๊ฐ๋ค.
์ ๋ ๊ฒ ํด๋๊ณ ํ์ ๊ฒฝ๋ก ๋ถ๋ถ์์๋ ๊ทธ๋ฅ ํ๋ผ๋ฏธํฐ๋ง ์ฐ๋ฉด ๋๋ค.
ํ๋ผ๋ฏธํฐ๊ฐ์ ์ง์ ํด์คฌ์ผ๋ฉด useParams ๋ผ๋ ํ ์ผ๋ก ํ๋ผ๋ฏธํฐ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
// topic.js
export default function Topic() {
const param = useParams();
console.log(param);
return (
<div>
<h2>{`Topic${param.tid}`}</h2>
<p>{`Topic${param.tid} page`}</p>
</div>
);
}
/topics/:tid ๊ฒฝ๋ก์ ํด๋นํ๋ ์ด ์ปดํฌ๋ํธ์์ useParams ํจ์๋ฅผ ์คํ์ํค๋ฉด ํ๋ผ๋ฏธํฐ์ธ tid๊ฐ ํ๋กํผํฐ๋ก ํฌํจ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
๋ง์ฝ /topics/1 ๊ฒฝ๋ก๋ก ๋ค์ด๊ฐ๋ค๋ฉด console.log(param)์ ์ํด ๋ธ๋ผ์ฐ์ ์ฝ์์ฐฝ์
์ด์ ๊ฐ์ด ์ฐํ๋๋ฐ *
์ด๋ผ๋ ํ๋กํผํฐ๋ ๊ฐ์ด ํ๋ผ๋ฏธํฐ๊ฐ์ธ 1๋ก ์ง์ ๋์ด ์ถ๊ฐ๋์ด์๋๊ฑด App.js์์์ <Route path="/topics/*" element={<Topics />} />
๋๋ฌธ์ธ ๊ฑฐ ๊ฐ์๋ฐ ์ ํํ ์ด์ ๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค..
์๋ฌดํผ ์ค์ํ๊ฑด useParams ํจ์๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด์ ํ๋ผ๋ฏธํฐ์ ๊ทธ์ ๊ฐ์ด ํ๋กํผํฐ๋ก ๋ด๊ฒจ์๋ค๋ ๊ฒ์ด๊ณ , ๋ฐ๋ผ์ ์ด ๊ฐ์ฒด๋ฅผ ์ด์ฉํด tid์ ๊ฐ์ ์ ๊ทผํ์ฌ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
<h2>{`Topic${param.tid}`}</h2>
<p>{`Topic${param.tid} page`}</p>
๊ทธ๋์ useParams๋ก ๊ฐ์ ธ์จ param ๊ฐ์ฒด์ tid์ ์ ๊ทผํ์ฌ /topics/1 ๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด Topic1๊ณผ Topic1 page ๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋๊ฒ ๋๋ค.
์ฐธ๊ณ ์๋ฃ
https://whales.tistory.com/140#google_vignette
https://blog.woolta.com/categories/1/posts/211