โ SPA(Single Page Application) ์ดํดํ๊ธฐ
ํ์ด์ง ์ด๋์ ๊ณผ์ ์ ๊ฐ์ฅ ๋จ์ํ๊ฒ ์ค๋ช
ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฌ์ฉ์๊ฐ ์๋ก์ด url์ ์์ฒญํ๋ค. (์๋ก์ด ํ์ด์ง๋ก ์ด๋ํ๋ ๋ฒํผ์ ํด๋ฆญํ๊ฑฐ๋, ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ ๋ฑ)
- ์์ฒญํ url์ ๋ง๋ ๋ฆฌ์์ค(html, css, js)๋ฅผ
- ํ๋ฉด์ ๋ ๋๋งํ๋ค.
๊ฐ๋จํ์ฃ ?
MPA(Multiple Page Application), SPA(Single Page Application) ๋ชจ๋ ํ์ด์ง ์ด๋์ ๊ณจ์๋ ๋์ผํฉ๋๋ค. ๋ค๋ง ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ ๋ฐฉ์์ ๋ฐ๋ผ MPA์ SPA๋ก ๊ตฌ๋ถ์ด ๋ฉ๋๋ค.
MPA์ ๋ฆฌ์์ค ์์ฒญ ๋ฐฉ์
- ์ฌ์ฉ์๊ฐ ์๋ก์ด url์ ์์ฒญ
- ํด๋น url์ ๋ํ ๋ฆฌ์์ค๋ฅผ ์๋ฒ์ ์์ฒญ
- ์๋ฒ์์ ๋ฐ์ ์๋ต์ผ๋ก ํ๋ฉด์ ๋ ๋๋ง
์ฆ, ํ์ด์ง๋ฅผ ์ด๋ํ ๋๋ง๋ค ์๋ฒ์ ํด๋น ํ์ด์ง ์ ์ฒด์ ๋ํ ๋ฆฌ์์ค๋ฅผ ์์ฒญํฉ๋๋ค. ์ด ๊ณผ์ ์์ ์๋ก๊ณ ์นจ์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ๋ํ ํ ํ์ด์ง ์ ์ฒด๋ฅผ ์์ฒญํ๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ํ์ด์ง๋ค์์ ์ค๋ณต๋๋ ์์๊ฐ ์์ ๊ฒฝ์ฐ(ex ๋ด๋น๊ฒ์ด์
๋ฐ) ์ค๋ณต๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ฒ ์์ฒญํ๊ฒ ๋ฉ๋๋ค.
์ต์ปค(a) ํ๊ทธ๋ฅผ ์ด์ฉํ ํ์ด์ง ์ด๋ ๋ฐฉ์์ ๋ ์ฌ๋ฆฌ๋ฉด ์ดํด๊ฐ ๋์ค๊ฒ๋๋ค.
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/service.html">Service</a></li>
<li><a href="/about.html">About</a></li>
// ํด๋ฆญ ์ ์๋ฒ์ '/about.html'์ ํด๋นํ๋ ๋ฆฌ์์ค๋ฅผ ์์ฒญ
</ul>
</nav>
์ฐธ๊ณ ๋ก ํด๋น ๋ฐฉ์์ ์๋ฒ ๋จ์์ ์์ฑํด์ค html์ ๊ทธ๋๋ก ๋ ๋๋งํ๋ค๋ ์ ์์ SSR(Server Side Rendering)์ด๋ผ๊ณ ๋ ์นญํฉ๋๋ค. ๋ฐ๋ฉด SPA์ ๋ฆฌ์์ค ์์ฒญ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
SPA์ ๋ฆฌ์์ค ์์ฒญ ๋ฐฉ์
- ์ฒซ ํ์ด์ง ์์ฒญ ์, ํด๋น ์ดํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์๋ฒ์ ์์ฒญ
- ์ฌ์ฉ์๊ฐ ์๋ก์ด url์ ์์ฒญ
- ํด๋น url์ ๋ํ ๋ฆฌ์์ค๋ฅผ ํด๋ผ์ด์ธํธ๊ฐ ๋์ ์ผ๋ก ์์ฑ(1๋ฒ์์ ๋ฐ์ ๋ฆฌ์์ค๋ฅผ ํ์ฉํด์)
- ์์ฑํ ๋ฆฌ์์ค๋ก ํ๋ฉด์ ๋ ๋๋ง
“url์ ์์ฒญํ๋ฉด url์ ๋ง๋ ๋ฆฌ์์ค๋ฅผ ๋ณด๋ด์ค๋ค” ๋ผ๋ ์๋ฒ์ ์ญํ ์ ํด๋ผ์ด์ธํธ๊ฐ ์ผ์ ๋ถ๋ถ ๋์ฒดํ๋ค๊ณ ๋ณผ ์ ์๊ฒ ๋ค์! ์๋ก๊ณ ์นจ ์์ด ํ ํ์ด์ง ๋ด์์ ๋ฆฌ์์ค๋ฅผ ๋ฐ๊ฟ ๋ผ์ฐ๊ธฐ๋ง ํ๋ ๋ฐฉ์์ด๋ผ Single Page Application์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
๐๐ปโ๏ธ ๋ผ์ฐํ
์ด๋?
์ดํ๋ฆฌ์ผ์ด์ ์์์ ๋ผ์ฐํ ์ ํ ๋ฌธ์ฅ์ผ๋ก ์ ์ํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์์ฒญํ URL ๋๋ ์ด๋ฒคํธ๋ฅผ ํด์ํด, ํ์ด์ง๋ฅผ ์ ํํ๋ ์ผ๋ จ์ ํ์
์ฌ์ฉ์์ ํ์์ ๋ฐ๋ผ ์ฌ์ฉ์๋ฅผ ์๋ง์ ๊ฒฝ๋ก๋ก ๋ณด๋ด์ฃผ๋ ๊ฒ! ์ ๋๋ก ์ดํดํ ์ ์๊ฒ ๋ค์. "route"์ ์ฌ์ ์ ์ ์์๋ ์ผ์นํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด router ๋ผ๋ ๊ฒ์ route๋ฅผ ๋ด๋นํ๋ ๋๊ตฌ๋ฅผ ์๋ฏธํ๊ฒ ๋ค์.
๐ก ๊ตฌํ ํต์ฌ ์์ด๋์ด
SPA์ ๋ผ์ฐํ ์ ๋ํด ์ดํดํ์ จ๋ค๋ฉด, ์ด์ ๊ตฌํ์ ํด๋ด ์๋ค! ๊ตฌํ์ ํต์ฌ ์์ด๋์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
routes ๋ฐฐ์ด
url(path)๊ณผ ์ปดํฌ๋ํธ๋ฅผ 1:1 ๋งคํํ๋ ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค. routes
๋ผ๊ณ ์นญํ๊ฒ ์ต๋๋ค. ์๋ ์ด๋ฏธ์ง์ ๊ฐ์ ๋ฐฉ์์
๋๋ค. ์ด๋ ์ปดํฌ๋ํธ๋ ์์์ ๋งํ๋ ๋ฆฌ์์ค(html, css, js)์ ์งํฉ์ฒด๋ผ๊ณ ํ ์ ์๊ฒ ์ฃ .
url์ ๋ฐ๋ผ ์ปดํฌ๋ํธ ๊ต์ฒดํ๊ธฐ
url์ ๋ฐ๋ผ main.App
์์์ innerHTML์ ๊ต์ฒด ํฉ๋๋ค. ์ด๋ 1๋ฒ์์ ์ ์ธํ routes
๋ฐฐ์ด์ ์ฐธ์กฐํฉ๋๋ค. ๋ง์ฝ ‘/about’ ์ด๋ผ๋ url์ด ์์ฒญ๋๋ค๋ฉด, routes
๋ฐฐ์ด์์ ‘/about’์ ํด๋นํ๋ ์ปดํฌ๋ํธ๋ฅผ ์ฐพ์ main.App
์ ํ์์ ๋ ๋๋งํฉ๋๋ค.
ํ ํ์ด์ง ๋ด์์ ๋ฆฌ์์ค๋ง ๊ฐ์๋ผ์ด๋ค ๋ผ๋ ๋ง์ด ์ด์ ์ดํด๊ฐ ๋์๋์?
// index.html
<html>
<body>
<main class="App"></main> // ์ด ์์์ innerHTML์ ๋ณ๊ฒฝํ ๊ฒ๋๋ค.
<script type="module" src="./src/main.js"></script>
</body>
</html>
History API๋ก url ๋ณ๊ฒฝ ์์ฒญํ๊ธฐ
์ฃผ์์ฐฝ์ url์ ๋ณ๊ฒฝํ๋, ์๋ฒ๋ก ์ง์ http ์์ฒญ์ ๋ณด๋ด์๋ ์๋ฉ๋๋ค. (๊ทธ๊ฑด SPA๊ฐ ์๋๋๊น์!) ์ด๋ป๊ฒ ์๋ฒ ์์ฒญ ์์ด url๋ง ๋ณ๊ฒฝํ ์ ์์๊น์?
History API๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค! History ๊ฐ์ฒด๋ Web API์ ์ผ์ข
์ผ๋ก, Window
๊ฐ์ฒด๋ฅผ ํตํด ์ ๊ทผํ ์ ์์ต๋๋ค. history ๊ฐ์ฒด์ pushState ๋ฉ์๋๋ ์ฃผ์์ฐฝ์ url์ ๋ณ๊ฒฝํ๊ณ , ํด๋น url์ ๋ธ๋ผ์ฐ์ ์ ์ธ์
๊ธฐ๋ก์ ์ถ๊ฐํ์ง๋ง, ์๋ฒ๋ก http ์์ฒญ์ ํ์ง๋ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ต์ปค ํ๊ทธ ๋์ history.pushState()
๋ฅผ ์ฌ์ฉํด url์ ๋ณ๊ฒฝํ๊ณ , ํด๋น ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํด ๋ณ๊ฒฝ๋ url์ ๋ง๋ ์ปดํฌ๋ํธ๋ฅผ routes
๋ฐฐ์ด์์ ์ฐพ์ ๋ ๋๋ง ํด๋ณด๊ฒ ์ต๋๋ค.
๐ฉ๐ป๐ป ์ค์ ๊ตฌํ
index.html, main.js, ์ปดํฌ๋ํธ ์์ฑ
์ฐ์ index.html ํ์ผ์ ์์ฑํด์ค๋๋ค! head ํ๊ทธ๋ ํธ์์ ์๋ตํ์ต๋๋ค.
Home, About ํ์ด์ง์ ํด๋นํ๋ ์ปดํฌ๋ํธ๋ค๋ ๋ง๋ค์ด์ค๊ฒ์. ๊ฐ ํ์ผ์์ ๋ด๋ณด๋ธ(export) ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ค์ ์ถํ์ routes ๋ฐฐ์ด์ ๋ฑ๋ก ํด์ค๊ฑฐ์์. template ๋ฉ์๋๋ ํด๋น ์ปดํฌ๋ํธ์ ๋งํฌ์ ์ ๋ฆฌํดํฉ๋๋ค.
routes ๋ฐฐ์ด ์์ฑ
path์ ์ปดํฌ๋ํธ์ ๋งคํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ routes ๋ฐฐ์ด์ ๋ง๋ค์ด ๋ด ์๋ค. ์ ๊ฐ์ ๊ฒฝ์ฐ path๋ช ์ผ๋ก ๋ฐ๋ก ์ ๊ทผํ๊ณ ์ถ์ด์ ๋ฐฐ์ด ๋์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ต๋๋ค~
์ฑ์ ์ฒซ ๊ตฌ๋ ์์๋ "/" ์ ํด๋นํ๋ Home ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง ํฉ๋๋ค.
history.pushState๋ฅผ ์ด์ฉํ url๋ณ๊ฒฝ ๊ตฌํ
Home, About ํ์ด์ง์ ๋ฒํผ์ด ํด๋ฆญ๋์ ๋ ์ด changeUrl
ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค. ์ด๋ฒคํธ๋ฆฌ์ค๋๋ฅผ ์ฌ์ฉํด ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํด์ฃผ๊ฒ ์ต๋๋ค.
url๊ณผ ํ๋ฉด์ด ์ ๋ณ๊ฒฝ๋๊ณ ์์ฃ ?
๋ค๋ก๊ฐ๊ธฐ ๊ตฌํ
๋ค๋ก๊ฐ๊ธฐ์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ์์ฒด์ ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ์ ํตํด ์ด๋ค์ง๊ธฐ ๋๋ฌธ์, ๋ฐ๋ก ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํฉ๋๋ค. popstate ์ด๋ฒคํธ๋ฅผ ํตํด ๋ค๋ก๊ฐ๊ธฐ์ ๋ฐ์์ ๊ฐ์งํ ์ ์์ต๋๋ค.
๋ค๋ก๊ฐ๊ธฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด, window.location.pathname
์ ์ฌ์ฉํด ๋ณ๊ฒฝ๋ url์ ๋ฐ์์ต๋๋ค. ํด๋น url๋ก changeUrl
ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
โจ ์ ์ฒด ์ฝ๋
์ด๋ ๊ฒ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก SPA๋ฅผ ๊ตฌํํด๋ดค์ต๋๋ค! ํ์ฌ๋ ํธ์์ main.js
๋ด์ ๋ชจ๋ ์ฝ๋๋ฅผ ์์ฑ ํ์ง๋ง, ์ถํ์๋ ๋ผ์ฐํ
๊ธฐ๋ฅ์ ํด๋นํ๋ ์ฝ๋๋ค์ ๋ณ๋์ ํ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๋ฐ๋์งํด ๋ณด์
๋๋ค. ๋ window ๊ฐ์ฒด๊ฐ ์๋ ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ์ด๋ฒคํธ๋ฆฌ์ค๋๋ฅผ ๋ถ์ฐฉํ๋ ๊ฒ์ด ์ข ๋ ๋ฐ๋์งํ์ง ์์๊น ์ถ๋ค์:) ์ด ๊ธ์ด ๋์์ด ๋์
จ๊ธธ ๋ฐ๋๋๋ค!
'Vanilla JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โDOM์ ์ง์ ์กฐ์ํ๋คโ ์ ์๋ฏธ์ ์ปดํฌ๋ํธ์ ๋ณธ์ง (0) | 2022.10.08 |
---|---|
๊ฐ์ฒด ํ๋กํผํฐ์ ์ ๊ทผํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฐจ์ด์ (0) | 2022.09.11 |
this ํค์๋ (0) | 2022.08.19 |
๋ด ์ฝ๋๊ฐ ์ฐ์ํ์ง ์์ ์ด์ (0) | 2022.08.17 |
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ ํจ์๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ ๋ ๊ฐ์ง (0) | 2022.08.17 |