๐Ÿ‘ค'Single Page Application [SPA]'

๋ฆฌ์•กํŠธ๋Š” SPA๊ธฐ์— ํ•˜๋‚˜์˜ index.html ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์„ ๊ฐ–๊ณ  ์žˆ์Œ
์ด ํ•˜๋‚˜์˜ ํ…œํ”Œ๋ฆฟ์— JS๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ฅผ
์ด index.html ํ…œํ”Œ๋ฆฟ์— ๋„ฃ์œผ๋ฏ€๋กœ ํŽ˜์ด์ง€๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ๊ฒŒ ๋จ
์ด๋•Œ ์ด React Router Dom ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ƒˆ ์ปดํฌ๋„ŒํŠธ๋กœ
๋ผ์šฐํŒ…/ํƒ์ƒ‰์„ ํ•˜๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๊ฒŒ ๋จ

'๋ฆฌ์•กํŠธ'์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŽ˜์ด์ง€ ๋งŒ๋“ค๋ ค๋ฉดโ“

๐Ÿ’โ€โ™€๏ธReact Router Dom๐Ÿ”ฅ

์‚ฌ์šฉํ•˜๋ฉด ์›น ์•ฑ์—์„œ ๋™์  ๋ผ์šฐํŒ…์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œโ—
๋ผ์šฐํŒ…์ด ์‹คํ–‰ ์ค‘์ธ ์•ฑ ์™ธ๋ถ€์˜ ๊ตฌ์„ฑ์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š”
๊ธฐ์กด ๋ผ์šฐํŒ… ์•„ํ‚คํ…์ฒ˜์™€ ๋‹ฌ๋ฆฌ React Router Dom์€
์•ฑ ๋ฐ ํ”Œ๋žซํผ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•จ

๐Ÿ“ฅ์„ค์น˜ํ•˜๊ธฐ

npm install react-router-dom

๐Ÿ‘Š์‚ฌ์šฉ ๋ฐฉ๋ฒ•

1 ) BrowserRouter๋กœ ๊ฐ์‹ธ์ฃผ๊ธฐ

2 ) Routes ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ์ฃผ๊ธฐ

3 ) Route๋ฅผ ์ƒ์„ฑ

BrowserRouter
๐Ÿ‘‰ HTML5 History API(pushState, replaceState ๋ฐ popstate ์ด๋ฒคํŠธ)๋ฅผ
์‚ฌ์šฉํ•˜์—ฌ UI๋ฅผ URL๊ณผ ๋™๊ธฐํ™”๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ด์คŒ

HTML5์˜ History API ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€
์ƒˆ๋กœ๊ณ ์นจ ํ•˜์ง€ ์•Š๊ณ ๋„ ์ฃผ์†Œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์คŒ
์ด๊ฑธ ํด๋ฆญํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ
ํŽ˜์ด์ง€๊ฐ€ ์™„์ „ ๋ฆฌํ”Œ๋ ˆ์‰ฌ ๋˜๋ฉด์„œ ์ด๋™์„ ํ•˜๊ฒŒ ๋จ
๋ฆฌ์•กํŠธ์—์„œ์˜ ๋ฌธ์ œ์ ์€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” state๊ฐ€ ์ดˆ๊ธฐํ™” ๋จ
๊ฐ–๊ณ  ์žˆ๋Š” state๋Š” ์œ ์ง€ํ•ด์ค˜์•ผ ํ•จ

Routes
์•ฑ์—์„œ ์ƒ์„ฑ๋  ๋ชจ๋“  ๊ฐœ๋ณ„ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ปจํ…Œ์ด๋„ˆ/์ƒ์œ„ ์—ญํ• ์„ ํ•จ
Route๋กœ ์ƒ์„ฑ๋œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ์ค‘์—์„œ ๋งค์นญ๋˜๋Š” ์ฒซ๋ฒˆ์งธ Route๋ฅผ ๋ Œ๋”๋งํ•ด์คŒ

Route
๋‹จ์ผ ๊ฒฝ๋กœ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋จ ( ๋‘๊ฐ€์ง€ ์†์„ฑ์„ ์ทจํ•จ )
path : ์›ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ URL ๊ฒฝ๋กœ๋ฅผ ์ง€์ •
์ด ๊ฒฝ๋กœ๋Š” ์ด๋ฆ„์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ •ํ•  ์ˆ˜ ์žˆ์Œ
์ฒซ๋ฒˆ์งธ ๊ฒฝ๋กœ ์ด๋ฆ„์ด ๋ฐฑ์Šฌ๋ž˜์‹œ(/)์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Œ
๊ฒฝ๋กœ ์ด๋ฆ„์ด ๋ฐฑ์Šฌ๋ž˜์‹œ์ธ ์ปดํฌ๋„ŒํŠธ๋Š” ์•ฑ์ด
์ฒจ ๋กœ๋“œ๋  ๋•Œ๋งˆ๋‹ค ๋จผ์ € ๋ Œ๋”๋ง ๋จ
์ด๋Š” ํ™ˆ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋จ์„ ์˜๋ฏธ

React Router Dom APIs

โ–ถ ์ค‘์ฒฉ ๋ผ์šฐํŒ… [Nested Router]

React Router์˜ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜,
๋ณต์žกํ•œ ๋ ˆ์ด์•„์›ƒ ์ฝ”๋“œ๋ฅผ ์–ด์ง€๋Ÿฝํž ํ•„์š”๊ฐ€ ์—†์Œ
๋Œ€๋ถ€๋ถ„์˜ ๋ ˆ์ด์•„์›ƒ์€ URL์˜ ์„ธ๊ทธ๋จผํŠธ์— ์—ฐ๊ฒฐ๋˜๋ฉฐ
React Router๋Š” ์ด๋ฅผ ์™„์ „ํžˆ ์ˆ˜์šฉํ•จ

localhost:3000/ ์—ฌ๊ธฐ๋กœ ์ ‘๊ทผํ–ˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ
์œ„์—์„œ ์–ด๋– ํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋ ๊นŒโ“

์‹คํ–‰ํ•˜๋ฉด App/Home ๋‘ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋จ
( indexโžกpath๋ฅผ ๊ฐ€์ ธ์˜ด )

localhost:3000/teams
๐Ÿ‘‰ App & Teams
์—ฌ๊ธฐ์„œ Team์€ 1.2.3.4... ์—ฌ๋Ÿฌ ๊ฐœ์˜ Team์ด ์žˆ์„๊ฑฐ์ž„
:teamId๋Š” ๋‹ค์ด๋‚˜๋ฏนํ•˜๊ฒŒ ํŒ€์˜ id๊ฐ€ ์˜ฌ ๊ฑฐ๋ผ๋Š” ๊ฒƒ
๐Ÿ‘‰ localhost:3000/teams/7 ( ์ด๋Ÿฐ ์‹์œผ๋กœ teams ๋’ค์— ์˜ฌ ๊ฒƒ )
์‹คํ–‰ํ•˜๋ฉด App & Teams & Team์ด ๋ Œ๋”๋ง ๋จ
NewTeamForm์ด ๋ Œ๋”๋ง ๋˜๋ ค๋ฉด ์–ด๋– ํ•œ ๊ฒฝ๋กœ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ• ๊นŒโ“
๐Ÿ‘‰ localhost:3000/teams/new

โ–ถ Outlet

์ž์‹ ๊ฒฝ๋กœ ์š”์†Œ ๋ Œ๋”๋งํ•˜๋ ค๋ฉดโ“
๐Ÿ‘‰ ๋ถ€๋ชจ ๊ฒฝ๋กœ ์š”์†Œ์—์„œ Outlet ํƒœ๊ทธ ์‚ฌ์šฉํ•ด์•ผ ํ•จโ—
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•˜์œ„ ๊ฒฝ๋กœ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ ์ค‘์ฒฉ๋œ UI ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Œ
๋ถ€๋ชจ ๋ผ์šฐํŠธ๊ฐ€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋ฉด ์ž์‹ ์ธ๋ฑ์Šค ๋ผ์šฐํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๊ฑฐ๋‚˜
์ธ๋ฑ์Šค ๋ผ์šฐํŠธ๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋ Œ๋”๋ง ํ•˜์ง€ ์•Š์Œ๐Ÿ™…โ€โ™€๏ธ
react-router-dom์—์„œ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉ๐Ÿ”ฅ

โ–ถ useNavigate

๊ฒฝ๋กœ ๋ฐ”๊ฟ”์คŒ navigate('/home') ===> localhost:3000/home์œผ๋กœ ๊ฐ

react-router-dom์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜โ—
ํ•จ์ˆ˜์ธ๋ฐ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๐Ÿ˜Ž

โ–ถ useParams

useParams HooksโžกRoute path์™€ ์ผ์น˜ํ•˜๋Š”
ํ˜„์žฌ URL์—์„œ ๋™์  ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํ‚ค/๊ฐ’ ์Œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜๐Ÿ”
:style ๋ฌธ๋ฒ•์„ path ๊ฒฝ๋กœ์— ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด useParams( )๋กœ ์ฝ์„ ์ˆ˜ ์žˆ์Œ
์•„๋ž˜๋Š” :invoiceId๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๊ธฐ์œ„ํ•ด useParams๋ฅผ ์‚ฌ์šฉํ–ˆ์Œ

โ–ถ useLocation

์ด Hooks ์ด์šฉํ•ด์„œ ํ˜„์žฌ URL ์ •๋ณด ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ
๐Ÿ‘‰ ํ˜„์žฌ ์œ„์น˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜๐Ÿ”
์ด๊ฒƒ์€ ํ˜„์žฌ ์œ„์น˜ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ผ๋ถ€
side effect ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Œ

โ–ถ useRoutes

useRoutes Hooks์™€ ์™€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋™์ผํ•˜์ง€๋งŒ
์š”์†Œ ๋Œ€์‹  JS ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฝ๋กœ๋ฅผ ์ •์˜
์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋Š” ์ผ๋ฐ˜ ์š”์†Œ์™€ ๋™์ผํ•œ ์†์„ฑ ๊ฐ–์ง€๋งŒ JSX ํ•„์š”ํ•˜์ง€ ์•Š์Œ์™ผ์ชฝ ์ฒ˜๋Ÿผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ ์ฒ˜๋Ÿผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Œ (์„ ํƒํ•ด์„œ ์‚ฌ์šฉ)

profile
์•ˆ๋…•ํ•˜์„ธ์š”! ํผ๋ธ”๋ฆฌ์‹ฑ & ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ๊ณต๋ถ€ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€