[React] Router Dom

2021. 10. 9. 08:00ใ†Front-End ์ž‘์—…์‹ค/Vue.js

728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ ์ƒํ™œ์ฝ”๋”ฉ - React Router


 

๐Ÿ“ React Router Dom ์„ค์น˜

๐Ÿ’ก ์ฐธ๊ณ  :

https://reactrouter.com/web/guides/quick-start 
Guide ํƒญ์—์„œ Quick Start ํด๋ฆญ
๋ช…๋ น์–ด : ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ $ npm install react-router-dom
์—ฌ๊ธฐ์„œ Router๋Š” ์ด์šฉ์ž๊ฐ€ URL๋กœ ์–ด๋–ค ์ฃผ์†Œ๋ฅผ ์น˜๊ณ  ๋“ค์–ด์™”์„ ๋•Œ์— ํ•ด๋‹น URI์— ๋งž๋Š” ํŽ˜์ด์ง€๋กœ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

๐Ÿ“ Router

import {BrowserRouter} from 'react-router-dom';

Router๋Š” ๋ชจ๋“  Router Componet์˜ Interface์ด๋‹ค.

Router์—๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ผ์šฐํŒ… ๊ด€๋ จ ์†์„ฑ๋งŒ ์ •์˜ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • <BrowserRouter>
  • <HashRouter>
  • <MemoryRouter>
  • <NativeRouter>
  • <StaticRouter>

Router์—๋Š” history ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด ๋„ค์ด๊ฒŒ์ดํŒ…์„ ํ•œ๋‹ค.

 

 

์—ฌ๊ธฐ์„œ BrowserRouter๋Š” React Router Component์˜ ์ตœ์ƒ์œ„ Component๋ฅผ ์ด์ฃผ๋Š” Wrapper Component

https://localhost:3000/

path="/"

https://localhost:3000/topics

path="/"
path="/topics"

์œ„์™€ ๊ฐ™์ด ๋‘ URI์— ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

<Route exact path="/one"> 
	<About /> 
</Route>

์œ„์™€ ๊ฐ™์ด exact๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ™•ํ•˜๊ฒŒ ์ผ์น˜์‹œ์ผœ ์ค€๋‹ค.

 

 

๐Ÿ“ Switch

Switch Component๋กœ ์‚ฌ์šฉ์ž ์ •์˜ Coponent๋“ค์„ ๊ฐ์‹ธ์ฃผ๋ฉด exact๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์ •ํ™•ํ•œ URI Matching์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

Switch๋กœ Route Component๋ฅผ ๊ฐ์‹ธ๊ฒŒ ๋˜๋ฉด ๋ฆฌ์—‘ํŠธ ๋ผ์šฐํ„ฐ ๋”์€ path์™€ ์ผ์น˜ํ•˜๋Š” ์ฒซ๋ฒˆ์งธ Component๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ๋‚˜๋จธ์ง€ Component๋Š” ๋ฌด์‹œํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์œ„์— ์จ๋…ผ ๋ง์€ ๊ฑฐ์ง“๋ง์ผ๊นŒ? ์ตœ์ƒ์œ„ URI๋ฅผ ์ง€์ •ํ•œ [ "/" ] Component๋ฅผ ์ตœํ•˜๋‹จ์œผ๋กœ ์˜ฎ๊ธฐ๊ฑฐ๋‚˜, ์ตœ์ƒ์œ„ URI์—๋งŒ exact๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์— ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

<Route path="/"> Not Found </Route>

์œ„์™€ ๊ฐ™์ด exact๋ฅผ ๊ธฐ์ž…ํ•˜์ง€ ์•Š์€ ์ตœ์ƒ์œ„ URI๋กœ Not Found๋ฅผ ์„ค์ •ํ•ด ๋‘๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์—†๋Š” URI๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ, ์œ„์˜ ์ฝ”๋“œ์— ๊ธฐ์žฌ๋œ ๋‚ด์šฉ์ด ๋ณด์ด๊ฒŒ ๋œ๋‹ค.

 

๋ฐ˜์‘ํ˜•

 

๐Ÿ“ LINK

import {BrowserRouter, Route, Switch, Link} from 'react-router-dom'; 

<ul> 
	<li> 
    	<a href="/">Home</a> 
        <a href="/topics">Topics</a> 
        <a href="/contact">Contact</a> 
    </li> 
</ul>

์œ„์˜ a Tag๋กœ ์ฝ”๋”ฉ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์šฐ๋ฆฌ๋Š” ์‹ฑ๊ธ€ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋Š”๋ฐ, ์ƒˆ๋กœ๊ณ ์นจ์ด a Tag๋ฅผ ๋ˆ„๋ฅผ๋•Œ๋งˆ๋‹ค ์ž‘๋™๋˜๊ฒŒ ๋œ๋‹ค.

<ul> <li> <Link to="/">Home</Link> <Link to="/topics">Topics</Link> <Link to="/contact">Contact</Link> </li> </ul>

ํ•˜์ง€๋งŒ, ์ด๋ฅผ Link Tag๋กœ ๊ณ ์น˜๊ฒŒ ๋˜๋ฉด ์ƒˆ๋กœ๊ณ ์นจ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ“ Hash Router

import {HashRouter, Route, Switch, Link} from 'react-router-dom'; 

ReactDOM.render( // BrowserRouter๋กœ App์„ ๊ฐ์‹ธ App Component์—์„œ BrwoserRouter๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. 
	<HashRouter> 
    	<App /> 
    </HashRouter>, 
    document.getElementById('root') );

 

๐Ÿ‘‰ BrowserRouter ์™€ HashRouter

HashRouter๋Š” URL ์ฐฝ(์ฃผ์†Œ์ฐฝ)์˜ URI๋ถ€๋ถ„์— ํ•ด์‰ฌ(#)์ด ๋ถ™๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ๊ฒ€์ƒ‰ ์—”์ง„์ด ์ฝ์„ ์ˆ˜ ์—†๋‹ค.

 

 

URL Hash๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HashRouter๋Š” ์ง€์›๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋‚˜ ์›น ์„œ๋ฒ„์— ์ œํ•œ์ด ์—†๋‹ค.

ํ•˜์ง€๋งŒ, ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ example.com/#/messages/messages์™€ ๊ฐ™์ด ์ฃผ์†Œ์— Hash๊ฐ€ ๋ถ™๊ฒŒ ๋œ๋‹ค. HashRouter๋Š” URL Hash๋ฅผ ์„œ๋ฒ„์—์„œ ์ฝ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— Server Side Rendering์œผ๋กœ ์„ค์ •์„ Backupํ•  ์ˆ˜ ์—†๋‹ค. ๋˜ํ•œ, Hash History๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

BrowserRouter๋Š” Link Component๋กœ to ์†์„ฑ์— ์ด๋™ํ•  ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

Route Component Path ์†์„ฑ์„ Link์˜ to ์†์„ฑ์œผ๋กœ Component Mapping Path๋ฅผ ๊ธฐ์ˆ ํ•œ๋‹ค.

์ƒˆ๋กœ๊ณ ์นจ ์‹œ ๊ฒฝ๋กœ๋ฅผ ๋ชป ์ฐพ์•„ Error๊ฐ€ ๋‚˜๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๋ ˆ๊ฑฐ์‹œ ๋ธŒ๋ผ์šฐ์ €(IE 9 ์ดํ•˜)์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๋˜ํ•œ, BrowserRouter๋Š” History API๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์‚ฌ์‹ค ๋งŽ์€ React ์ฝ”๋“œ์—์„œ Routing ํ•˜๋Š” Logic์„ ์‚ดํŽด๋ณด๋ฉด BrowserRotuer๊ฐ€ ์••๋„์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์˜ˆ์ „์—๋Š” ์‚ฌ๋žŒ๋“ค์ด URL ์œ„์น˜ ๋ณ€๊ฒฝ ์‹œ javaScript๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— HashRouter๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋‚˜, ์ตœ๊ทผ์—๋Š” BrowserRotuer๊ฐ€ ์ด ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•ด์ฃผ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ฉฐ, HashRouter๋Š” History Location์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํŽธํ•จ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. BrowserRotuer๋Š” History Location์„ ์ง€์›ํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ‹์ง„ ์›น์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“ Nav Link

Link์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ข€ ๋” ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์ด ๋” ์กด์žฌ

import {HashRouter, Route, Switch, NavLink} from 'react-router-dom'; 

	<ul> 
    	<li> 
        	<NavLink to="/">Home</NavLink> 
            <NavLink to="/topics">Topics</NavLink> 
            <NavLink to="/contact">Contact</NavLink> 
        </li> 
   </ul>

ํ•ด๋‹น Link๋ฅผ ํด๋ฆญํ•˜๋ฉด Browser์—์„œ Rander๋ฅผ ํ•  ๋•Œ, class๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น Link๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ, ํ•ด๋‹น class๊ฐ€ active๊ฐ€ ๋˜๊ฒŒ ํ•˜๋ ค๋ฉด NavLink ๋’ค์— exact๋ฅผ ๋ถ™ํ˜€์ฃผ๋ฉด ๋œ๋‹ค.

<ul> 
	<li> 
    	<NavLink exact to="/">Home</NavLink> 
        <NavLink exact to="/topics">Topics</NavLink> 
        <NavLink exact to="/contact">Contact</NavLink> 
    </li> 
</ul>

์ด๋ ‡๊ฒŒ ์„ค์ • ํ•ด ๋‘๋ฉด ์ด์šฉ์ž๊ฐ€ ์ž์‹ ์ด ์œ„์น˜ํ•œ ์œ„์น˜๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ Navigation์— ํ‘œ์‹œ๋ฅผ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๋‹น js์˜ css์—๋‹ค๊ฐ€ active Class CSS๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค.

index.css

.active{ 
	background-color: blueviolet; 
    text-decoration: none; 
}

 

๐Ÿ“ Nested Routing

์ด๋ฒˆ์—๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ดํŽด๋ณด์ž

useParams๋Š” ํ•˜๋‚˜์˜ Route์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ ํ‘œ์‹œ๋ฅผ ํ•ด์ฃผ๋ฉด(์•„๋ž˜ ์ฝ”๋“œ์—์„œ :/topic_id ๋ถ€๋ถ„)

์˜ˆ:)

<Route path="/topics:/topic_id"> 
	<Topic></Topic> 
</Route>

์ € ์ž๋ฆฌ์— ๋“ค์–ด์˜ค๋Š” ๊ฐ’๋“ค์„ ์•„๋ž˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ ๋˜๋Š”๋ฐ, ํ•ด๋‹น ๊ฐ’์„ useParams()๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ๊ทธ ๊ฐ’์— ๋”ฐ๋ผ์„œ ๋™์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•