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์ ์ฐ์์
#id๋ฅผ ํ์ฉํด ํด๋ฆญ ํ ๋ ์ง์ ํ Anchor๋ก ์ด๋
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
์ด๋ค ๋คํธ์ํฌ ์์์ ํต์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋ ์ต์ ์ ๊ฒฝ๋ก๋ฅผ ์ ํํ๋ ๊ณผ์ ์ด๋ค.
๋ผ์ฐํฐ๊ฐ ์์ ํ ํจํท์ ์ต์ ์ ๊ฒฝ๋ก๋ก ์ ๋ฌํ๊ธฐ ์ํ ๊ณผ์
๋ฐ์ดํฐ๋ฅผ ๋ชฉ์ ์ง๊น์ง ์ ๋ฌํ๊ธฐ ์ํ ๋ชจ๋ ์ผ๋ จ์ ๊ณผ์
โ๐ป Web์์ ๋งํ๋ Routing(๋ผ์ฐํ
)์ด๋?
์น ์ฌ์ดํธ๋ URL์ ๋ฐ๋ผ ๋ค๋ฅธ ์น ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค๋ค. ์ด์ ๊ฐ์ ๊ณผ์ ์
Routing
์ด๋ผ๊ณ ํ๋ค.(URL)๊ฒฝ๋ก์ ๋ฐ๋ผ ์๋ง์ ํ์ด์ง๋ฅผ ๋ ๋๋ง ํ๋ ๊ณผ์ โ
Page Routing
Page Routing? ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ URL์ ์ ๋ ฅํ๊ฒ ๋๋ฉด ์๋ฒ์๊ฒ ํ์ด์ง์ ๋ํ ์ ๋ณด๋ฅผ ์์ฒญํ๊ณ ์๋ฒ๋ก ์๋ต์ ํ์ด์ง ์ ๋ณด๋ฅผ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๊ณผ์ ์ ํ์ด์ง๋ผ์ฐํ ์ด๋ผ๊ณ ํ๋ค.
๐ค React์์ Routing ์ฒ๋ฆฌ๋ฅผ ๋ฐฐ์ํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น?
๐ ์ ํต์ ์ธ Web์ ๋ฌธ์ ์
์ ํต์ ์ธ Web ์๋น์ค๋ค์ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ ๋๋ง๋ค ์๋ก์ด html์ ๋ฐ์์ค๊ณ , ํ์ด์ง๋ฅผ ๋ก๋ฉํ ๋๋ง๋ค ์๋ฒ์์ CSS, JS, ์ด๋ฏธ์ง ํ์ผ ๋ฑ์ ๋ฆฌ์์ค๋ฅผ ์ ๋ฌ๋ฐ์ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ MPA(Multi Page Application)
๋ฐฉ์์ด์๋ค.

โ SSR(Server Side Rendering) ๊ณผ MPA(Multi Page Application)๋ ๊ฐ๋ค? MPA๋ ์๋ฒ๋ก๋ถํฐ ์๋ก์ด HTML์ ์๋ก ๋ฐ์์์ ํ์ด์ง ์ ์ฒด๋ฅผ ๋ ๋๋ง ํ๋ ์ ํต์ ์ธ ์น ํ์ด์ง ๊ตฌ์ฑ ๋ฐฉ์์ ๋งํ๊ณ MPA๋ฐฉ์์์ ์๋ฒ์์ ์ด๋ฏธ ๋ ๋๋ง ๋ ์ ์ ๋ฆฌ์์ค๋ฅผ ๋ฐ์์ค๋ ๋ฐฉ์์ SSR์ด๋ผ๊ณ ํ๋ค.

๊ทธ๋ฐ๋ฐ, ๋ชจ๋ฐ์ผ ๋๋ฐ์ด์ค ์ฌ์ฉ์ด ๋์ด๋๋ฉด์, MPA ๋ฐฉ์์ ๋จ์ ์ด ๋ถ๊ฐ๋์๋ค.
๐จ ๋จ์ 1
MPA ๋ฐฉ์์ผ๋ก ํน์ ํ์ด์ง๋ฅผ ์์ฒญํ๊ฒ ๋๋ฉด ๊ธฐ์กด์ ํ์ด์ง๋ ์ ๊ฑฐํ๊ณ ์๋ต์ ํ์ด์ง๋ฅผ ์ ์ฒด๋ฅผ ์๋กญ๊ฒ ํ๋ฉด์ ๋ ๋๋ง ํ๊ฒ ๋๋ฉด์ ์๋ก๊ณ ์นจ ๋๋ ๊ฒ ์ฒ๋ผ ํ๋ฉด์ด ๊น๋นก์ด๊ฒ ๋๋ค. ํ์ด์ง์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ๋์ผํ ์์๊ฐ ์๋๋ผ๋ ๋ค์ ๊ทธ๋ ค๋ด๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ด๊ณ ์ฌ์ฉ์ ์ ์ฅ์์๋ ๋งค๋๋ฝ์ง ๋ชปํ ํ์ด์ง ์ด๋์ ๊ฒฝํํ๊ฒ ๋๋ค.
๐จ ๋จ์ 2
๋ํ ๋์์ ๋ง์ ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ ์ ํ ๊ฒฝ์ฐ ์๋ฒ๋ ๋ชจ๋ ์์ฒญ์ ๋ํ ์๋ต์ ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ถํ๊ฐ ๋งค์ฐ ์ฌํด์ง๊ฒ ๋๋ค. ๋ถํ๋ก ์ธํด ํ๋ฉด์ ๋ก๋ฉ์ด ๋ฐ์ํ๊ฒ ๋๊ณ , ์๋ฒ๊ฐ ํฐ์ ธ ๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.


๐ SPA๊ฐ Web ์ฑ์ ์๋๋ฅผ ์ด๋ค
๊ทธ๋ ๋ค๋ฉด ๋งค๋ฒ ์๋ฒ์ ์์ฒญ์ ์ฃผ๊ณ ๋ฐ์ง ๋ง๊ณ , ์ฒ์์ ๋ชจ๋ ๋ค์ด๋ฐ์ ๋ณด์ฌ์ฃผ๋ฉด ์ด๋จ๊น?
์ด ๋ฐฉ์์ด ๋ฐ๋ก, React.js ๊ฐ์ SPA(Single Page Application)์ด๋ค.
SPA(Single Page Application)
๋ฐฉ์์ ์ต์ด ์์ฒญ์ด ๋ค์ด์ค๊ฒ ๋๋ฉด ๋จผ์ ๊ธฐ๋ณธํ์ธ ํ๋์ HTML ๋ณด๋ด์ฃผ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ผ๋ค์ ํ๋๋ก ๋ฌถ์ด์ ๋ฒ๋ค๋ง ํ ํ ๋ธ๋ผ์ฐ์ ์๊ฒ ํ์์ผ๋ก ์ ๋ฌํด์ค๋ค. ๋ธ๋ผ์ฐ์ ๋ ํ์์ผ๋ก ์ ๋ฌ ๋ฐ์ ๋ฒ๋ค๋ง ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ค์ ์คํํด์ ํ๋ฉด์ ๋ณด์ฌ์ค๋ค.


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