Routing

ํ•™์Šต ํ‚ค์›Œ๋“œ

  • HTML DOM API

    • Location

    • pathname

    • hash

    • search

  • Routing

    • MPA

    • SPA

    • SSR

    • CSR

HTML์˜ ๊ฐ elements์˜ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•ด๋‹น ์š”์†Œ๊ฐ€ ์˜์กดํ•˜๋Š” ๋ชจ๋“  ์ง€์› ์œ ํ˜• ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

HTML DOM API์— ํฌํ•จ ๋œ ๊ธฐ๋Šฅ

  • DOM์„ ํ†ตํ•œ HTML ์š”์†Œ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐ ์ œ์–ด.

  • ์–‘์‹ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐ ์กฐ์ž‘.

  • 2D ์ด๋ฏธ์ง€์˜ ์ฝ˜ํ…์ธ  ๋ฐ HTML canvas์˜ ๋งฅ๋ฝ๊ณผ ํ•ด๋‹น ์š”์†Œ ์œ„์— ๊ทธ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ƒํ˜ธ ์ž‘์šฉ.

  • HTML ๋ฏธ๋””์–ด ์š”์†Œ (audio๋ฐ video)์— ์—ฐ๊ฒฐ๋œ ๋ฏธ๋””์–ด ๊ด€๋ฆฌ.

  • ์›น ํŽ˜์ด์ง€์—์„œ ์ฝ˜ํ…์ธ  ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ.

  • ๋ธŒ๋ผ์šฐ์ € ํƒ์ƒ‰ ๊ธฐ๋ก์— ๋Œ€ํ•œ ์ ‘๊ทผ

    • Web Components, Web Storage, Web Workers, WebSocket ๋ฐ Server-sent events์™€ ๊ฐ™์€ ๊ธฐํƒ€ API์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ ์ธํ„ฐํŽ˜์ด์Šค ์ง€์›.

Location ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ์ฒด๊ฐ€ ์—ฐ๊ฒฐ๋œ ์žฅ์†Œ(URL)๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. Location ์ธํ„ฐํŽ˜์ด์Šค์— ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•˜๋ฉด ์—ฐ๊ฒฐ๋œ ๊ฐ์ฒด์—๋„ ๋ฐ˜์˜๋˜๋Š”๋ฐ, Document์™€ Window ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ด๋Ÿฐ Location์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ Document.location๊ณผ Window.location์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Location์€ ์ฆ‰ URL์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค๋Š”๊ฑธ ์˜๋ฏธ

๐Ÿค” Window.location์€ ๊ทธ๋Ÿผ ๋ฌด์—‡์ผ๊นŒ?

์ฝ๊ธฐ ์ „์šฉ ์†์„ฑ์œผ๋กœ, ๋ฌธ์„œ์˜ ํ˜„์žฌ ์œ„์น˜์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด Location ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ €๋‚ด์—์„œ ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ์œ„์น˜ URL์˜ ์ •๋ณด์— ๋Œ€ํ•ด ์•Œ ์ˆ˜ ์žˆ๋Š” ์†์„ฑ

/ ๋ฌธ์ž ๋’ค URL์˜ ๊ฒฝ๋กœ๋ฅผ ๊ฐ’์œผ๋กœ ํ•˜๋Š” DOMString

var url = new URL(
  "https://developer.mozilla.org/ko/docs/Web/API/URL/pathname?q=value",
);
var result = url.pathname; // "/ko/docs/Web/API/URL/pathname"

The hash property of the Location interface returns a string containing a '#' followed by the fragment identifier of the URL โ€” the ID on the page that the URL is trying to target.

# ๋ฌธ์ž ๋’ค URL์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ ์‹๋ณ„์ž๋ฅผ ๊ฐ’์œผ๋กœ ํ•˜๋Š” DOMString

hash์˜ ์“ฐ์ž„์ƒˆ

encodeURI('์˜ˆ์ œ')

'#%EC%98%88%EC%A0%9C'
decodeURI(location.hash)

'#์˜ˆ์ œ'

? ๋ฌธ์ž ๋’ค URL์˜ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ๊ฐ’์œผ๋กœ ํ•˜๋Š” DOMString

  • URLSearchParams ๋ฅผ ํ†ตํ•ด QueryString ๊ฐ€์ ธ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

// Further parsing:
const params = new URLSearchParams(queryString);
const q = parseInt(params.get("q")); // is the number 123

์–ด๋–ค ๋„คํŠธ์›Œํฌ ์•ˆ์—์„œ ํ†ต์‹  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ ์ตœ์ ์˜ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

  • ๋ผ์šฐํ„ฐ๊ฐ€ ์ˆ˜์‹ ํ•œ ํŒจํ‚ท์„ ์ตœ์ ์˜ ๊ฒฝ๋กœ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ชฉ์ ์ง€๊นŒ์ง€ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ์ผ๋ จ์˜ ๊ณผ์ •

Routing Diagram

โœ๐Ÿป Web์—์„œ ๋งํ•˜๋Š” Routing(๋ผ์šฐํŒ…)์ด๋ž€?

  • ์›น ์‚ฌ์ดํŠธ๋Š” URL์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์›น ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ณผ์ •์„ Routing ์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • (URL)๊ฒฝ๋กœ์— ๋”ฐ๋ผ ์•Œ๋งž์€ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ณผ์ • โ†’ Page Routing

Page Routing? ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ € URL์„ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด ์„œ๋ฒ„์—๊ฒŒ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๊ณ  ์„œ๋ฒ„๋กœ ์‘๋‹ต์€ ํŽ˜์ด์ง€ ์ •๋ณด๋ฅผ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋Š” ๊ณผ์ •์„ ํŽ˜์ด์ง€๋ผ์šฐํŒ… ์ด๋ผ๊ณ  ํ•œ๋‹ค.

๐Ÿค” React์—์„œ Routing ์ฒ˜๋ฆฌ๋ฅผ ๋ฐฐ์›Œํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

๐ŸŒ ์ „ํ†ต์ ์ธ Web์˜ ๋ฌธ์ œ์ 

์ „ํ†ต์ ์ธ Web ์„œ๋น„์Šค๋“ค์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด html์„ ๋ฐ›์•„์˜ค๊ณ , ํŽ˜์ด์ง€๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ CSS, JS, ์ด๋ฏธ์ง€ ํŒŒ์ผ ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋Š” MPA(Multi Page Application)๋ฐฉ์‹์ด์—ˆ๋‹ค.

Multi Page Application

โœ… SSR(Server Side Rendering) ๊ณผ MPA(Multi Page Application)๋Š” ๊ฐ™๋‹ค? MPA๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด HTML์„ ์ƒˆ๋กœ ๋ฐ›์•„์™€์„œ ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ์ „ํ†ต์ ์ธ ์›น ํŽ˜์ด์ง€ ๊ตฌ์„ฑ ๋ฐฉ์‹์„ ๋งํ•˜๊ณ  MPA๋ฐฉ์‹์—์„œ ์„œ๋ฒ„์—์„œ ์ด๋ฏธ ๋ Œ๋”๋ง ๋œ ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹์„ SSR์ด๋ผ๊ณ  ํ•œ๋‹ค.

MPA ์™€ SSR ์˜ ์ •์˜๋Š” ๋‹ค๋ฅด๋‹ค

๊ทธ๋Ÿฐ๋ฐ, ๋ชจ๋ฐ”์ผ ๋””๋ฐ”์ด์Šค ์‚ฌ์šฉ์ด ๋Š˜์–ด๋‚˜๋ฉด์„œ, MPA ๋ฐฉ์‹์˜ ๋‹จ์ ์ด ๋ถ€๊ฐ๋˜์—ˆ๋‹ค.

๐Ÿšจ ๋‹จ์  1

MPA ๋ฐฉ์‹์œผ๋กœ ํŠน์ • ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜๊ฒŒ ๋˜๋ฉด ๊ธฐ์กด์˜ ํŽ˜์ด์ง€๋Š” ์ œ๊ฑฐํ•˜๊ณ  ์‘๋‹ต์€ ํŽ˜์ด์ง€๋ฅผ ์ „์ฒด๋ฅผ ์ƒˆ๋กญ๊ฒŒ ํ™”๋ฉด์— ๋ Œ๋”๋ง ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ์ƒˆ๋กœ๊ณ ์นจ ๋˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ํ™”๋ฉด์ด ๊นœ๋นก์ด๊ฒŒ ๋œ๋‹ค. ํŽ˜์ด์ง€์— ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋™์ผํ•œ ์š”์†Œ๊ฐ€ ์žˆ๋”๋ผ๋„ ๋‹ค์‹œ ๊ทธ๋ ค๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ด๊ณ  ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ๋งค๋„๋Ÿฝ์ง€ ๋ชปํ•œ ํŽ˜์ด์ง€ ์ด๋™์„ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋œ๋‹ค.

๐Ÿšจ ๋‹จ์  2

๋˜ํ•œ ๋™์‹œ์— ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€์— ์ ‘์† ํ•  ๊ฒฝ์šฐ ์„œ๋ฒ„๋Š” ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€ํ•˜๊ฐ€ ๋งค์šฐ ์‹ฌํ•ด์ง€๊ฒŒ ๋œ๋‹ค. ๋ถ€ํ•˜๋กœ ์ธํ•ด ํ™”๋ฉด์— ๋กœ๋”ฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๊ณ , ์„œ๋ฒ„๊ฐ€ ํ„ฐ์ ธ ๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

MPA ๋‹จ์ 
MPA ๋‹จ์ 

๐ŸŒŽ SPA๊ฐ€ Web ์•ฑ์˜ ์‹œ๋Œ€๋ฅผ ์—ด๋‹ค

๊ทธ๋ ‡๋‹ค๋ฉด ๋งค๋ฒˆ ์„œ๋ฒ„์™€ ์š”์ฒญ์„ ์ฃผ๊ณ ๋ฐ›์ง€ ๋ง๊ณ , ์ฒ˜์Œ์— ๋ชจ๋‘ ๋‹ค์šด๋ฐ›์•„ ๋ณด์—ฌ์ฃผ๋ฉด ์–ด๋–จ๊นŒ?

์ด ๋ฐฉ์‹์ด ๋ฐ”๋กœ, React.js ๊ฐ™์€ SPA(Single Page Application)์ด๋‹ค.

SPA(Single Page Application)๋ฐฉ์‹์€ ์ตœ์ดˆ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด ๋จผ์ € ๊ธฐ๋ณธํ‹€์ธ ํ•˜๋‚˜์˜ HTML ๋ณด๋‚ด์ฃผ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŒŒ์ผ๋“ค์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์„œ ๋ฒˆ๋“ค๋ง ํ•œ ํ›„ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ํ›„์†์œผ๋กœ ์ „๋‹ฌํ•ด์ค€๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ํ›„์†์œผ๋กœ ์ „๋‹ฌ ๋ฐ›์€ ๋ฒˆ๋“ค๋ง ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋“ค์„ ์‹คํ–‰ํ•ด์„œ ํ™”๋ฉด์„ ๋ณด์—ฌ์ค€๋‹ค.

SPA Step1
SPA Step2

SPA๋ฐฉ์‹์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋งํฌ๋‚˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์„œ ํŽ˜์ด์ง€ ์ด๋™์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋งค๋ฒˆ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญํ–ˆ์—ˆ๋˜ MPA ๋ฐฉ์‹๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์„œ๋ฒ„์—๊ฒŒ๋Š” ์•„๋ฌด๋Ÿฐ ์š”์ฒญ๋„ ๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹ ์— ์ฒ˜์Œ ์ ‘์†ํ•  ๋•Œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์•˜๋˜ React App์„ ์ด์šฉํ•ด์„œ ์ž์ฒด์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€์— ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค๋กœ ํ™”๋ฉด์„ ๊ต์ฒดํ•œ๋‹ค.

โœ๐Ÿป ์ •๋ฆฌ

React๋Š” SPA(Single Page Application) ๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•œ๋‹ค. ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํŽ˜์ด์ง€ ๋ทฐ๋ฅผ ๋‹จ์ผ ํŽ˜์ด์ง€์—์„œ ๋™์ ์œผ๋กœ ๊ทธ๋ฆฌ๊ฒŒ ๋œ๋‹ค. ๋‹ค๋ฅธ ์ฃผ์†Œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ทฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š”๊ฒƒ์„ Routing ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๋ฆฌ์•กํŠธ ์ž์ฒด์—๋Š” ์ด ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ ๋˜์–ด์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป React ๋ผ์šฐํŒ… ๊ตฌํ˜„ํ•˜๊ธฐ

React์—์„œ๋Š” ํ•˜๋‚˜์˜ ์›น ํŽ˜์ด์ง€๋ฅผ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค๊ณ , URL์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณด์ด๊ฒŒ ํ•จ์œผ๋กœ์จ Routing์„ ๊ตฌํ˜„ํ•œ๋‹ค.

Example 1

import Header from './components/Header';
import Footer from './components/Footer';

import HomePage from './pages/HomePage';
import AboutPage from './pages/AboutPage';

function App() {
 const { pathname } = window.location; // url์—์„œ pathname ์ถ”์ถœ ํ•˜๋Š” ์†์„ฑ
 
 return (
  <div>
   <Header />
   <main>
    {pathname === '/' && <HomePage />} 
    {pathname === '/about' && <AboutPage />}
   </main>
   <Footer />
  </div>
 );
}

Example 2

import Header from './components/Header';
import Footer from './components/Footer';

import HomePage from './pages/HomePage';
import AboutPage from './pages/AboutPage';

const pages = {
  '/': HomePage,
  '/about': AboutPage,
};

export default function App() {
  const path = window.location.pathname;

  const Page = Reflect.get(pages, path) || HomePage;

  return (
    <div>
      <Header />
      <main>
        <Page />
      </main>
      <Footer />
    </div>
  );
}

๐Ÿ”— ์ฐธ๊ณ 

Last updated