โฐ [Ver1] 30๋ถ„ ๊ฐœ๋ฐœ ๋ฐ ํšŒ๊ณ  - ์‹œ๋งจํ‹ฑํƒœ๊ทธ, react-router-dom

โœŒ๐Ÿป ํšŒ๊ณ 

ํ”„๋กœ์ ํŠธ๋ฅผ ํ˜ผ์ž ์ง„ํ–‰ํ•œ๋‹ค๋Š” ๊ฑด ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์ง€ ์•Š๋‹ค.

์ธ๊ฐ•์„ ๋“ฃ๊ณ  ๋ธ”๋กœ๊ทธ์— ์ •๋ฆฌํ•˜๊ฑฐ๋‚˜, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์–ด๋ ต๊ฒŒ ๋А๊ปด์ง„๋‹ค.

 

ํŒ€ ๋‹จ์œ„ ํ”„๋กœ์ ํŠธ๋Š” ์ผ์ •๋„ ์žˆ๊ณ , ์—ญํ•  ๋ถ„๋‹ด๋„ ๋ช…ํ™•ํ•ด์„œ ์–ด๋А ์ •๋„ ์ฒด๊ณ„๋ฅผ ๊ฐ–์ถ”๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋Š” ์‹œ์ž‘๋ถ€ํ„ฐ ๋ฐฉํ–ฅ ์„ค์ •๊นŒ์ง€ ์ „๋ถ€ ํ˜ผ์ž ๊ฒฐ์ •ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

์กฐ๊ธˆ๋งŒ ๋ฐฉ์‹ฌํ•˜๋ฉด ๊ธˆ๋ฐฉ ๋‚˜ํƒœํ•ด์ง€๋Š” ๋А๋‚Œ์ด๋‹ค.

 

๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์•ž์œผ๋กœ ํ‰์ƒ ํ•™์Šตํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ, ๋Š์ž„์—†์ด ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ค์–ด๋‚ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ํ˜„์‹ค์ ์œผ๋กœ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ชฉํ‘œ๋ฅผ ์„ธ์šฐ๊ธฐ๋กœ ํ–ˆ๋‹ค.

ํ•˜๋ฃจ 30๋ถ„, ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์งง๊ฒŒ๋ผ๋„ ํšŒ๊ณ ๋ฅผ ๋‚จ๊ธด๋‹ค.

์ž‘์ง€๋งŒ ๊พธ์ค€ํžˆ ์‹ค์ฒœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฃจํ‹ด์„ ๋งŒ๋“ค์–ด๋ณด๋ ค ํ•œ๋‹ค.

 

์šฐ์„  ๋‚ด GitHub ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— What2Wear๋ผ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ํ•˜๋‚˜ ์žˆ๋‹ค.

๋‚ ์งœ์™€ ์ง€์—ญ์„ ์ž…๋ ฅํ•˜๋ฉด ๋‚ ์”จ ์ •๋ณด๋ฅผ ๋ฐ›์•„์™€, AI์—๊ฒŒ ์˜ท ์ถ”์ฒœ์„ ๋ฐ›๋Š” ์„œ๋น„์Šค๋‹ค.

(์‚ฌ์‹ค… ๊ทธ๋ƒฅ API ์—ฐ๋™ ์—ฐ์Šต ๊ฒธ ๋งŒ๋“  ๊ฑฐ๋ผ ์•„์ง์€ ๋ญ๊ฐ€ ์—†๋‹ค.)

 

ํ•˜์ง€๋งŒ ์ด ๋ ˆํฌ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

๋งค์ผ 30๋ถ„, ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ํšŒ๊ณ ๋ฅผ ๋‚จ๊ธด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•ด๊ฐ€๋ฉฐ, ํ”„๋กœ์ ํŠธ์˜ ๋ชธ์ง‘์„ ์ฒœ์ฒœํžˆ ๋ถˆ๋ ค๋ณผ ๊ณ„ํš์ด๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋ ค๋ฉด ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ ๋ช‡ ๊ฐœ๋กœ๋Š” ๋ถ€์กฑํ•˜๋‹ค.

์กฐ๊ธˆ ๋” ๋„“์€ ‘์„ธ๊ณ„๊ด€?’?์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ณ ,

์˜ค๋Š˜์€ ์‚ฌ์ด๋“œ๋ฐ”๋ฅผ ๋งŒ๋“ค์–ด ํŽ˜์ด์ง€๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

๋”ฑ ์ธ์Šคํƒ€๊ทธ๋žจ์ฒ˜๋Ÿผ, ๋ฉ”๋‰ด๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋‹ค๋ฅธ ํ™”๋ฉด์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋œจ๋Š” ๊ทธ๋Ÿฐ ๋А๋‚Œ.

 

(์š”์ฆ˜ “ํญ์‹น ์†์•˜์ˆ˜๋‹ค”์— ๋น ์ ธ์„œ ์ˆ์ธ ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๋ณด๊ณ  ์žˆ๋‹ค.

๋„ํŒŒ๋ฏผ ์ค‘๋…...

๊ท€ ํŒŒ๋Š” ์˜์ƒ, ๋ธ”๋ž™ํ—ค๋“œ ๋ฝ‘๋Š” ์˜์ƒ์€ ์†”์งํžˆ ๋งŽ์ด ๋ณด์ง„ ์•Š์•˜๋Š”๋ฐ…

์ด์ƒํ•˜๊ฒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ณ„์† ๋˜์ ธ์ค€๋‹ค...)

 

์–ด์จŒ๋“  ์˜ค๋Š˜์˜ ๋ชฉํ‘œ๋Š” ์ธ์Šคํƒ€๊ทธ๋žจ์ฒ˜๋Ÿผ ์‚ฌ์ด๋“œ๋ฐ”๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์ด ์ „ํ™˜๋˜๋Š” ๊ตฌ์กฐ,

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ CSR(Client Side Rendering) ๋ฐฉ์‹์œผ๋กœ ํŽ˜์ด์ง€๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐ”๋€Œ๋Š” ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ถ€๋ถ„ ๋ Œ๋”๋ง? ๋ผ์šฐํŒ…์„ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ๊ต์ฒด? ๋ญ ๊ทธ๋Ÿฐ ๊ฑฐ.

 

๋ฒŒ์จ 5๋ถ„์ด ์ง€๋‚ฌ๋‹ค.

์ƒ๊ฐ๋งŒ ํ•˜๋‹ค ์‹œ๊ฐ„ ๋‹ค ๋ณด๋‚ด์ง€ ๋ง๊ณ , ๋น ๋ฅด๊ฒŒ ์ž‘์—…์— ๋“ค์–ด๊ฐ€์ž.

 

์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ ค๋Š”๋ฐ, ๋ฌธ๋“ ์ด๋Ÿฐ ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค.

“Header ์ปดํฌ๋„ŒํŠธ๋Š” ์–ด๋””์„œ importํ•˜๋Š” ๊ฒŒ ๋งž์„๊นŒ?”

  • App.jsx์—์„œ ๊ณตํ†ต์œผ๋กœ importํ•ด์„œ ์ „์ฒด์— ํ•ญ์ƒ ๋ณด์—ฌ์ฃผ๊ฒŒ ํ• ๊นŒ?
  • ์•„๋‹ˆ๋ฉด ๊ฐ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์™€์•ผ ํ• ๊นŒ?

์ด๊ฑด ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ, ๊ทœ๋ชจ, ๊ทธ๋ฆฌ๊ณ  ๋ผ์šฐํŒ… ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๋ฆฌ์•กํŠธ ์•ฑ์—์„œ๋Š” ๋ณดํ†ต App.jsx ๋˜๋Š” Layout.jsx์—์„œ importํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

 

๊ทธ ์ด์œ ๋Š” ๋‹จ์ˆœํ•˜๋‹ค.

  • ํ—ค๋”๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ๊ณตํ†ต์œผ๋กœ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๊ณ ,
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ํŽ˜์ด์ง€๋งˆ๋‹ค ์ค‘๋ณตํ•ด์„œ importํ•˜๋Š” ๊ฑด ๋น„ํšจ์œจ์ ์ด๊ณ , ์œ ์ง€๋ณด์ˆ˜์—๋„ ์ข‹์ง€ ์•Š๋‹ค.

 

๋Œ€๋ถ€๋ถ„์€ ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ ์ปดํฌ๋„ŒํŠธ์— Header, Sidebar ๊ฐ™์€ ์š”์†Œ๋ฅผ ํฌํ•จ์‹œํ‚จ ๋‹ค์Œ,

๊ทธ ์•„๋ž˜์— <Outlet />์ด๋‚˜ <Routes>๋กœ ๋ผ์šฐํŒ…๋˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

 

์‚ฌ์‹ค ๋„ˆ๋ฌด ๋‹น์—ฐํ•œ ๋ฐฉ์‹์ด๋‹ค.

์ค‘๋ณต์„ ์ค„์ด๊ณ , ๊ณตํ†ต ๊ตฌ์กฐ๋ฅผ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.

 

๊ทผ๋ฐ ์ตœ๊ทผ์— ์–ด๋””์„ ๊ฐ€ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ์—์„œ Header๋ฅผ ์ง์ ‘ importํ•ด์„œ ์“ฐ๋Š” ์ฝ”๋“œ๋ฅผ ๋ณธ ์ ์ด ์žˆ๋‹ค.

๊ทธ๊ฑธ ๋ณด๊ณ  ์ž ๊น ์˜๋ฌธ์ด ์ƒ๊ฒผ๋‹ค.

“์–ด? ์ด๋ ‡๊ฒŒ ํ•ด๋„ ๋˜๋‚˜…? ์˜คํžˆ๋ ค ์ด๊ฒŒ ๋” ์œ ์—ฐํ•œ ๋ฐฉ์‹์ธ๊ฐ€?” ํ•˜๊ณ ...(์ง„์งœ์ž„)

 

๊ฒฐ๊ตญ ๋‚ด ๊ฒฐ๋ก ์€ ์ด๋ ‡๋‹ค:

“์˜๋„์ ์œผ๋กœ ํ•œ์ •๋œ ํŽ˜์ด์ง€์—๋งŒ Header๋ฅผ ๋ณด์ด๊ฒŒ ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ํŽ˜์ด์ง€๋ณ„๋กœ importํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ,

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๋Š” App ๋˜๋Š” Layout ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ณตํ†ต์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒŒ ๋งž๋‹ค.”

 

์˜ค๋Š˜ 30๋ถ„ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉฐ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด๋ฉด ์ข‹๊ฒ ๋‹ค๊ณ  ๋А๋‚€ ์ฃผ์ œ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.


๐Ÿ“š ์ •๋ฆฌ

์‹œ๋งจํ‹ฑ ํƒœ๊ทธ(Sementic HTML)

์˜๋ฏธ(semantic)๋ฅผ ๊ฐ€์ง„ HTML ํƒœ๊ทธ๋กœ,

ํƒœ๊ทธ ์ž์ฒด๋งŒ์œผ๋กœ ์ด ์˜์—ญ์ด ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ํƒœ๊ทธ

 

์˜ˆ์ „์—๋Š” <div>, <span>๋งŒ ์จ์„œ ๋ชจ๋“  ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑํ–ˆ์ง€๋งŒ,

HTML5๋ถ€ํ„ฐ๋Š” ๊ตฌ์กฐ์  ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๋งจํ‹ฑ ํƒœ๊ทธ๊ฐ€ ๋„์ž…

 

์‹œ๋งจํ‹ฑ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

๋ชฉ์  ์„ค๋ช…
์˜๋ฏธ ์žˆ๋Š” ๊ตฌ์กฐ ์ œ๊ณต ํƒœ๊ทธ๋งŒ ๋ณด๊ณ ๋„ ์ฝ˜ํ…์ธ ์˜ ์—ญํ• ์„ ์•Œ ์ˆ˜ ์žˆ์Œ
๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™” (SEO) ๊ฒ€์ƒ‰ ์—”์ง„์ด ํŽ˜์ด์ง€ ๊ตฌ์กฐ๋ฅผ ๋” ์ž˜ ํŒŒ์•…ํ•จ
์ ‘๊ทผ์„ฑ ํ–ฅ์ƒ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”๊ฐ€ ์ฝ˜ํ…์ธ ์˜ ๊ตฌ์กฐ๋ฅผ ์ •ํ™•ํžˆ ์ธ์‹
์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง€๊ณ  ํ˜‘์—…์— ์œ ๋ฆฌํ•จ

 

๋Œ€ํ‘œ์ ์ธ ์‹œ๋งจํ‹ฑ ํƒœ๊ทธ

ํƒœ๊ทธ ์—ญํ•  ๋ฐ ์˜๋ฏธ ์˜ˆ์‹œ
<header> ํŽ˜์ด์ง€๋‚˜ ์„น์…˜์˜ ๋จธ๋ฆฌ๋ง ๋กœ๊ณ , ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฉ”๋‰ด ๋“ฑ
<nav> ์‚ฌ์ดํŠธ ๋‚ด ์ฃผ์š” ํƒ์ƒ‰ ๋งํฌ ์˜์—ญ ์‚ฌ์ด๋“œ๋ฐ”, ์ƒ๋‹จ ๋ฉ”๋‰ด ๋“ฑ
<main> ๋ณธ๋ฌธ์˜ ํ•ต์‹ฌ ์ฝ˜ํ…์ธ  ์˜์—ญ ์ค‘๋ณต ์—†์ด ํ•œ ํŽ˜์ด์ง€์— ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ
<section> ์ฃผ์ œ๋ณ„ ๊ตฌํš ๋‰ด์Šค ๋ชฉ๋ก, ์„œ๋น„์Šค ์†Œ๊ฐœ ๋“ฑ
<article> ๋…๋ฆฝ์ ์ธ ์ฝ˜ํ…์ธ  ๋ฌถ์Œ ๋ธ”๋กœ๊ทธ ๊ธ€, ๊ฒŒ์‹œ๊ธ€ ๋“ฑ
<aside> ๋ณด์กฐ ์ฝ˜ํ…์ธ  ๊ด‘๊ณ , ์ถ”์ฒœ ๊ธ€, ์‚ฌ์ด๋“œ ์ฝ˜ํ…์ธ 
<footer> ๊ผฌ๋ฆฌ๋ง ์˜์—ญ ์—ฐ๋ฝ์ฒ˜, ์ €์ž‘๊ถŒ, ์‚ฌ์ดํŠธ ์ •๋ณด ๋“ฑ

 

์˜ˆ์‹œ

<body>
  <header>
    <h1>๋กœ๊ณ </h1>
    <nav>
      <ul>
        <li><a href="/">ํ™ˆ</a></li>
        <li><a href="/about">์†Œ๊ฐœ</a></li>
      </ul>
    </nav>
  </header>

  <main>
    <section>
      <h2>์˜ค๋Š˜์˜ ๋‰ด์Šค</h2>
      <article>
        <h3>๋‰ด์Šค ์ œ๋ชฉ</h3>
        <p>๋‰ด์Šค ๋ณธ๋ฌธ...</p>
      </article>
    </section>

    <aside>
      <h3>๊ด‘๊ณ </h3>
    </aside>
  </main>

  <footer>
    <p>© 2025 ๋‚˜์˜ ์›น์„œ๋น„์Šค</p>
  </footer>
</body>
  • <main>์€ ํŽ˜์ด์ง€๋‹น ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
  • <article>์€ ๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ˜ํ…์ธ ์ผ ๋•Œ ์‚ฌ์šฉ (๋Œ“๊ธ€์€ X, ๋ธ”๋กœ๊ทธ ๊ธ€์€ O)
  • <section>์€ ์ œ๋ชฉ(<h2>, <h3>)์ด ์žˆ์–ด์•ผ ์ž์—ฐ์Šค๋Ÿฌ์›€
  • ์‹œ๋งจํ‹ฑ ํƒœ๊ทธ ์•ˆ์— <div>๋ฅผ ํ•จ๊ป˜ ์จ๋„ ๋จ → ๊ตฌ์กฐ ์žก๋Š” ์šฉ๋„

 

์ •๋ฆฌ

  • ์‹œ๋งจํ‹ฑ ํƒœ๊ทธ๋Š” HTML์— ๊ตฌ์กฐ์™€ ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ํƒœ๊ทธ์ด๋ฉฐ, SEO, ์ ‘๊ทผ์„ฑ, ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ๊ผญ ์•Œ์•„์•ผ ํ•  ํ•ต์‹ฌ ์š”์†Œ

react-router-dom

๋ฆฌ์•กํŠธ์—์„œ ํŽ˜์ด์ง€ ์ „ํ™˜, ์ฃผ์†Œ(URL)์— ๋”ฐ๋ฅธ ์ปดํฌ๋„ŒํŠธ ์ „ํ™˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ฆ‰, ๋ฆฌ์•กํŠธ ์•ฑ์—์„œ ๋ผ์šฐํŒ…(Routing)์„ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ

 

ํ•„์š” ์ด์œ 

๋ฆฌ์•กํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ SPA(Single Page Application)

ํ•œ ๋ฒˆ๋งŒ HTML์„ ๋กœ๋”ฉํ•˜๊ณ , ํŽ˜์ด์ง€๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ปดํฌ๋„ŒํŠธ๋งŒ ๋ฐ”๋€œ.

 

์ด๊ฑธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒŒ ๋ฐ”๋กœ react-router-dom

  • ์‚ฌ์šฉ์ž๊ฐ€ URL์„ ๋ฐ”๊พธ๋ฉด
  • ๊ทธ์— ๋งž๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋„๋ก ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

๊ธฐ๋ณธ ์‚ฌ์šฉ ๊ตฌ์กฐ (React Router v6 ๊ธฐ์ค€)

1. ์ตœ์ƒ๋‹จ์—์„œ <BrowserRouter>๋กœ ๊ฐ์‹ธ๊ธฐ

// main.jsx or main.tsx
import { BrowserRouter } from 'react-router-dom';
import App from './App';

<BrowserRouter>
  <App />
</BrowserRouter>

( ์˜ค๋Š˜ ํ”„๋กœ์ ํŠธํ•˜๋ฉด์„œ ์ด๊ฑธ ๊นŒ๋จน๋Š” ๋ฐ”๋žŒ์— ํ•œ๋™์•ˆ ๋นˆ ํ™”๋ฉด๋งŒ ๋‚˜์™”๋‹ค… )

 

2. App.jsx์—์„œ ๋ผ์šฐํŒ… ์ •์˜ํ•˜๊ธฐ

// App.jsx
import { Routes, Route } from 'react-router-dom';
import Home from './pages/Home';
import About from './pages/About';

function App() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/about" element={<About />} />
    </Routes>
  );
}

 

 

3. Link ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋™ํ•˜๊ธฐ (์ƒˆ๋กœ๊ณ ์นจ ์—†์ด)

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

<Link to="/">ํ™ˆ</Link>
<Link to="/about">์†Œ๊ฐœ</Link>

 

ํ•ต์‹ฌ ๊ฐœ๋…

๊ตฌ์„ฑ์š”์†Œ ์„ค๋ช…
<BrowserRouter> ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ๋Š” ๋ฃจํŠธ
<Routes> ์—ฌ๋Ÿฌ Route๋ฅผ ๊ฐ์‹ธ๋Š” ์ปจํ…Œ์ด๋„ˆ
<Route path="..." element={...} /> URL์— ๋”ฐ๋ผ ๋ณด์—ฌ์ค„ ์ปดํฌ๋„ŒํŠธ ์ •์˜
<Link to="..."> ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ์ด๋™
useNavigate() JS ์ฝ”๋“œ์—์„œ ๊ฒฝ๋กœ ์ด๋™
<Outlet> ์ž์‹ Route๊ฐ€ ๋ Œ๋”๋ง๋  ์œ„์น˜ ์ง€์ • (Nested Routing)

 

์ •๋ฆฌ

  • react-router-dom์€ SPA ํ™˜๊ฒฝ์—์„œ ๋ผ์šฐํŒ…์„ ๊ตฌํ˜„ํ•˜๋Š” ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ณ , ํŽ˜์ด์ง€ ์ „ํ™˜์„ ์œ„ํ•ด <Routes>, <Route>, <Link> ๋“ฑ์„ ์ ์ ˆํžˆ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉ