πŸŽ‰ berenickt λΈ”λ‘œκ·Έμ— 온 κ±Έ ν™˜μ˜ν•©λ‹ˆλ‹€. πŸŽ‰
Front
React-Router
01-React Router

1. Routerλž€

  • Route = 경둜 c.f. 발음 : 루트
  • Router = κ²½λ‘œμ°ΎλŠ” 것 c.f. 영ꡭ발음 : 루터, 미ꡭ발음 : λΌμš°ν„°
    • c.f. μ„œλ‘œ λ‹€λ₯Έ λ„€νŠΈμ›Œν¬λ₯Ό μ—°κ²°ν•΄μ£ΌλŠ” μž₯치λ₯Ό β€œλΌμš°ν„°β€λΌκ³  함
  • λΌμš°νŒ… = μ‚¬μš©μžκ°€ μš”μ²­ν•œ URL에 따라 μ•Œλ§žλŠ” νŽ˜μ΄μ§€λ₯Ό λ³΄μ—¬μ£ΌλŠ” 것을 의미
  • React Router 라이브러리 μ’…λ₯˜

2. React Router κΈ°λ³Έ μ‚¬μš©λ²•

2.1 μ„€μΉ˜

1
$ yarn create react-app router-tutorial # μ—°μŠ΅μš© 폴더
2
$ cd router-tutorial
3
4
$ yarn add react-router-dom # React Router μ„€μΉ˜

2.2 ν”„λ‘œμ νŠΈμ— λΌμš°ν„° 적용

1
import React from 'react'
2
import ReactDOM from 'react-dom/client'
3
import App from './App'
4
import { BrowserRouter } from 'react-router-dom' // μΆ”κ°€
5
6
const root = ReactDOM.createRoot(document.getElementById('root'))
7
root.render(
8
<BrowserRouter>
9
<App />
10
</BrowserRouter>,
11
)
  • react-router-dom에 λ‚΄μž₯λ˜μ–΄ μžˆλŠ” BrowserRouter μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ 감싸기
    • BrowserRouter μ»΄ν¬λ„ŒνŠΈ
      • μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— HTML5의 History APIλ₯Ό μ‚¬μš©ν•˜μ—¬ νŽ˜μ΄μ§€λ₯Ό μƒˆλ‘œ λΆˆλŸ¬μ˜€μ§€ μ•Šκ³ ,
      • μ£Όμ†Œλ₯Ό λ³€κ²½ν•˜κ³  ν˜„μž¬ μ£Όμ†Œμ˜ κ²½λ‘œμ— κ΄€λ ¨λœ 정보λ₯Ό λ¦¬μ•‘νŠΈ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ€Œ

2.3 μ˜ˆμ‹œ : νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈ 생성

1
// src/pages/Home.js
2
export default function Home() {
3
return (
4
<div>
5
<h1>ν™ˆ</h1>
6
<p>κ°€μž₯ λ¨Όμ € λ³΄μ—¬μ§€λŠ” νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.</p>
7
</div>
8
)
9
}
1
// src/pages/About.js
2
export default function About() {
3
return (
4
<div>
5
<h1>μ†Œκ°œ</h1>
6
<p>λ¦¬μ•‘νŠΈ λΌμš°ν„°λ₯Ό μ‚¬μš©ν•΄ λ³΄λŠ” ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.</p>
7
</div>
8
)
9
}

2.4 νŠΉμ • κ²½λ‘œμ— μ›ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ 보여주기 : Route

  • μ£Όμ†Œ κ²½λ‘œμ— 따라 μ›ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό 보여주기 μœ„ν•΄ Route μ»΄ν¬λ„ŒνŠΈλ₯Ό 톡해 라우트 μ„€μ •
  • Route μ»΄ν¬λ„ŒνŠΈλŠ” Routes μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ μ‚¬μš©λ˜μ–΄μ•Ό 함
  • μ‚¬μš©λ²• : <Route path="μ£Όμ†Œκ·œμΉ™" element={보여쀄 μ»΄ν¬λ„ŒνŠΈ} />
1
import { Route, Routes } from 'react-router-dom'
2
import About from './pages/About'
3
import Home from './pages/Home'
4
5
export default function App() {
6
return (
7
<Routes>
8
<Route path="/" element={<Home />} />
9
<Route path="/about" element={<About />} />
10
</Routes>
11
)
12
}

yarn start λ₯Ό μž…λ ₯ν•˜μ—¬ 개발 μ„œλ²„λ₯Ό μ‹œμž‘


2.5 λ‹€λ₯Έ νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜λŠ” 링크 보여주기 : Link

μ›Ή νŽ˜μ΄μ§€μ—μ„œλŠ” μ›λž˜ 링크λ₯Ό 보여쀄 λ•Œ, a νƒœκ·Έλ₯Ό μ‚¬μš©ν•˜λŠ”λ°,

  • λ¦¬μ•‘νŠΈ λΌμš°ν„°λ₯Ό μ‚¬μš©ν•˜λŠ” ν”„λ‘œμ νŠΈμ—μ„œ aνƒœκ·Έλ₯Ό λ°”λ‘œ μ‚¬μš©ν•˜λ©΄ μ•ˆλ¨
  • μ™œλƒν•˜λ©΄, a νƒœκ·Έλ₯Ό 클릭해 νŽ˜μ΄μ§€λ₯Ό μ΄λ™ν•˜λ©΄, λΈŒλΌμš°μ €κ°€ νŽ˜μ΄μ§€λ₯Ό μƒˆλ‘œ 뢈러였게 되기 λ•Œλ¬Έ β†’ λ¦¬λ Œλ”λ§

Link μ»΄ν¬λ„ŒνŠΈ

  • Link μ»΄ν¬λ„ŒνŠΈ μ—­μ‹œ a νƒœκ·Έλ₯Ό μ‚¬μš©ν•˜κΈ΄ ν•˜μ§€λ§Œ,
  • νŽ˜μ΄μ§€λ₯Ό μƒˆλ‘œ λΆˆλŸ¬μ˜€λŠ” 것을 막고, History APIλ₯Ό 톡해 λΈŒλΌμš°μ € μ£Όμ†Œμ˜ 경둜만 λ°”κΎΈλŠ” κΈ°λŠ₯이 λ‚΄μž₯λ˜μ–΄ 있음
  • μ‚¬μš©λ²• : <Link to="경둜">링크 이름</Link>

2.5.1 μ˜ˆμ‹œ

Home νŽ˜μ΄μ§€μ—μ„œ About νŽ˜μ΄μ§€λ‘œ 이동할 수 μžˆλ„λ‘ Link μ»΄ν¬λ„ŒνŠΈλ₯Ό Home μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μš©

1
// src/pages/Home.js
2
import { Link } from 'react-router-dom'
3
4
export default function Home() {
5
return (
6
<div>
7
<h1>ν™ˆ</h1>
8
<p>κ°€μž₯ λ¨Όμ € λ³΄μ—¬μ§€λŠ” νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.</p>
9
<Link to="/about">μ†Œκ°œ</Link>
10
</div>
11
)
12
}

3. URL νŒŒλΌλ―Έν„°μ™€ 쿼리슀트링

νŽ˜μ΄μ§€ μ£Όμ†Œλ₯Ό μ •μ˜ν•  λ•Œ 가끔은 μœ λ™μ μΈ 값을 μ‚¬μš©ν•΄μ•Ό ν•  λ•Œλ„ μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같이 말이죠.

  • URL νŒŒλΌλ―Έν„°
    • μ£Όμ†Œμ˜ κ²½λ‘œμ— μœ λ™μ μΈ 값을 λ„£λŠ” ν˜•νƒœ
    • ID λ˜λŠ” 이름을 μ‚¬μš©ν•˜μ—¬ νŠΉμ • 데이터λ₯Ό μ‘°νšŒν•  λ•Œ μ‚¬μš©
    • e.g. /profile/velopert
  • 쿼리슀트링(Querystring)
    • μ£Όμ†Œμ˜ 뒷뢀뢄에 ? λ¬Έμžμ—΄ 이후에 key=value 둜 값을 μ •μ˜ν•˜λ©°, &둜 ꡬ뢄을 ν•˜λŠ” ν˜•νƒœ
    • ν‚€μ›Œλ“œ 검색, νŽ˜μ΄μ§€λ„€μ΄μ…˜, μ •λ ¬ 방식 λ“± 데이터 μ‘°νšŒμ— ν•„μš”ν•œ μ˜΅μ…˜μ„ 전달할 λ•Œ μ‚¬μš©
    • e.g. /articles?page=1&keyword=react

3.1 μ˜ˆμ‹œ : URL νŒŒλΌλ―Έν„°

Profile μ»΄ν¬λ„ŒνŠΈλ₯Ό pages κ²½λ‘œμ— λ‹€μŒκ³Ό 같이 μž‘μ„±

1
// src/pages/Profile.js
2
import { useParams } from 'react-router-dom'
3
4
const data = {
5
velopert: {
6
name: 'κΉ€λ―Όμ€€',
7
description: 'λ¦¬μ•‘νŠΈλ₯Ό μ’‹μ•„ν•˜λŠ” 개발자',
8
},
9
gildong: {
10
name: '홍길동',
11
description: 'κ³ μ „ μ†Œμ„€ ν™κΈΈλ™μ „μ˜ 주인곡',
12
},
13
}
14
15
export default function Profile() {
16
// URL νŒŒλΌλ―Έν„°μ˜ 이름은 라우트 섀정을 ν•  λ•Œ Route μ»΄ν¬λ„ŒνŠΈμ˜ path propsλ₯Ό ν†΅ν•˜μ—¬ μ„€μ •
17
const params = useParams() // useParams Hook을 μ‚¬μš©ν•˜μ—¬ 객체 ν˜•νƒœλ‘œ 쑰회 κ°€λŠ₯
18
const profile = data[params.username] // username URL νŒŒλΌλ―Έν„°λ₯Ό ν†΅ν•˜μ—¬ ν”„λ‘œν•„μ„ 쑰회
19
20
return (
21
<div>
22
<h1>μ‚¬μš©μž ν”„λ‘œν•„</h1>
23
{profile ? (
24
<div>
25
<h2>{profile.name}</h2>
26
<p>{profile.description}</p>
27
</div>
28
) : (
29
<p>μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œν•„μž…λ‹ˆλ‹€.</p>
30
)}
31
</div>
32
)
33
}

App μ»΄ν¬λ„ŒνŠΈ νŒŒμΌμ„ μ—΄μ–΄μ„œ μƒˆλ‘œμš΄ 라우트λ₯Ό λ‹€μŒκ³Ό 같이 μ„€μ •ν•˜κΈ°

1
// src/App.js
2
import { Route, Routes } from 'react-router-dom'
3
import About from './pages/About'
4
import Home from './pages/Home'
5
import Profile from './pages/Profile'
6
7
export default function App() {
8
return (
9
<Routes>
10
<Route path="/" element={<Home />} />
11
<Route path="/about" element={<About />} />
12
{/* URL νŒŒλΌλ―Έν„°λŠ” /profiles/:username κ³Ό 같이 κ²½λ‘œμ— : λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„€μ • */}
13
{/* λ§Œμ•½ URL νŒŒλΌλ―Έν„°κ°€ μ—¬λŸ¬κ°œμΈ κ²½μš°μ—” /profiles/:username/:field 와 같은 ν˜•νƒœλ‘œ μ„€μ • κ°€λŠ₯ */}
14
<Route path="/profiles/:username" element={<Profile />} />
15
</Routes>
16
)
17
}

Profile νŽ˜μ΄μ§€λ‘œ 이동을 ν•  수 μžˆλ„λ‘ Home νŽ˜μ΄μ§€μ— Link λ₯Ό 더 λ§Œλ“€κΈ°

1
// src/pages/Home.js
2
import { Link } from 'react-router-dom'
3
4
export default function Home() {
5
return (
6
<div>
7
<h1>ν™ˆ</h1>
8
<p>κ°€μž₯ λ¨Όμ € λ³΄μ—¬μ§€λŠ” νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.</p>
9
<ul>
10
<li>
11
<Link to="/about">μ†Œκ°œ</Link>
12
</li>
13
<li>
14
<Link to="/profiles/velopert">velopert의 ν”„λ‘œν•„</Link>
15
</li>
16
<li>
17
<Link to="/profiles/gildong">gildong의 ν”„λ‘œν•„</Link>
18
</li>
19
<li>
20
<Link to="/profiles/void">μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œν•„</Link>
21
</li>
22
</ul>
23
</div>
24
)
25
}

이제 μƒˆλ‘œ λ§Œλ“  링크λ₯Ό λˆŒλŸ¬μ„œ Profile νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•΄λ³΄μ„Έμš”.


3.2 μ˜ˆμ‹œ : 쿼리슀트링

μΏΌλ¦¬μŠ€νŠΈλ§μ„ μ‚¬μš©ν•  λ•ŒλŠ” URL νŒŒλΌλ―Έν„°μ™€ 달리 Route μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•  λ•Œ λ³„λ„λ‘œ μ„€μ •ν•΄μ•Όλ˜λŠ” 것은 μ—†μŠ΅λ‹ˆλ‹€.

πŸ’‘ useLocation()

location 객체λ₯Ό λ°˜ν™˜ν•˜λ©°, 이 κ°μ²΄λŠ” ν˜„μž¬ μ‚¬μš©μžκ°€ λ³΄κ³ μžˆλŠ” νŽ˜μ΄μ§€μ˜ 정보λ₯Ό μ§€λ‹Œ Hook

location객체 μ•ˆμ—λŠ” λ‹€μŒκ³Ό 같은 값이 λ“€μ–΄μžˆμŒ

  • pathname : ν˜„μž¬ μ£Όμ†Œμ˜ 경둜 (쿼리슀트링 μ œμ™Έ)
  • search : 맨 μ•žμ˜ ? 문자 ν¬ν•¨ν•œ 쿼리슀트링 κ°’
  • hash : μ£Όμ†Œμ˜ # λ¬Έμžμ—΄ λ’€μ˜ κ°’
    • 주둜 History APIκ°€ μ§€μ›μ•ˆλ˜λŠ” κ΅¬ν˜• λΈŒλΌμš°μ €μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈ λΌμš°νŒ…μ„ μ‚¬μš©ν•  λ•Œ μ“°λŠ” ν•΄μ‹œ λΌμš°ν„°μ—μ„œ μ‚¬μš©
  • state : νŽ˜μ΄μ§€λ‘œ μ΄λ™ν• λ•Œ μž„μ˜λ‘œ 넣을 수 μžˆλŠ” μƒνƒœ κ°’
  • key : location 객체의 고유 κ°’
    • μ΄ˆκΈ°μ—λŠ” default 이며 νŽ˜μ΄μ§€κ°€ λ³€κ²½λ λ•Œλ§ˆλ‹€ 고유의 값이 생성됨

About νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€μŒκ³Ό 같이 μˆ˜μ •ν•΄λ³΄μ„Έμš”.

1
// src/pages/About.js
2
import { useLocation } from 'react-router-dom'
3
4
export default function About() {
5
// useLocation() : location 객체λ₯Ό λ°˜ν™˜
6
// - location κ°μ²΄λŠ” ν˜„μž¬ μ‚¬μš©μžκ°€ λ³΄κ³ μžˆλŠ” νŽ˜μ΄μ§€μ˜ 정보λ₯Ό μ§€λ‹Œ Hook
7
const location = useLocation()
8
9
return (
10
<div>
11
<h1>μ†Œκ°œ</h1>
12
<p>λ¦¬μ•‘νŠΈ λΌμš°ν„°λ₯Ό μ‚¬μš©ν•΄ λ³΄λŠ” ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.</p>
13
<p>쿼리슀트링: {location.search}</p>
14
</div>
15
)
16
}

μΏΌλ¦¬μŠ€νŠΈλ§μ€ location.search 값을 톡해 쑰회λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ£Όμ†Œμ°½μ— http://localhost:3000/about?detail=true&mode=1λ₯Ό μž…λ ₯ν•΄μ„œ μ–΄λ–€ 값이 λ‚˜νƒ€λ‚˜λŠ”μ§€ ν™•μΈν•΄λ³΄μ„Έμš”.

쿼리슀트링 값이 ?detail=true&mode=1 으둜 ν‘œμ‹œλ©λ‹ˆλ‹€. 이 λ¬Έμžμ—΄μ—μ„œ ? 둜 μ§€μš°κ³ , & λ¬Έμžμ—΄λ‘œ λΆ„λ¦¬ν•œλ’€ key 와 value λ₯Ό νŒŒμ‹±ν•˜λŠ” μž‘μ—…μ„ ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 μž‘μ—…μ€ 보톡 npm μ—μ„œ qs λ˜λŠ” querystring νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•΄μ„œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μΏΌλ¦¬μŠ€νŠΈλ§μ„ λ”°λ‘œ νŒŒμ‹±κΉŒμ§€ ν•΄μ•Όλœλ‹€λ©΄ λ²ˆκ±°λ‘œμšΈμˆ˜λ„ μžˆλŠ”λ°, λ¦¬μ•‘νŠΈ λΌμš°ν„°μ—μ„œλŠ” v6λΆ€ν„° useSearchParams λΌλŠ” Hook을 μ œκ³΅ν•©λ‹ˆλ‹€.

πŸ’‘ useSearchParams

λ°°μ—΄ νƒ€μž…μ˜ 값을 λ°˜ν™˜ν•˜λ©°,

  • 첫번째 μ›μ†ŒλŠ” 쿼리 νŒŒλΌλ―Έν„°λ₯Ό μ‘°νšŒν•˜κ±°λ‚˜ μˆ˜μ •ν•˜λŠ” λ©”μ„œλ“œλ“€μ΄ λ‹΄κΈ΄ 객체λ₯Ό λ°˜ν™˜
    • get λ©”μ„œλ“œλ₯Ό 톡해 νŠΉμ • μΏΌλ¦¬νŒŒλΌλ―Έν„°λ₯Ό 쑰회
    • set λ©”μ„œλ“œλ₯Ό 톡해 νŠΉμ • μΏΌλ¦¬νŒŒλΌλ―Έν„°λ₯Ό μ—…λ°μ΄νŠΈ
      • λ§Œμ•½ μ‘°νšŒμ‹œμ— μΏΌλ¦¬νŒŒλΌλ―Έν„°κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ null 둜 쑰회
  • λ‘λ²ˆμ§Έ μ›μ†ŒλŠ” 쿼리 νŒŒλΌλ―Έν„°λ₯Ό κ°μ²΄ν˜•νƒœλ‘œ μ—…λ°μ΄νŠΈν•  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό λ°˜ν™˜

μΏΌλ¦¬νŒŒλΌλ―Έν„°λ₯Ό μ‚¬μš©ν•  λ•Œ μ£Όμ˜ν•  점

  • μΏΌλ¦¬νŒŒλΌλ―Έν„°λ₯Ό μ‘°νšŒν•  λ•Œ 값은 무쑰건 λ¬Έμžμ—΄ νƒ€μž…μž„
  • boolean 값을 λ„£κ³  값을 λΉ„κ΅ν•˜λ €λ©΄, λ°˜λ“œμ‹œ 'true' 같이 λ”°μ˜΄ν‘œλ‘œ κ°μ‹Έμ„œ 비ꡐλ₯Ό ν•΄μ•Ό 함
  • 숫자λ₯Ό λ‹€λ£¨κ²Œ λœλ‹€λ©΄ parseInt λ₯Ό μ‚¬μš©ν•˜μ—¬ 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜

λ‹€μŒμ€ 이 Hook을 μ‚¬μš©ν•˜μ—¬ μΏΌλ¦¬μŠ€νŠΈλ§μ„ μ‰½κ²Œ νŒŒμ‹±ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.

1
// src/pages/About.js
2
import { useSearchParams } from 'react-router-dom'
3
4
export default function About() {
5
const [searchParams, setSearchParams] = useSearchParams() // μΏΌλ¦¬μŠ€νŠΈλ§μ„ νŒŒμ‹±ν•΄μ£ΌλŠ” Hook
6
const detail = searchParams.get('detail') // get() : νŠΉμ • 쿼리 νŒŒλΌλ―Έν„°λ₯Ό 쑰회
7
const mode = searchParams.get('mode')
8
9
const onToggleDetail = () => {
10
// detail 쿼리 νŒŒλΌλ―Έν„°μ˜ 값이 true이면
11
setSearchParams({ mode, detail: detail === 'true' ? false : true })
12
}
13
14
const onIncreaseMode = () => {
15
// mode 쿼리 νŒŒλΌλ―Έν„°μ˜ 값이 null이면
16
const nextMode = mode === null ? 1 : parseInt(mode) + 1
17
setSearchParams({ mode: nextMode, detail })
18
}
19
20
return (
21
<div>
22
<h1>μ†Œκ°œ</h1>
23
<p>λ¦¬μ•‘νŠΈ λΌμš°ν„°λ₯Ό μ‚¬μš©ν•΄ λ³΄λŠ” ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.</p>
24
<p>detail: {detail}</p>
25
<p>mode: {mode}</p>
26
<button onClick={onToggleDetail}>Toggle detail</button>
27
<button onClick={onIncreaseMode}>mode + 1</button>
28
</div>
29
)
30
}

React_15_1


4. μ€‘μ²©λœ 라우트

μ€‘μ²©λœ 라우트λ₯Ό 이해해보기 μœ„ν•˜μ—¬, κ²Œμ‹œκΈ€ λͺ©λ‘μ„ λ³΄μ—¬μ£ΌλŠ” νŽ˜μ΄μ§€μ™€ κ²Œμ‹œκΈ€μ„ μ½λŠ” νŽ˜μ΄μ§€λ₯Ό λ§Œλ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€

1
// src/pages/Articles.js
2
import { Link } from 'react-router-dom'
3
4
export default function Articles() {
5
return (
6
<ul>
7
<li>
8
<Link to="/articles/1">κ²Œμ‹œκΈ€ 1</Link>
9
</li>
10
<li>
11
<Link to="/articles/2">κ²Œμ‹œκΈ€ 2</Link>
12
</li>
13
<li>
14
<Link to="/articles/3">κ²Œμ‹œκΈ€ 3</Link>
15
</li>
16
</ul>
17
)
18
}
1
// src/pages/Article.js
2
import { useParams } from 'react-router-dom'
3
4
export default function Article() {
5
const { id } = useParams()
6
return (
7
<div>
8
<h2>κ²Œμ‹œκΈ€ {id}</h2>
9
</div>
10
)
11
}

두 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€μ—ˆλ‹€λ©΄, ν•΄λ‹Ή νŽ˜μ΄μ§€λ“€μ˜ 라우트λ₯Ό App μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ„€μ •

1
import { Route, Routes } from 'react-router-dom'
2
import About from './pages/About'
3
import Article from './pages/Article'
4
import Articles from './pages/Articles'
5
import Home from './pages/Home'
6
import Profile from './pages/Profile'
7
8
export default function App() {
9
return (
10
<Routes>
11
<Route path="/" element={<Home />} />
12
<Route path="/about" element={<About />} />
13
<Route path="/profiles/:username" element={<Profile />} />
14
<Route path="/articles" element={<Articles />} />
15
<Route path="/articles/:id" element={<Article />} />
16
</Routes>
17
)
18
}

κ·Έ λ‹€μŒμ—λŠ” Home μ»΄ν¬λ„ŒνŠΈμ—μ„œ κ²Œμ‹œκΈ€ λͺ©λ‘ νŽ˜μ΄μ§€λ‘œ κ°€λŠ” 링크λ₯Ό μΆ”κ°€

1
// src/pages/Home.js
2
import { Link } from 'react-router-dom'
3
4
export default function Home() {
5
return (
6
<div>
7
<h1>ν™ˆ</h1>
8
<p>κ°€μž₯ λ¨Όμ € λ³΄μ—¬μ§€λŠ” νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.</p>
9
<ul>
10
μƒλž΅...
11
<li>
12
<Link to="/articles">κ²Œμ‹œκΈ€ λͺ©λ‘</Link>
13
</li>
14
</ul>
15
</div>
16
)
17
}

κ²Œμ‹œκΈ€ λͺ©λ‘ νŽ˜μ΄μ§€λ₯Ό μ—΄μ–΄μ„œ λͺ©λ‘μ΄ 잘 λ‚˜νƒ€λ‚˜λŠ”μ§€ ν™•μΈν•˜κ³ , κ²Œμ‹œκΈ€μ˜ 링크λ₯Ό 눌러 κ²Œμ‹œκΈ€ 읽기 νŽ˜μ΄μ§€λ„ 잘 λ‚˜νƒ€λ‚˜λŠ”μ§€ ν™•μΈν•΄λ³΄μ„Έμš”.


κ²Œμ‹œκΈ€ λͺ©λ‘ νŽ˜μ΄μ§€μ—μ„œ κ²Œμ‹œκΈ€μ„ μ—΄μ—ˆμ„ λ•Œ, κ²Œμ‹œκΈ€μ˜ ν•˜λ‹¨μ— λͺ©λ‘μ„ λ³΄μ—¬μ€˜μ•Όν•œλ‹€λ©΄ μ–΄λ–¨κΉŒμš”? λ§Œμ•½ κΈ°μ‘΄ λ°©μ‹μœΌλ‘œ κ΅¬ν˜„μ„ ν•œλ‹€λ©΄ μ•„λ§ˆ λ‹€μŒκ³Ό 같이 ArticleList μ»΄ν¬λ„ŒνŠΈλ₯Ό λ”°λ‘œ λ§Œλ“€μ–΄μ„œ, 각 νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μš©μ„ 해야됐을 κ²ƒμž…λ‹ˆλ‹€.

1
<div>
2
<h2>κ²Œμ‹œκΈ€ {id}</h2>
3
<ArticleList />
4
</div>

μ€‘μ²©λœ 라우트λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ μ’€ 더 λ‚˜μ€ λ°©μ‹μœΌλ‘œ κ΅¬ν˜„μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ²ˆμ—λŠ” μ€‘μ²©λœ 라우트 ν˜•νƒœλ‘œ 라우트λ₯Ό μ„€μ •ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

1
import { Route, Routes } from 'react-router-dom'
2
import About from './pages/About'
3
import Article from './pages/Article'
4
import Articles from './pages/Articles'
5
import Home from './pages/Home'
6
import Profile from './pages/Profile'
7
8
export default function App() {
9
return (
10
<Routes>
11
<Route path="/" element={<Home />} />
12
<Route path="/about" element={<About />} />
13
<Route path="/profiles/:username" element={<Profile />} />
14
<Route path="/articles" element={<Articles />} />
15
<Route path="/articles" element={<Articles />}>
16
<Route path=":id" element={<Article />} />
17
</Route>
18
</Routes>
19
)
20
}

κ·Έ λ‹€μŒμ—λŠ” Articles μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ¦¬μ•‘νŠΈ λΌμš°ν„°μ—μ„œ μ œκ³΅ν•˜λŠ” Outlet μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  • Outlet μ»΄ν¬λ„ŒνŠΈ : Route 의 children 으둜 λ“€μ–΄κ°€λŠ” JSX μ—˜λ¦¬λ¨ΌνŠΈλ₯Ό λ³΄μ—¬μ£ΌλŠ” μ—­ν• 
    • μ§€κΈˆμ˜ κ²½μš°μ—” λ‹€μŒ λ‚΄μš©μ΄ Outlet μ»΄ν¬λ„ŒνŠΈλ₯Ό ν†΅ν•΄μ„œ 보여짐
    • <Route path=":id" element={<Article />} />

Articles μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€μŒκ³Ό 같이 μˆ˜μ •ν•΄μ£Όμ„Έμš”.

1
// src/pages/Articles.js
2
import { Link, Outlet } from 'react-router-dom'
3
4
export default function Articles() {
5
return (
6
<div>
7
{/* Outlet μ»΄ν¬λ„ŒνŠΈκ°€ μ‚¬μš©λœ μžλ¦¬μ— μ€‘μ²©λœ λΌμš°νŠΈκ°€ 보여짐 */}
8
<Outlet />
9
<ul>
10
<li>
11
<Link to="/articles/1">κ²Œμ‹œκΈ€ 1</Link>
12
</li>
13
<li>
14
<Link to="/articles/2">κ²Œμ‹œκΈ€ 2</Link>
15
</li>
16
<li>
17
<Link to="/articles/3">κ²Œμ‹œκΈ€ 3</Link>
18
</li>
19
</ul>
20
</div>
21
)
22
}

이제 /articles/1 κ²½λ‘œμ— λ“€μ–΄κ°€λ³΄μ„Έμš”. κ²Œμ‹œκΈ€ ν•˜λ‹¨μ— κ²Œμ‹œκΈ€ λͺ©λ‘μ΄ 잘 λ‚˜νƒ€λ‚˜λŠ”μ§€ ν™•μΈν•˜μ„Έμš”.


4.1 곡톡 λ ˆμ΄μ•„μ›ƒ μ»΄ν¬λ„ŒνŠΈ

μ€‘μ²©λœ λΌμš°νŠΈμ™€ Outlet 은 νŽ˜μ΄μ§€λΌλ¦¬ κ³΅ν†΅μ μœΌλ‘œ λ³΄μ—¬μ€˜μ•Ό ν•˜λŠ” λ ˆμ΄μ•„μ›ƒμ΄ μžˆμ„λ•Œλ„ μœ μš©ν•˜κ²Œ μ‚¬μš©ν•¨

  • e.g. Home, About, Profile νŽ˜μ΄μ§€μ—μ„œ 상단에 헀더λ₯Ό λ³΄μ—¬μ€˜μ•Ό ν•˜λŠ” 상황
  • μ€‘μ²©λœ λΌμš°νŠΈμ™€ Outlet을 ν™œμš©ν•˜μ—¬ κ΅¬ν˜„ν•˜λ©΄, μ»΄ν¬λ„ŒνŠΈλ₯Ό ν•œλ²ˆλ§Œ μ‚¬μš©ν•΄λ„ λœλ‹€λŠ” μž₯점이 있음

μš°μ„ , 곡톡 λ ˆμ΄μ•„μ›ƒμ„ μœ„ν•œ Layout μ»΄ν¬λ„ŒνŠΈλ₯Ό src 디렉터리에 λ§Œλ“œμ„Έμš”.

1
// src/Layout.js
2
import { Outlet } from 'react-router-dom'
3
4
export default function Layout() {
5
return (
6
<div>
7
<header style={{ background: 'lightgray', padding: 16, fontSize: 24 }}>Header</header>
8
<main>
9
<Outlet />
10
</main>
11
</div>
12
)
13
}

각 νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈκ°€ 보여져야 ν•˜λŠ” 뢀뢄에 Outlet μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€ μž‘μ„±ν•˜μ…¨μœΌλ©΄ App μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€μŒκ³Ό 같이 μˆ˜μ •ν•˜μ„Έμš”.

1
import { Route, Routes } from 'react-router-dom'
2
import Layout from './Layout'
3
import About from './pages/About'
4
import Article from './pages/Article'
5
import Articles from './pages/Articles'
6
import Home from './pages/Home'
7
import Profile from './pages/Profile'
8
9
export default function App() {
10
return (
11
<Routes>
12
<Route element={<Layout />}>
13
<Route path="/" element={<Home />} />
14
<Route path="/about" element={<About />} />
15
<Route path="/profiles/:username" element={<Profile />} />
16
</Route>
17
<Route path="/articles" element={<Articles />}>
18
<Route path=":id" element={<Article />} />
19
</Route>
20
</Routes>
21
)
22
}

이제 Home νŽ˜μ΄μ§€μ— λ“€μ–΄κ°€μ„œ, 헀더가 잘 λ‚˜νƒ€λ‚¬λŠ”μ§€ ν™•μΈν•˜μ„Έμš”.


4.2 index props

Route μ»΄ν¬λ„ŒνŠΈμ—λŠ” index λΌλŠ” propsκ°€ μžˆμŠ΅λ‹ˆλ‹€.

  • props λŠ” path="/"와 λ™μΌν•œ 의미λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

Home μ»΄ν¬λ„ŒνŠΈκ°€ μ‚¬μš©λœ Route μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€μŒκ³Ό 같이 λ³€κ²½ν•΄λ³΄μ„Έμš”

1
export default function App() {
2
return (
3
<Routes>
4
<Route element={<Layout />}>
5
{/* path="/"λ₯Ό index둜 μˆ˜μ • */}
6
<Route index element={<Home />} />
7
<Route path="/about" element={<About />} />
8
<Route path="/profiles/:username" element={<Profile />} />
9
</Route>
10
<Route path="/articles" element={<Articles />}>
11
<Route path=":id" element={<Article />} />
12
</Route>
13
</Routes>
14
)
15
}

그리고, / 경둜둜 듀어갔을 λ•Œ μ—¬μ „νžˆ Home νŽ˜μ΄μ§€κ°€ μ—¬μ „νžˆ 잘 λ‚˜μ˜€κ³  μžˆλ‚˜μš”?

  • index prop은 μƒμœ„ 라우트의 κ²½λ‘œμ™€ μΌμΉ˜ν•˜μ§€λ§Œ, κ·Έ 이후에 κ²½λ‘œκ°€ μ£Όμ–΄μ§€μ§€ μ•Šμ•˜μ„λ•Œ λ³΄μ—¬μ§€λŠ” 라우트λ₯Ό μ„€μ •ν• λ•Œ μ‚¬μš©
  • path="/"와 λ™μΌν•œ 역할을 ν•˜λ©° 이λ₯Ό μ’€ 더 λͺ…μ‹œμ μœΌλ‘œ ν‘œν˜„ν•˜λŠ” 방법

5. λ¦¬μ•‘νŠΈ λΌμš°ν„° λΆ€κ°€κΈ°λŠ₯

λ¦¬μ•‘νŠΈ λΌμš°ν„°μ—λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λΌμš°νŒ…μ— κ΄€λ ¨λœ μž‘μ—…μ„ ν•  λ•Œ μ‚¬μš©ν•  수 μžˆλŠ” μœ μš©ν•œ API듀을 제곡


5.1 useNavigate

  • useNavigate : Link μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ‹€λ₯Έ νŽ˜μ΄μ§€λ‘œ 이동을 ν•΄μ•Ό ν•˜λŠ” 상황에 μ‚¬μš©ν•˜λŠ” Hook

Layout μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€μŒκ³Ό 같이 μˆ˜μ •

1
// src/Layout.js
2
import { Outlet, useNavigate } from 'react-router-dom'
3
4
export default function Layout() {
5
// navigate νŒŒλΌλ―Έν„°κ°€ 숫자 νƒ€μž…μ΄λΌλ©΄ μ•žμœΌλ‘œ κ°€κ±°λ‚˜, λ’€λ‘œ 감
6
// navigate(-1) 을 ν•˜λ©΄ ν•œ 번 λ’€λ‘œκ°€κ³  navigate(-2) λ₯Ό ν•˜λ©΄ 두 번 λ’€λ‘œ 감
7
// λ°˜λŒ€λ‘œ navigate(1) 을 ν•˜λ©΄ μ•žμœΌλ‘œ ν•œ 번 감 (단, λ’€λ‘œκ°€κΈ°λ₯Ό 1λ²ˆν•œ μƒνƒœμ—¬μ•Ό 함)
8
const navigate = useNavigate()
9
10
const goBack = () => {
11
// 이전 νŽ˜μ΄μ§€λ‘œ 이동
12
navigate(-1)
13
}
14
15
// λ‹€λ₯Έ νŽ˜μ΄μ§€λ‘œ 이동을 ν•  λ•Œ replace λΌλŠ” μ˜΅μ…˜μ΄ 쑴재
16
// replace μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄, νŽ˜μ΄μ§€λ₯Ό 이동할 λ•Œ ν˜„μž¬ νŽ˜μ΄μ§€λ₯Ό νŽ˜μ΄μ§€ 기둝에 남기지 μ•ŠμŒ
17
const goArticles = () => {
18
// articles 경둜둜 이동
19
navigate('/articles')
20
}
21
22
return (
23
<div>
24
<header style={{ background: 'lightgray', padding: 16, fontSize: 24 }}>
25
<button onClick={goBack}>λ’€λ‘œκ°€κΈ°</button>
26
<button onClick={goArticles}>κ²Œμ‹œκΈ€ λͺ©λ‘</button>
27
</header>
28
<main>
29
<Outlet />
30
</main>
31
</div>
32
)
33
}

λ²„νŠΌμ„ λˆŒλ €μ„λ•Œ μ •μƒμ μœΌλ‘œ 이전 νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜κ±°λ‚˜, κ²Œμ‹œκΈ€ λͺ©λ‘ νŽ˜μ΄μ§€λ‘œ 이동이 λ˜λŠ”μ§€ ν™•μΈν•˜μ„Έμš”.


5.1.1 replace μ˜΅μ…˜

λ‹€λ₯Έ νŽ˜μ΄μ§€λ‘œ 이동을 ν•  λ•Œ replace λΌλŠ” μ˜΅μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€. replace μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ νŽ˜μ΄μ§€λ₯Ό 이동할 λ•Œ, ν˜„μž¬ νŽ˜μ΄μ§€λ₯Ό νŽ˜μ΄μ§€ 기둝에 남기지 μ•ŠμŠ΅λ‹ˆλ‹€.

방금 μž‘μ„±ν–ˆλ˜ goArticles ν•¨μˆ˜λ₯Ό λ‹€μŒκ³Ό 같이 μˆ˜μ •ν•΄λ³΄μ„Έμš”.

1
const goArticles = () => {
2
navigate('/articles', { replace: true })
3
}

κ·Έ λ‹€μŒμ— / 경둜둜 λ“€μ–΄κ°€μ„œ Home νŽ˜μ΄μ§€λ₯Ό λ„μš΄ 뒀에, μ†Œκ°œ 링크λ₯Ό 눌러 About νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜μ„Έμš”. 그리고, μƒλ‹¨μ˜ κ²Œμ‹œκΈ€ λͺ©λ‘ νŽ˜μ΄μ§€λ₯Ό λˆŒλŸ¬λ³΄μ„Έμš”. κ·Έ μƒνƒœμ—μ„œ λΈŒλΌμš°μ €μ˜ λ’€λ‘œκ°€κΈ° λ²„νŠΌμ„ 눌러 이전 νŽ˜μ΄μ§€λ‘œ 이동을 ν•΄λ³΄μ„Έμš”.

λ§Œμ•½ { replace: true } 섀정이 μ—†μ—ˆλ”λΌλ©΄ 직전에 봀던 νŽ˜μ΄μ§€μΈ About νŽ˜μ΄μ§€κ°€ λ‚˜νƒ€λ‚˜μ•Ό ν•˜μ§€λ§Œ, replace μ˜΅μ…˜μ΄ ν™œμ„±ν™”λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ—, κ·Έ μ „μ˜ νŽ˜μ΄μ§€μΈ Home νŽ˜μ΄μ§€κ°€ λ‚˜νƒ€λ‚˜κ²Œ λ©λ‹ˆλ‹€.


5.2 NavLink

NavLink μ»΄ν¬λ„ŒνŠΈ

  • λ§ν¬μ—μ„œ μ‚¬μš©ν•˜λŠ” κ²½λ‘œκ°€ ν˜„μž¬ 라우트의 κ²½λ‘œμ™€ μΌμΉ˜ν•˜λŠ” 경우 νŠΉμ • μŠ€νƒ€μΌ λ˜λŠ” CSS 클래슀λ₯Ό μ μš©ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ
  • style λ˜λŠ” className을 μ„€μ •ν•  λ•Œ, { isActive: boolean } 을 νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬λ°›λŠ” ν•¨μˆ˜ νƒ€μž…μ˜ 값을 전달함
1
<NavLink style={({isActive}) => isActive ? activeStyle : undefined} />
2
<NavLink className={({isActive}) => isActive ? 'active' : undefined} />

Articles νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈμ—μ„œ 이 μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•΄λ΄…μ‹œλ‹€.

1
// src/pages/Articles.js
2
import { NavLink, Outlet } from 'react-router-dom'
3
4
export default function Articles() {
5
const activeStyle = {
6
color: 'green',
7
fontSize: 21,
8
}
9
10
return (
11
<div>
12
<Outlet />
13
<ul>
14
<li>
15
<NavLink to="/articles/1" style={({ isActive }) => (isActive ? activeStyle : undefined)}>
16
κ²Œμ‹œκΈ€ 1
17
</NavLink>
18
</li>
19
<li>
20
<NavLink to="/articles/2" style={({ isActive }) => (isActive ? activeStyle : undefined)}>
21
κ²Œμ‹œκΈ€ 2
22
</NavLink>
23
</li>
24
<li>
25
<NavLink to="/articles/3" style={({ isActive }) => (isActive ? activeStyle : undefined)}>
26
κ²Œμ‹œκΈ€ 3
27
</NavLink>
28
</li>
29
</ul>
30
</div>
31
)
32
}

ν˜„μž¬ 보고 μžˆλŠ” κ²Œμ‹œκΈ€μ˜ 링크의 ν…μŠ€νŠΈκ°€ 더 컀지고 μ΄ˆλ‘μƒ‰μœΌλ‘œ λ³€ν•©λ‹ˆλ‹€.

μ‹€μ œλ‘œ λΉ„μŠ·ν•œ μž‘μ—…μ„ ν•˜κ²Œ 되면 ν˜„μž¬ NavLink λ₯Ό 감싼 또 λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€μ–΄μ„œ, λ‹€μŒκ³Ό 같이 λ¦¬νŒ©ν† λ§ν•˜μ—¬ μ‚¬μš©ν•˜μ‹œλŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.

1
// src/pages/Articles.js
2
import { NavLink, Outlet } from 'react-router-dom'
3
4
export default function Articles() {
5
return (
6
<div>
7
<Outlet />
8
<ul>
9
<ArticleItem id={1} />
10
<ArticleItem id={2} />
11
<ArticleItem id={3} />
12
</ul>
13
</div>
14
)
15
}
16
17
const ArticleItem = ({ id }) => {
18
const activeStyle = {
19
color: 'green',
20
fontSize: 21,
21
}
22
return (
23
<li>
24
<NavLink to={`/articles/${id}`} style={({ isActive }) => (isActive ? activeStyle : undefined)}>
25
κ²Œμ‹œκΈ€ {id}
26
</NavLink>
27
</li>
28
)
29
}

5.3 NotFound νŽ˜μ΄μ§€

NotFound νŽ˜μ΄μ§€

  • 사전에 μ •μ˜λ˜μ§€ μ•ŠλŠ” κ²½λ‘œμ— μ‚¬μš©μžκ°€ μ§„μž…ν–ˆμ„ λ•Œ λ³΄μ—¬μ£ΌλŠ” νŽ˜μ΄μ§€
  • λ‹€μ‹œλ§ν•΄, νŽ˜μ΄μ§€λ₯Ό 찾을 수 없을 λ•Œ λ‚˜νƒ€λ‚˜λŠ” νŽ˜μ΄μ§€

NotFound μ»΄ν¬λ„ŒνŠΈλ₯Ό μƒμ„±ν•˜μ„Έμš”.

1
// src/pages/NotFound.js
2
export default function NotFound() {
3
return (
4
<div
5
style={{
6
display: 'flex',
7
alignItems: 'center',
8
justifyContent: 'center',
9
fontSize: 64,
10
position: 'absolute',
11
width: '100%',
12
height: '100%',
13
}}
14
>
15
404
16
</div>
17
)
18
}

κ·Έ λ‹€μŒμ— App μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€μŒκ³Ό 같이 μˆ˜μ •

1
import { Route, Routes } from 'react-router-dom'
2
import Layout from './Layout'
3
import About from './pages/About'
4
import Article from './pages/Article'
5
import Articles from './pages/Articles'
6
import Home from './pages/Home'
7
import NotFound from './pages/NotFound'
8
import Profile from './pages/Profile'
9
10
export default function App() {
11
return (
12
<Routes>
13
<Route element={<Layout />}>
14
<Route index element={<Home />} />
15
<Route path="/about" element={<About />} />
16
<Route path="/profiles/:username" element={<Profile />} />
17
</Route>
18
<Route path="/articles" element={<Articles />}>
19
<Route path=":id" element={<Article />} />
20
</Route>
21
{/* * λŠ” wildcard 문자둜 아무 ν…μŠ€νŠΈλ‚˜ λ§€μΉ­ν•œλ‹€λŠ” 뜻 */}
22
{/* path="*"λŠ” μœ„μ—μ„œ μ •μ˜ν•œ 경둜 μ™Έ λͺ¨λ“  상황에 λ Œλ”λ§λ¨ */}
23
<Route path="*" element={<NotFound />} />
24
</Routes>
25
)
26
}

5.4 Navigate μ»΄ν¬λ„ŒνŠΈ

  • μ»΄ν¬λ„ŒνŠΈλ₯Ό 화면에 λ³΄μ—¬μ£ΌλŠ” μˆœκ°„ λ‹€λ₯Έ νŽ˜μ΄μ§€λ‘œ 이동을 ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ
  • 즉, νŽ˜μ΄μ§€λ₯Ό λ¦¬λ‹€μ΄λ ‰νŠΈ ν•˜κ³  싢을 λ•Œ μ‚¬μš©
  • e.g. μ‚¬μš©μžμ˜ 둜그인이 ν•„μš”ν•œ νŽ˜μ΄μ§€μΈλ° λ‘œκ·ΈμΈμ„ μ•ˆν–ˆλ‹€λ©΄ 둜그인 νŽ˜μ΄μ§€λ‘œ 이동

두 νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈλ₯Ό pages 디렉터리에 λ§Œλ“œμ„Έμš”.

1
// src/pages/Login.js
2
export default function Login() {
3
return <div>둜그인 νŽ˜μ΄μ§€</div>
4
}
1
// src/pages/MyPage.js
2
import { Navigate } from 'react-router-dom'
3
4
export default function MyPage() {
5
// 🍊 isLoggedIn 값이 둜그인 μƒνƒœμ— 따라 true λ˜λŠ” falseλ₯Ό κ°€λ₯΄ν‚¨λ‹€κ³  κ°€μ •
6
const isLoggedIn = false
7
8
// isLoggedIn이 false라면 Navigate μ»΄ν¬λ„ŒνŠΈλ₯Ό 톡해 /login 경둜둜 이동
9
// - replace propsλŠ” useNavigate μ—μ„œ μ„€λͺ…ν•œ 것과 동일함
10
// - νŽ˜μ΄μ§€λ₯Ό 이동할 λ•Œ ν˜„μž¬ νŽ˜μ΄μ§€λ₯Ό 기둝에 남기지 μ•ŠκΈ° λ•Œλ¬Έμ—,
11
// - 이동 ν›„ λ’€λ‘œκ°€κΈ°λ₯Ό λˆŒλ €μ„ λ•Œ 2 νŽ˜μ΄μ§€ μ „μ˜ νŽ˜μ΄μ§€λ‘œ 이동
12
if (!isLoggedIn) {
13
return <Navigate to="/login" replace={true} />
14
}
15
16
return <div>마이 νŽ˜μ΄μ§€</div>
17
}

μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€ μž‘μ„±ν•˜μ…¨μœΌλ©΄ App μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€μŒκ³Ό 같이 μˆ˜μ •ν•΄μ£Όμ„Έμš”.

1
export default function App() {
2
return (
3
<Routes>
4
<Route element={<Layout />}>
5
<Route index element={<Home />} />
6
<Route path="/about" element={<About />} />
7
<Route path="/profiles/:username" element={<Profile />} />
8
</Route>
9
<Route path="/articles" element={<Articles />}>
10
<Route path=":id" element={<Article />} />
11
</Route>
12
<Route path="/login" element={<Login />} />
13
<Route path="/mypage" element={<MyPage />} />
14
<Route path="*" element={<NotFound />} />
15
</Routes>
16
)
17
}

κ·Έ λ‹€μŒμ—λŠ” λΈŒλΌμš°μ €μ—μ„œ /mypage 경둜둜 μ΄λ™ν•΄λ³΄μ„Έμš”. νŽ˜μ΄μ§€κ°€ λ‘œλ”©λ˜λŠ” μˆœκ°„ λ°”λ‘œ Login νŽ˜μ΄μ§€λ‘œ μ΄λ™λ©λ‹ˆλ‹€.


[μ°Έκ³ ]